precursor 0.2.3

Pre-protocol payload tagging, similarity clustering, and packet/firmware triage CLI.
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Precursor | Pre-Protocol Similarity Triage</title>
  <meta name="description"
    content="Precursor turns raw packets, logs, and binary blobs into labels, similarity clusters, and analyst-ready triage output." />
  <link rel="preconnect" href="https://fonts.googleapis.com" />
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  <link
    href="https://fonts.googleapis.com/css2?family=Sora:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;600&display=swap"
    rel="stylesheet" />
  <link rel="icon" type="image/svg+xml" href="favicon.svg" />
  <link rel="stylesheet" href="styles.css" />
  <!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "e26f679adf2e457baf5617c0fd4b466a"}'></script><!-- End Cloudflare Web Analytics -->
</head>

<body>
  <div class="ambient" aria-hidden="true"></div>
  <header class="topbar">
    <a class="brand" href="#top" aria-label="Precursor home">
      <img src="precursor-mark.svg" alt="Precursor logo" width="44" height="44" />
      <span>
        <strong>Precursor</strong>
        <small>pre-protocol payload triage</small>
      </span>
    </a>
    <nav>
      <a href="#scenarios">Scenarios</a>
      <a href="#analyst-loop">Analyst Loop</a>
      <a href="#llm-loop">LLM Demo</a>
      <a href="#install">Install</a>
    </nav>
  </header>

  <main id="top">
    <section class="hero">
      <div class="hero-copy">
        <p class="eyebrow">precursor.hashdb.io</p>
        <h1>Find structure in raw payloads before protocol parsers exist.</h1>
        <p>
          Precursor tags, clusters, and prioritizes packet, log, and firmware payloads with one JSON-first CLI.
          It is built for early-stage triage where you need signal now, not after parser engineering.
        </p>
        <div class="hero-actions">
          <a class="button primary" href="#install">Install Precursor</a>
          <a class="button" href="https://github.com/Obsecurus/precursor" target="_blank" rel="noreferrer">GitHub</a>
          <a class="button" href="#scenarios">Explore Demos</a>
        </div>
        <div class="hero-metrics" id="hero-metrics"></div>
      </div>
      <aside class="hero-terminal" aria-label="Precursor output teaser">
        <div class="terminal-head">
          <span>Signal Teaser</span>
          <button type="button" id="cycle-teaser">Next</button>
        </div>
        <pre><code id="teaser-code"></code></pre>
      </aside>
    </section>

    <section class="positioning" aria-labelledby="positioning-title">
      <div class="section-head">
        <h2 id="positioning-title">Why Teams Use It</h2>
        <p>
          Precursor is the bridge between "we have weird bytes" and "we can confidently scope response or build deeper detection."
        </p>
      </div>
      <div class="position-grid">
        <article>
          <h3>Security Ops</h3>
          <p>
            Collapse noisy probe traffic into families and rank suspicious payload clusters before writing full parser logic.
          </p>
        </article>
        <article>
          <h3>DFIR + Firmware</h3>
          <p>
            Tag binary fragments and filesystem magic quickly so analysts can prioritize which artifacts deserve deeper reverse engineering.
          </p>
        </article>
        <article>
          <h3>Detection Engineering</h3>
          <p>
            Start with Sigma/PCRE labeling, then use similarity + stats to refine into stable, explainable signal.
          </p>
        </article>
      </div>
    </section>

    <section class="flow" aria-labelledby="flow-title">
      <div class="section-head">
        <h2 id="flow-title">Workflow at a Glance</h2>
      </div>
      <ol class="flow-steps">
        <li>
          <strong>Ingest</strong>
          <span>String, base64, hex, or raw binary blobs from stdin or folders.</span>
        </li>
        <li>
          <strong>Label</strong>
          <span>Named PCRE captures (or Sigma selectors) become portable tags.</span>
        </li>
        <li>
          <strong>Cluster</strong>
          <span>TLSH, LZJD, FBHash (optional MRSHv2 adapter) group near-neighbor payloads.</span>
        </li>
        <li>
          <strong>Refine</strong>
          <span>`--stats` and protocol hints feed analyst/LLM refinement loops.</span>
        </li>
      </ol>
    </section>

    <section id="scenarios" class="scenarios" aria-labelledby="scenario-title-heading">
      <div class="section-head">
        <h2 id="scenario-title-heading">Interactive Scenario Explorer</h2>
        <p>
          Click a scenario to inspect command, real output, and run stats captured from public sample corpora.
        </p>
      </div>
      <div class="scenario-layout">
        <aside id="scenario-list" class="scenario-list" aria-label="Scenario list"></aside>
        <article class="scenario-view">
          <h3 id="scenario-name"></h3>
          <p id="scenario-description"></p>
          <div id="scenario-meta" class="meta"></div>

          <div id="scenario-tabs" class="tabs" role="tablist" aria-label="Scenario output tabs"></div>

          <div class="terminal">
            <div class="terminal-head">
              <span id="scenario-panel-label"></span>
              <button id="copy-command" type="button">Copy Command</button>
            </div>
            <pre><code id="scenario-panel"></code></pre>
          </div>

          <p id="scenario-links" class="data-links"></p>
        </article>
      </div>
    </section>

    <section id="analyst-loop" class="loop" aria-labelledby="loop-title-heading">
      <div class="section-head">
        <h2 id="loop-title-heading">Analyst Refinement Loop</h2>
        <p>
          This visual shows how adding targeted tags changes measurable signal across iterations, not just intuition.
        </p>
      </div>
      <div class="loop-layout">
        <div id="loop-steps" class="loop-steps" aria-label="Loop steps"></div>
        <article class="loop-detail">
          <h3 id="loop-step-title"></h3>
          <p id="loop-step-summary"></p>
          <div id="loop-bars" class="loop-bars" aria-label="Loop metric bars"></div>
          <div class="terminal compact">
            <div class="terminal-head">
              <span>Step Stats JSON (excerpt)</span>
            </div>
            <pre><code id="loop-json"></code></pre>
          </div>
        </article>
      </div>
    </section>

    <section id="llm-loop" class="llm" aria-labelledby="llm-title">
      <div class="section-head">
        <h2 id="llm-title">LLM-Guided Discovery Demo</h2>
        <p>
          Local Codex CLI consumed Precursor stats + sample NDJSON, proposed a new pattern, then we validated the command on the same corpus.
        </p>
      </div>
      <div class="llm-grid">
        <article class="llm-card">
          <h3>Codex Suggestion</h3>
          <p id="llm-why"></p>
          <ul id="llm-refinements"></ul>
          <div class="terminal compact">
            <div class="terminal-head">
              <span>Suggested Pattern</span>
            </div>
            <pre><code id="llm-pattern"></code></pre>
          </div>
          <div class="terminal compact">
            <div class="terminal-head">
              <span>Suggested Command</span>
            </div>
            <pre><code id="llm-command"></code></pre>
          </div>
        </article>

        <article class="llm-card">
          <h3>Measured Outcome</h3>
          <div id="llm-deltas" class="delta-grid"></div>
          <p class="risk"><strong>Risk:</strong> <span id="llm-risk"></span></p>
          <div class="terminal compact">
            <div class="terminal-head">
              <span>Runtime Note</span>
            </div>
            <pre><code id="llm-runtime"></code></pre>
          </div>
        </article>
      </div>
    </section>

    <section class="stats-guide" aria-labelledby="stats-guide-title">
      <div class="section-head">
        <h2 id="stats-guide-title">How to Read <code>--stats</code></h2>
      </div>
      <div class="position-grid">
        <article>
          <h3>Input</h3>
          <p>
            Track payload volume and size distribution so performance regressions or capture shifts are obvious.
          </p>
        </article>
        <article>
          <h3>Match</h3>
          <p>
            See which tags dominate and whether new patterns add precision or just noise.
          </p>
        </article>
        <article>
          <h3>Compare + Environment</h3>
          <p>
            Validate similarity mode, distance behavior, and runtime context when sharing findings or benchmarking.
          </p>
        </article>
      </div>
    </section>

    <section id="install" class="install" aria-labelledby="install-title">
      <div class="section-head">
        <h2 id="install-title">Install and Run in Under 60 Seconds</h2>
      </div>
      <div class="terminal">
        <div class="terminal-head">
          <span>Quick Start</span>
          <button id="copy-install" type="button">Copy</button>
        </div>
        <pre><code id="install-command">cargo install precursor
cat samples/scenarios/pre-protocol-packet-triage/payloads.b64 \
  | precursor -p samples/scenarios/pre-protocol-packet-triage/patterns.pcre \
      -m base64 -t -d --similarity-mode lzjd -P --protocol-hints --stats</code></pre>
      </div>
      <div class="hero-actions">
        <a class="button primary" href="https://github.com/Obsecurus/precursor" target="_blank" rel="noreferrer">Download on GitHub</a>
        <a class="button" href="https://crates.io/crates/precursor" target="_blank" rel="noreferrer">Crates.io</a>
      </div>
      <p class="sources">
        Background inspiration and historical context:
        <a href="https://www.greynoise.io/blog/precursor-a-quantum-leap-in-arbitrary-payload-similarity-analysis" target="_blank" rel="noreferrer">blog post 1</a>
        and
        <a href="https://www.labs.greynoise.io/grimoire/2023-10-11-precursor/" target="_blank" rel="noreferrer">blog post 2</a>.
      </p>
    </section>
  </main>

  <footer>
    <p>Precursor is open source and built for practical payload triage workflows.</p>
  </footer>

  <script src="app.js"></script>
</body>

</html>