<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Security &amp; AI-Governance Audit Trail — Roam</title>
  <meta name="description" content="Roam's vulnerability disclosure policy, security posture, supply-chain controls, PGP key for encrypted reports, and safe-harbor commitments.">
  <link rel="canonical" href="https://roam-code.com/security">
  <link rel="icon" type="image/svg+xml" href="/favicon.svg">
  <meta name="theme-color" content="#0049b7">
  <meta name="apple-mobile-web-app-title" content="Roam">
  <link rel="apple-touch-icon" href="/favicon.svg">
  <link rel="manifest" href="/manifest.webmanifest">
  <link rel="preload" href="/fonts/space-grotesk-variable.woff2" as="font" type="font/woff2" crossorigin>
  <link rel="preconnect" href="//github.com" crossorigin>
  <link rel="preconnect" href="//pypi.org" crossorigin>
  <link rel="preload" href="./landing.css" as="style">
  <link rel="stylesheet" href="./landing.css">
  <meta name="robots" content="index,follow">
  <meta property="og:title" content="Security — Roam">
  <meta property="og:description" content="Vulnerability disclosure policy + security posture for roam-code.">
  <meta property="og:url" content="https://roam-code.com/security">
  <meta property="og:image" content="https://roam-code.com/og.png">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:image" content="https://roam-code.com/og.png">

  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "WebPage",
    "name": "Security",
    "url": "https://roam-code.com/security",
    "inLanguage": "en",
    "dateModified": "2026-06-12",
    "isPartOf": {"@type": "WebSite", "name": "Roam", "url": "https://roam-code.com/"},
    "publisher": {"@type": "Organization", "name": "Cranot", "url": "https://github.com/Cranot"},
    "breadcrumb": {
      "@type": "BreadcrumbList",
      "itemListElement": [
        {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://roam-code.com/"},
        {"@type": "ListItem", "position": 2, "name": "Security", "item": "https://roam-code.com/security"}
      ]
    }
  }
  </script>
</head>
<body>

  <a class="skip-link" href="#main">Skip to content</a>

  <nav class="site-nav" aria-label="Main navigation">
    <div class="nav-inner">
      <a href="/" class="site-logo">roam<span class="logo-dot">.</span></a>
      <input type="checkbox" id="nav-toggle" class="nav-toggle-checkbox" aria-label="Toggle navigation menu">
      <label for="nav-toggle" class="nav-toggle-label">
        <span class="nav-burger" aria-hidden="true"></span>
        <span class="visually-hidden">Menu</span>
      </label>
      <ul class="nav-links">
        <li><a href="/">Home</a></li>
        <li><a href="/pricing">Pricing</a></li>
        <li><a href="/compare">Compare</a></li>
        <li><a href="/setup">Setup</a></li>
        <li><a href="/docs/">Docs</a></li>
        <li><a href="https://github.com/Cranot/roam-code">GitHub</a></li>
      </ul>
    </div>
  </nav>

  <main id="main" class="legal-page">
    <header class="legal-header">
      <h1>Security &amp; AI-Governance Audit Trail</h1>
      <p class="legal-meta">Last updated: <time datetime="2026-06-12">2026-06-12</time></p>
    </header>

    <article>
      <p>
        This page documents how to report vulnerabilities, what's in
        scope, our response commitment, and the security posture of the
        products we ship. The operational companion to the
        <a href="/trust">trust &amp; compliance posture page</a> — that
        page covers framework status (SOC 2 / ISO 42001 / EU AI Act
        Article 12 / NIST AI RMF) and the procurement artifact set; this
        page covers vulnerability disclosure, supply-chain integrity,
        and the secure-defaults of the products we ship.
      </p>

      <h2>Reporting a vulnerability</h2>
      <p>
        Email <a href="mailto:security@roam-code.com">security@roam-code.com</a>
        with details. Please include:
      </p>
      <ul>
        <li>A clear description of the issue and how to reproduce it</li>
        <li>The affected URL, command, or code path</li>
        <li>Your assessment of impact (data exposure, availability, etc.)</li>
        <li>Optional: a proof-of-concept</li>
      </ul>
      <p>
        Acknowledgement within <strong>one business day</strong> (Athens,
        Greece time), with a substantive triage response within
        <strong>two business days</strong>. For high-severity issues we
        engage immediately on receipt. (These SLAs match the
        procurement-facing commitment on the
        <a href="/trust#artifacts">trust page security-contact row</a>.)
      </p>

      <h2>Safe-harbour commitment</h2>
      <p>
        We will not pursue legal action against good-faith security
        research that:
      </p>
      <ul>
        <li>Avoids accessing, modifying, or destroying customer data</li>
        <li>Doesn't degrade service availability for other users</li>
        <li>Stops at proof-of-concept (no exfiltration, no ransom, no public disclosure before fix)</li>
        <li>Gives us a reasonable window to remediate (default 90 days; extendable on request)</li>
      </ul>

      <h2>In scope</h2>
      <ul>
        <li><code>roam-code.com</code> and all sub-paths/sub-domains we control</li>
        <li>The <code>roam-code</code> Python package on PyPI and any binary releases</li>
        <li>The <code>Cranot/roam-code</code> GitHub repository (source + workflows)</li>
        <li>The MCP server (<code>roam mcp</code>) and its tool surface</li>
        <li>Anything reachable from <code>/docs/</code></li>
      </ul>

      <h2>Out of scope</h2>
      <ul>
        <li>Findings on third-party services (Cloudflare, GitHub, PyPI) — please report to those vendors directly</li>
        <li>Self-hosted installations of customer code that include Roam — those are the customer's responsibility</li>
        <li>Non-security bugs (e.g. UI glitches, broken links) — open a regular GitHub issue instead</li>
      </ul>

      <h2 id="hall-of-thanks">Hall of thanks</h2>
      <p>
        We acknowledge security researchers who report responsibly.
        Once we have a name to credit, it goes here. Send us how you'd
        like to be credited (full name, handle, or anonymous).
      </p>
      <p><em>No reports yet — be the first.</em></p>
      <p class="note">
        Roam does not run a monetary bug-bounty program yet. Until a
        paid program is announced, responsible reports receive public
        acknowledgement in this hall plus, on request, a written reference
        confirming the report and remediation outcome. Same stance is cited
        from the
        <a href="/trust#artifacts">trust page vulnerability-disclosure
        row</a>.
      </p>

      <h2>Security posture</h2>

      <h3>The CLI runs locally</h3>
      <p>
        The <code>roam-code</code> CLI is
        <strong>100% local, no API key, no vendor cloud endpoint</strong>.
        It writes a SQLite file in your repo's <code>.roam/</code>
        directory. No network calls. No telemetry. No phone-home. No
        model-training upload. No inbound network listener. This same
        local-only stance is contractually committed in
        <a href="https://github.com/Cranot/roam-code/blob/main/templates/legal/dpa.md#6-security-measures">DPA §6
        (Security measures)</a>.
        The engine is
        <a href="https://github.com/Cranot/roam-code/blob/main/LICENSE">Apache 2.0</a>;
        audit the source on
        <a href="https://github.com/Cranot/roam-code">GitHub</a> and
        rebuild every release from the tagged commit.
      </p>

      <h3 id="supply-chain">Supply-chain integrity</h3>
      <ul>
        <li>PyPI releases use OIDC <strong>Trusted Publishing</strong> (no long-lived API tokens) — see <a href="https://github.com/Cranot/roam-code/blob/main/.github/workflows/publish.yml"><code>.github/workflows/publish.yml</code></a></li>
        <li>Each release is built reproducibly from a tagged commit</li>
        <li>Sigstore attestations are produced by the publish workflow (verifiable provenance)</li>
        <li>CycloneDX SBOM emitted on every release as a separate artifact (audit-grade dependency manifest)</li>
        <li>The repo enables Dependabot security updates + secret scanning + push-protection</li>
      </ul>
      <p class="note">
        For context on why this matters: in August 2025 a hosted code-review
        vendor was compromised through a CI/CD path —
        <a href="https://kudelskisecurity.com/research/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories">researchers
        achieved RCE plus write access to roughly one million repositories</a>
        (<a class="archive-link" href="https://web.archive.org/web/20260507124707/https://kudelskisecurity.com/research/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories" rel="external" aria-label="Wayback Machine archive">archive</a>).
        Roam's CLI is open source and runs entirely on your machine — that
        GitHub-App token-leak class does not apply to the local CLI. The Sigstore + SBOM chain
        above lets you verify the wheel you install matches the tagged
        commit you can read.
      </p>

      <h4>Verify a release yourself</h4>
      <p>
        After installing from PyPI, you can confirm provenance with the
        Sigstore client. The wheel and its attestation are both fetched
        from the publish workflow's GitHub OIDC chain — no per-release
        keys to manage.
      </p>
      <pre class="terminal" aria-label="Sigstore verification commands"><span class="t-prompt">$</span> <span class="t-cmd">pip install sigstore</span>
<span class="t-prompt">$</span> <span class="t-cmd">pip download roam-code --no-deps -d /tmp/roam</span>
<span class="t-prompt">$</span> <span class="t-cmd">sigstore verify github \
    --cert-identity-regexp 'https://github.com/Cranot/roam-code/.github/workflows/publish.yml@.*' \
    --bundle /tmp/roam/roam_code-*.whl.publish.attestation \
    /tmp/roam/roam_code-*.whl</span></pre>
      <p>
        SBOM (CycloneDX) and the workflow's GitHub Attestations view are
        linked from each <a href="https://github.com/Cranot/roam-code/releases">GitHub release</a>.
      </p>

      <h3>Audit-trail evidence</h3>
      <p>
        Roam itself emits in-toto v1 attestation statements and an
        HMAC-chained run ledger on every analysis. Run
        <code>roam runs verify</code> to confirm the ledger chain and
        <code>roam cga verify STATEMENT.json</code> to confirm the
        in-toto predicate before consuming the artefact in CI.
        Optional cosign signing of bundles is
        <em>[TBD: cosign keyless signing of CGA bundles — currently
        wired for PyPI release SBOMs (see Supply-chain integrity
        above); same-pipeline extension to per-run bundles is
        roadmapped]</em>.
      </p>

      <h3>Hosted services posture</h3>
      <ul>
        <li><strong>roam-code.com</strong> — static site on Cloudflare Pages. Strict CSP, HSTS preload, COOP+CORP, Permissions-Policy, X-Frame-Options DENY. No JavaScript except Cloudflare's email-obfuscation helper. No third-party analytics.</li>
        <li><strong>Roam Cloud</strong> (when launched) — metrics-only ingestion. Source code is never uploaded.</li>
        <li><strong>Roam Review</strong> (when launched) — PR diffs are processed ephemerally in our cloud. Private-deployment pilots are scoped by SOW when hosted processing is blocked by policy. Diffs discarded after analysis. Audit-trail metadata retained per the Privacy Policy.</li>
      </ul>

      <h2>Disclosure timing</h2>
      <p>
        We aim to remediate high-severity issues within 30 days, medium
        within 90 days, low at our next scheduled release. We'll
        coordinate any public disclosure with the reporter. Default
        public-disclosure window is 90 days from initial report; we may
        extend on request when more time is genuinely needed.
      </p>

      <h2>PGP / encrypted reports</h2>
      <p>
        Both <code>hello@roam-code.com</code> and <code>security@roam-code.com</code>
        have OpenPGP keys auto-published by Proton. Look them up via:
      </p>
      <ul>
        <li>Proton public key server:
          <code>https://api.protonmail.ch/pks/lookup?op=get&amp;search=security@roam-code.com</code>
        </li>
        <li>Or send any email and Proton attaches the public key in headers
          (<code>Autocrypt</code> standard).</li>
      </ul>
      <p>
        Once you have the key, encrypt your report with PGP and send to
        <a href="mailto:security@roam-code.com">security@roam-code.com</a>.
        We'll decrypt and respond from the same address with the same key.
      </p>
      <p>
        For the most current contact info, see our
        <a href="/.well-known/security.txt">security.txt</a> — it lists
        the encryption-key URL too.
      </p>

      <h2>Compliance posture</h2>
      <p>
        Evidence support, not certification. Roam <em>maps to</em> and
        <em>supports evidence for</em> the controls below; it does not
        certify, attest, or make a customer compliant. No current
        independent attestation against any of these frameworks. See the
        <a href="/trust">trust &amp; compliance posture page</a> for
        framework-by-framework status and roadmap candor.
      </p>
      <ul>
        <li><strong>SOC 2 CC8.1 (change management)</strong> — Roam's tamper-evident audit-trail and proof bundles map to the change-management control; they supply evidence inputs an auditor would draw from, not the attestation itself.</li>
        <li><strong>ISO/IEC 42001 (AI management system)</strong> — the AI management system standard published April 2024. Roam's structural-review records and in-toto attestations support clauses on documentation, monitoring, and operational controls for AI-generated artefacts.</li>
        <li><strong>Internal AI-governance policies</strong> — most Series B-C companies are now writing internal policies covering AI-assisted code; Roam supplies the per-PR evidence those policies need to be auditable.</li>
        <li><strong>EU AI Act</strong> — Article 12 (record-keeping) attaches only to providers of high-risk AI systems listed in Annex III. Code-generation tooling is not in Annex III, so most teams using Cursor/Claude Code/Codex have no direct Article 12 obligation. If your <em>own product</em> is a high-risk AI system (HR-tech, edtech, fintech credit-scoring, healthtech), Roam's review attestations are circumstantial evidence for the human-oversight obligation in Article 14 — not Article 12 logs themselves. Talk to your DPO or counsel.</li>
        <li><strong>GDPR</strong> — see <a href="/privacy">Privacy Policy</a> for data-processing details + sub-processors, and <a href="https://github.com/Cranot/roam-code/blob/main/templates/legal/dpa.md">templates/legal/dpa.md</a> for the Article 28 processor agreement.</li>
        <li><strong>SOC 2 / ISO/IEC 42001 / ISO 27001</strong> — control mappings exist as evidence-support templates; standalone certification and packaged Self-Hosted controls are roadmapped, with no current independent attestation. See <a href="/trust#today">trust page framework status</a> for current roadmap candor.</li>
      </ul>

      <p>
        Procurement-trio companions: the
        <a href="/trust">trust &amp; compliance posture page</a> covers
        framework status and the procurement artifact set; the
        <a href="/privacy">privacy policy</a> covers data processing,
        retention, and sub-processors; this page is the operational
        security companion. The DPA, NDA template, security procurement
        packet, and master SOW are all public at
        <a href="https://github.com/Cranot/roam-code/tree/main/templates/legal">templates/legal/</a>.
      </p>

      <p class="legal-foot">
        Questions about this policy? <a href="mailto:security@roam-code.com">security@roam-code.com</a>.
      </p>
    </article>

  <section class="page-cta-strip">
    <div class="page-cta-inner">
      <p>Ready to try Roam? <a href="/" class="btn-primary">Install the free CLI</a> · or <a href="/pricing">see paid plans</a></p>
    </div>
  </section>
  </main>

  <footer>
    <div class="footer-inner">
      <div class="footer-col">
        <strong>Roam</strong>
        <span>The local codebase intelligence layer for AI agents and the teams that run them.</span>
        <span class="footer-meta">Built in Athens. Made in the EU.</span>
      </div>
      <div class="footer-col">
        <a href="https://github.com/Cranot/roam-code">GitHub</a>
        <a href="https://pypi.org/project/roam-code/">PyPI</a>
        <a href="/docs/">Docs</a>
      </div>
      <div class="footer-col">
        <a href="/setup">Setup</a>
        <a href="/about">About</a>
        <a href="/press">Press</a>
        <a href="/changelog">Changelog</a>
        <a href="/status">Status</a>
        <a href="/security">Security</a>
        <a href="/accessibility">Accessibility</a>
      </div>
      <div class="footer-col">
        <a href="/privacy">Privacy</a>
        <a href="/terms">Terms</a>
        <a href="/refund">Refund</a>
        <a href="/no-cookies">No cookies</a>
      </div>
      <div class="footer-col">
        <a href="mailto:hello@roam-code.com">hello@roam-code.com</a>
        <a href="mailto:security@roam-code.com">security@roam-code.com</a>
        <span class="footer-meta">No cookies. No tracking. No analytics.</span>
        <span class="footer-meta"><a href="https://github.com/Cranot/roam-code/tree/main/templates/distribution/landing-page">This page is open source</a></span>
      </div>
    </div>
  </footer>

</body>
</html>
