Findings you can share and still control
Every generic answer to "how do I share an HTML report" ends in put it on a static host. For a security team that answer is disqualifying. The report names unpatched hosts, live CVEs, credential locations and, often, the exact request that worked. It is the one document where a public URL is not a convenience — it's the finding.
So the requirement isn't distribution. It's distribution with a floor under it.
Private is the default, not a setting you remember
Reports created through the API start private. That ordering matters more
than any individual control: a nightly scan that publishes at 3am cannot
expose anything, because nothing is reachable until a human decides it should
be.
From there, access widens in named steps — invited individuals, team visibility, or domain-gated viewing that checks the reader's verified email domain server-side rather than trusting a forwarded link. Five visibility levels and per-person roles are documented in sharing & access control.
Scope the token that publishes
A scanner in CI needs to publish. It does not need to change who can read. Those are different scopes:
reports:write— create and revise reports.sharing— change visibility and link permission.
Give the pipeline the first and not the second, and a compromised CI token cannot turn a pentest report public. Tokens are revocable, expirable and rate-limited per token — see API tokens and scoped tokens for AI agents.
The tools you're already running
Trivy · Semgrep · Snyk · SARIF · ZAP · Burp Suite · Nmap · Nikto · OpenVAS · Grype · OSV-Scanner · Bandit · Brakeman · Gitleaks · TruffleHog · Checkov · KICS · Kubescape · Prowler · ScoutSuite · InSpec · testssl.sh · Dependency-Check · npm audit · SBOM · pentest reports.
Interactive findings tables keep working — severity filters, expandable evidence, links between findings — because scripts run in a sandboxed iframe rather than being stripped.
Retest at the same address
Remediation is a loop, and the loop needs one URL. Publish the original assessment, then publish the retest as a revision of the same report. The Jira ticket keeps its link; the history answers "what closed, and when" without diffing two PDFs.
When a developer disputes a finding, they dispute it on the finding — an anchored comment on that row, not an email that says "the third one is a false positive." See commenting on HTML.
When even the server shouldn't read it
Zero-knowledge encrypted reports encrypt in the browser with a key derived from your passphrase; the server stores ciphertext only. The tradeoff is explicit and unavoidable: an encrypted report can't be link-shared, scheduled, or delivered to team destinations, because the server genuinely cannot read it. Use it for the material where that's the right trade. See Security.
Worth knowing
- Enterprise controls: audit log, IP allowlist, SSO/SAML with SCIM, password-protected and expiring links, DPA, on-prem deployment.
- Redact before publishing, not after. A scan report often embeds request and response bodies. Whatever your scanner's redaction flag is, set it — the hosting layer cannot know which header was a session token.
- Limits. Entry HTML 5 MB; assets 25 MB per file, 250 MB and 500 files per report. Large scan outputs usually exceed the file count as per-finding JSON; use the scanner's merged HTML export.
Try it
Comma is free — unlimited reports, unlimited commenters, unlimited revision history. Private by default.
Start free → · Read the security model →