> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plannotator.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Plannotator Open Source Security

> How Plannotator OSS keeps review data local, protects release artifacts, runs automated security checks, and accepts private vulnerability reports.

Plannotator OSS runs on your computer by default. It does not collect usage telemetry or analytics, and an ordinary local review does not upload your plan, document, diff, annotations, or feedback to Plannotator.

The project also publishes verifiable release artifacts and runs automated security checks against its source, dependencies, secrets, and GitHub configuration.

## Data and network boundaries

<CardGroup cols={2}>
  <Card title="Local by default" icon="laptop">
    A normal session uses a temporary HTTP server bound to `127.0.0.1`. Review content and local records stay on your computer.
  </Card>

  <Card title="No product telemetry" icon="signal-slash">
    Plannotator OSS does not send usage events or analytics when you open, annotate, approve, dismiss, or send feedback.
  </Card>

  <Card title="Remote access is optional" icon="mobile-screen-button">
    Remote mode changes the bind address and does not add authentication. Use a trusted path such as [Tailscale](/open-source/tailscale) or [SSH forwarding](/open-source/remote-access).
  </Card>

  <Card title="Outbound features are explicit" icon="arrow-up-right-from-square">
    URL annotation, hosted pull requests, AI providers, sharing, and Workspaces can contact another service when you choose to use them.
  </Card>
</CardGroup>

Plannotator checks GitHub for the latest release when an app surface loads, and a local Git review can contact its configured `origin`. These requests do not include the reviewed content. See [Privacy and data flow](/open-source/reference/privacy-and-data-flow) for the complete list of automatic and optional network requests.

Set `PLANNOTATOR_SHARE=disabled` to hide OSS share and import actions. Set `PLANNOTATOR_AI=disabled` to remove AI-backed features and their provider routes. Ordinary local plan, document, and code review still work.

## Release integrity

For a release tag, the workflow builds and tests the artifacts, generates and scans the SBOM, attests the release, and then publishes it.

<CardGroup cols={3}>
  <Card title="GitHub Actions" icon="github" iconType="brands">
    Runs the public release workflow from a version tag on `main`.
  </Card>

  <Card title="Tests and smoke runs" icon="circle-check">
    Type-checks, tests, builds, and runs binaries and installers on Linux, macOS, and Windows.
  </Card>

  <Card title="SHA-256" icon="hashtag">
    Generates a matching checksum file for every release binary.
  </Card>

  <Card title="Sigstore" icon="https://mintcdn.com/plannotator/20xIwiS2P-A6E5Yx/images/security/sigstore.svg?fit=max&auto=format&n=20xIwiS2P-A6E5Yx&q=85&s=13266f32914facea4c251196fd8afc96" width="125" height="120" data-path="images/security/sigstore.svg">
    Creates GitHub attestations for build provenance and the release SBOM.
  </Card>

  <Card title="GitHub Releases" icon="tag">
    Publishes release assets only after tests, smoke runs, the Grype policy, and attestations complete.
  </Card>

  <Card title="npm trusted publishing" icon="npm" iconType="brands" color="#CB3837">
    Publishes prebuilt package tarballs from a separate OIDC-authorized job with npm provenance.
  </Card>
</CardGroup>

The workflow uses Syft to generate a CycloneDX SBOM. Grype must pass the release policy before the workflow creates the attestations.

Release tags must point to a commit on `main` and match the version in the release manifests. The GitHub Release is published only after the attestations exist.

[`v0.27.3`](https://github.com/backnotprop/plannotator/releases/tag/v0.27.3) was the first release to complete this pipeline. It published a CycloneDX 1.6 SBOM and a matching checksum. Its binaries have SLSA provenance and CycloneDX SBOM attestations.

The SBOM describes the release-wide inventory of locked inputs and dependencies. Bun standalone binaries do not expose their bundled JavaScript package metadata to Syft. The SBOM is not an exact runtime inventory for each binary.

Use [Pin or verify a release](/open-source/start/installation#pin-or-verify-a-release) to verify installer provenance or download and verify the SBOM evidence.

## Automated security checks

On every pull request to `main` and every push to `main`, the [Security Scanning workflow](https://github.com/backnotprop/plannotator/actions/workflows/security.yml) runs Gitleaks, zizmor, Semgrep, and Trivy. A weekly scheduled run checks for drift. Trusted runs upload SARIF results to GitHub Code Scanning.

<CardGroup cols={3}>
  <Card title="GitHub secret scanning" icon="github" iconType="brands">
    Detects known secret formats. Push protection stops matched credentials before they land.
  </Card>

  <Card title="Dependabot" icon="robot">
    Monitors dependencies, opens security updates, and runs routine Bun update checks each week.
  </Card>

  <Card title="Gitleaks" icon="key">
    Checks pull-request and push commit ranges for secrets, with scheduled full-history scans.
  </Card>

  <Card title="zizmor" icon="code-branch">
    Audits GitHub Actions workflows, local actions, and Dependabot configuration offline.
  </Card>

  <Card title="Semgrep CE" icon="https://mintcdn.com/plannotator/20xIwiS2P-A6E5Yx/images/security/semgrep.svg?fit=max&auto=format&n=20xIwiS2P-A6E5Yx&q=85&s=62150854956c32e133c900817a610914" width="512" height="512" data-path="images/security/semgrep.svg">
    Runs repository-owned source rules offline with no Semgrep Cloud upload.
  </Card>

  <Card title="Trivy" icon="https://mintcdn.com/plannotator/20xIwiS2P-A6E5Yx/images/security/trivy.svg?fit=max&auto=format&n=20xIwiS2P-A6E5Yx&q=85&s=4125a376504ac9629f679b33e334edd3" width="28" height="28" data-path="images/security/trivy.svg">
    Checks committed dependency locks and filesystem or infrastructure configuration against pinned scanner and policy versions.
  </Card>
</CardGroup>

<Card title="OWASP ZAP DAST" icon="https://mintcdn.com/plannotator/20xIwiS2P-A6E5Yx/images/security/zap.svg?fit=max&auto=format&n=20xIwiS2P-A6E5Yx&q=85&s=5c801f7aa793da32aac8bdcbc152f949" width="85" height="85" data-path="images/security/zap.svg">
  OWASP ZAP runs a passive baseline each week. A maintainer can also start the workflow manually. The workflow uses a disposable annotate session on an internal-only Docker network. A read-only guard rejects state-changing requests and unapproved paths.
</Card>

The Security Scanning and ZAP DAST workflows are in monitor mode. Tool and evidence failures fail their jobs. Findings appear in GitHub Code Scanning or retained workflow artifacts, but they do not block a merge or release.

## Report a vulnerability privately

Do not open a public issue for a suspected vulnerability.

<Card title="Open a private vulnerability report" icon="shield-check" href="https://github.com/backnotprop/plannotator/security/advisories/new" cta="Report privately" arrow="true">
  Send the affected version, reproduction steps, impact, required preconditions, and any known workaround through GitHub's private reporting form.
</Card>

Security fixes are provided for the latest released version. See the repository [security policy](https://github.com/backnotprop/plannotator/blob/main/SECURITY.md) for the supported-version and disclosure policy.

## Evidence and limitations

* [Latest release artifacts and checksums](https://github.com/backnotprop/plannotator/releases/latest)
* [First SBOM-enabled release: v0.27.3](https://github.com/backnotprop/plannotator/releases/tag/v0.27.3)
* [Release attestations](https://github.com/backnotprop/plannotator/attestations)
* [Release and security workflow source](https://github.com/backnotprop/plannotator/tree/main/.github/workflows)
* [ZAP DAST workflow and run history](https://github.com/backnotprop/plannotator/actions/workflows/dast.yml)
* [GitHub Actions history](https://github.com/backnotprop/plannotator/actions)
* [OSS privacy and data flow](/open-source/reference/privacy-and-data-flow)

Automated checks reduce risk; they do not prove that the software has no vulnerabilities. Plannotator does not claim SOC 2, ISO 27001, or another security certification for the OSS project. The support policy covers the latest release, and this page does not describe the hosted Workspaces product.

## Appendix: security pipeline

These diagrams show when each security control runs and how its evidence moves through the project.

### Release trust chain

A release tag generates the SBOM and runs the Grype policy before the workflow creates attestations and publishes the release.

<Frame>
  <img className="block dark:hidden w-full h-auto" src="https://mintcdn.com/plannotator/jhm3_qWvaihvrkIS/images/security/release-trust-chain-light.svg?fit=max&auto=format&n=jhm3_qWvaihvrkIS&q=85&s=d2e7a65be36eb0af97676c9daf763568" alt="A vertical release trust chain shows a version tag building artifacts, generating a Syft SBOM, passing a Grype scan, creating Sigstore attestations, publishing, and user verification." width="800" height="412" data-path="images/security/release-trust-chain-light.svg" />

  <img className="hidden dark:block w-full h-auto" src="https://mintcdn.com/plannotator/jhm3_qWvaihvrkIS/images/security/release-trust-chain-dark.svg?fit=max&auto=format&n=jhm3_qWvaihvrkIS&q=85&s=a8a456e5a45788c3a0af2693fdaa6c0b" alt="A vertical release trust chain shows a version tag building artifacts, generating a Syft SBOM, passing a Grype scan, creating Sigstore attestations, publishing, and user verification." width="800" height="412" data-path="images/security/release-trust-chain-dark.svg" />
</Frame>

### Security on every code change

The build and security workflows start from the same pull request or push. The security scanners run independently from the build workflow.

<Frame>
  <img className="block dark:hidden w-full h-auto" src="https://mintcdn.com/plannotator/jhm3_qWvaihvrkIS/images/security/security-every-code-change-light.svg?fit=max&auto=format&n=jhm3_qWvaihvrkIS&q=85&s=200b0b3dfc4bf78fe07f17dad2ac65d1" alt="A pull request or push starts build tests and four security scans: Gitleaks for secrets, Semgrep for source code, Trivy for dependencies, and zizmor for workflows. Findings upload to GitHub Code Scanning." width="800" height="464" data-path="images/security/security-every-code-change-light.svg" />

  <img className="hidden dark:block w-full h-auto" src="https://mintcdn.com/plannotator/jhm3_qWvaihvrkIS/images/security/security-every-code-change-dark.svg?fit=max&auto=format&n=jhm3_qWvaihvrkIS&q=85&s=ce39d261724d340da801bbfbb2d4c871" alt="A pull request or push starts build tests and four security scans: Gitleaks for secrets, Semgrep for source code, Trivy for dependencies, and zizmor for workflows. Findings upload to GitHub Code Scanning." width="800" height="464" data-path="images/security/security-every-code-change-dark.svg" />
</Frame>

### Scheduled security testing

The weekly workflows scan the repository and a disposable application instance. The ZAP workflow scans only the disposable instance inside an isolated CI network.

<Frame>
  <img className="block dark:hidden w-full h-auto" src="https://mintcdn.com/plannotator/jhm3_qWvaihvrkIS/images/security/scheduled-security-testing-light.svg?fit=max&auto=format&n=jhm3_qWvaihvrkIS&q=85&s=11b68f895dd1326c78b5a247d7b98767" alt="Weekly security testing runs a full repository scan and an OWASP ZAP passive scan against a disposable application inside an isolated CI network, then retains the reports." width="800" height="356" data-path="images/security/scheduled-security-testing-light.svg" />

  <img className="hidden dark:block w-full h-auto" src="https://mintcdn.com/plannotator/jhm3_qWvaihvrkIS/images/security/scheduled-security-testing-dark.svg?fit=max&auto=format&n=jhm3_qWvaihvrkIS&q=85&s=03f644a330689a67060e49f759b9fca5" alt="Weekly security testing runs a full repository scan and an OWASP ZAP passive scan against a disposable application inside an isolated CI network, then retains the reports." width="800" height="356" data-path="images/security/scheduled-security-testing-dark.svg" />
</Frame>

Last verified on August 13, 2026, using Plannotator product commit `aa0bf86`. Maintained by the Plannotator project.
