audit-labs/audit-labs.dev

The website for Audit Labs.

clone: git clone https://gitbay.org/audit-labs/audit-labs.dev.git

40d7a1dd2d91906342ead1e02cae522ccbac1dde

verified · cmc

author: Christian Cleberg <hello@cleberg.net> · 2026-08-07T01:37:05Z

Add control-coverage, ecosystem hero diagram, and toolchain repositioning

Site now presents the full six-tool ecosystem rather than just tools + tutorials.

- New product page: control-coverage/ (matches the sibling page template)
- Home hero: replace the terminal with an ecosystem pipeline diagram
  (collect → seal → report → measure), inline SVG icons, evidence-seal branch,
  control-coverage as the flagship node with output chips
- Home copy: reposition as an "audit evidence toolchain"; rewrite hero
  description and meta; buttons → "Explore the tools" (#repos) / "See tutorials";
  reorder repo cards into pipeline order with stage tags
  (Collect/Seal/Report/Measure/GitHub App/Learn); reframe the "toolbox" section
  as "Inside audit-tools"; NIST CSF → NIST 800-53
- Simplify nav to logo + GitHub button on every page
- Footers: drop per-repo links, keep Home + GitHub (org)
- CSS robustness: code snippets scroll instead of overflowing X; repo grid no
  longer overflows at 320px; smooth in-page scrolling (reduced-motion safe)
 assets/site.css             |  66 +++++++++++++++---
 audit-report/index.html     |   5 --
 control-coverage/index.html | 159 ++++++++++++++++++++++++++++++++++++++++++++
 evidence-seal/index.html    |   5 --
 gh-attest/index.html        |   5 --
 index.html                  | 152 +++++++++++++++++++++++++++---------------
 6 files changed, 315 insertions(+), 77 deletions(-)

diff --git a/assets/site.css b/assets/site.css
index a932e34..1222d23 100644
--- a/assets/site.css
+++ b/assets/site.css
@@ -37,11 +37,11 @@ body {
 
 /* ---------- NAV ---------- */
 nav { position: sticky; top: 0; z-index: 100; background: var(--warm-white); border-bottom: 1px solid var(--border); padding: 0 2rem; }
-.nav-inner { max-width: 1100px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; height: 60px; }
-.logo { font-family: 'IBM Plex Mono', monospace; font-weight: 700; font-size: 1.1rem; letter-spacing: -0.02em; color: var(--black); text-decoration: none; }
+.nav-inner { max-width: 1100px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; gap: 1.5rem; height: 60px; }
+.logo { font-family: 'IBM Plex Mono', monospace; font-weight: 700; font-size: 1.1rem; letter-spacing: -0.02em; color: var(--black); text-decoration: none; white-space: nowrap; flex-shrink: 0; }
 .logo span { color: var(--amber); }
-.nav-links { display: flex; gap: 2rem; align-items: center; list-style: none; }
-.nav-links a { font-family: 'IBM Plex Mono', monospace; font-size: 0.78rem; color: var(--gray-3); text-decoration: none; transition: color 0.15s; }
+.nav-links { display: flex; gap: 2rem; align-items: center; list-style: none; flex-shrink: 0; }
+.nav-links a { font-family: 'IBM Plex Mono', monospace; font-size: 0.78rem; color: var(--gray-3); text-decoration: none; white-space: nowrap; transition: color 0.15s; }
 .nav-links a:hover { color: var(--black); }
 .nav-links .btn-github { background: var(--black); color: var(--off-white); padding: 0.45rem 1rem; border-radius: 4px; font-size: 0.75rem; transition: background 0.15s; }
 .nav-links .btn-github:hover { background: var(--gray-2); color: var(--off-white); }
@@ -58,6 +58,9 @@ nav { position: sticky; top: 0; z-index: 100; background: var(--warm-white); bor
 
 .hero.split { padding: 5.5rem 2rem 4.5rem; }
 .hero.split .hero-inner { display: grid; grid-template-columns: 1fr 1fr; gap: 3.5rem; align-items: center; }
+/* Let grid tracks shrink below content width so a long code line scrolls inside
+   its box instead of widening the track and overflowing the page. */
+.hero.split .hero-inner > * { min-width: 0; }
 @media (max-width: 820px) { .hero.split .hero-inner { grid-template-columns: 1fr; gap: 2.5rem; } }
 
 .hero-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.7rem; letter-spacing: 0.15em; text-transform: uppercase; color: var(--amber-light); margin-bottom: 1.5rem; display: flex; align-items: center; gap: 0.5rem; }
@@ -88,7 +91,7 @@ h1 em { font-style: italic; color: var(--amber-light); }
 .terminal-bar { background: #1a1a1a; border-bottom: 1px solid #2a2a2a; padding: 0.6rem 1rem; display: flex; gap: 0.4rem; align-items: center; }
 .dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; flex-shrink: 0; }
 .dot-red { background: #ff5f57; } .dot-yellow { background: #febc2e; } .dot-green { background: #28c840; }
-.terminal-body { padding: 1.25rem 1.5rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.82rem; line-height: 1.9; }
+.terminal-body { padding: 1.25rem 1.5rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.82rem; line-height: 1.9; overflow-x: auto; }
 .hero.split .terminal-body { padding: 1.2rem 1.4rem; font-size: 0.78rem; line-height: 1.95; }
 .t-prompt { color: #5a9060; } .t-cmd { color: #e8e0d0; } .t-comment { color: #555; }
 .t-out { color: #7a9f7a; } .t-path { color: #d4a862; } .t-dim { color: #444; }
@@ -108,7 +111,7 @@ h2 { font-family: 'DM Serif Display', serif; font-size: clamp(1.8rem, 3vw, 2.4re
 
 /* ---------- HOME: repos grid ---------- */
 .repos { background: var(--warm-white); }
-.repo-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem; }
+.repo-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr)); gap: 1.5rem; }
 .repo-card { background: #fff; border: 1px solid var(--border); border-radius: 8px; padding: 2rem; text-decoration: none; color: inherit; display: block; transition: border-color 0.15s, box-shadow 0.15s; position: relative; }
 .repo-card:hover { border-color: var(--amber); box-shadow: 0 4px 20px rgba(0,0,0,0.06); }
 .repo-tag { font-family: 'IBM Plex Mono', monospace; font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--amber); background: #fef3c7; padding: 0.2rem 0.5rem; border-radius: 3px; display: inline-block; margin-bottom: 1rem; }
@@ -158,6 +161,7 @@ h2 { font-family: 'DM Serif Display', serif; font-size: clamp(1.8rem, 3vw, 2.4re
 /* ---------- PROJECT PAGES: install / quickstart ---------- */
 .install { background: var(--warm-white); }
 .install-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2.5rem; margin-top: 2.4rem; align-items: start; }
+.install-grid > * { min-width: 0; }
 @media (max-width: 820px) { .install-grid { grid-template-columns: 1fr; } }
 .install pre { background: #111; color: #e8e0d0; border-radius: 8px; padding: 1.25rem 1.4rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.78rem; line-height: 1.9; overflow-x: auto; }
 .install pre .c { color: #555; } .install pre .p { color: #5a9060; }
@@ -178,6 +182,51 @@ footer { background: var(--black); color: var(--gray-4); padding: 3rem 2rem; }
 .footer-links a { font-family: 'IBM Plex Mono', monospace; font-size: 0.75rem; color: var(--gray-3); text-decoration: none; transition: color 0.15s; }
 .footer-links a:hover { color: var(--off-white); }
 
+/* ---------- HOME ECOSYSTEM DIAGRAM ---------- */
+.ecosystem { width: 100%; max-width: 600px; display: flex; flex-direction: column; align-items: stretch; }
+.eco-cap { font-family: 'IBM Plex Mono', monospace; font-size: 0.66rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--gray-4); margin-bottom: 1rem; }
+
+.eco-node { display: flex; align-items: center; gap: 0.85rem; background: rgba(255,255,255,0.035); border: 1px solid rgba(255,255,255,0.09); border-radius: 12px; padding: 0.85rem 1.05rem; transition: border-color 0.2s, transform 0.2s; }
+.eco-node:hover { border-color: rgba(251,191,36,0.5); transform: translateX(2px); }
+.eco-icon { flex-shrink: 0; width: 2.1rem; height: 2.1rem; display: grid; place-items: center; border-radius: 9px; background: rgba(251,191,36,0.12); color: var(--amber-light); }
+.eco-icon svg { width: 1.15rem; height: 1.15rem; }
+.eco-main { display: flex; flex-direction: column; gap: 0.12rem; min-width: 0; }
+.eco-name { font-family: 'IBM Plex Mono', monospace; font-weight: 600; font-size: 0.9rem; color: var(--off-white); }
+.eco-role { font-size: 0.78rem; color: #a09a8e; line-height: 1.4; }
+
+/* flagship end node — the destination of the whole pipeline */
+.eco-node--flagship { border-color: rgba(251,191,36,0.55); background: linear-gradient(180deg, rgba(251,191,36,0.12), rgba(251,191,36,0.02)); box-shadow: 0 10px 34px rgba(217,119,6,0.16); }
+.eco-node--flagship .eco-name { color: var(--amber-light); }
+.eco-node--flagship .eco-icon { background: rgba(251,191,36,0.2); }
+
+/* vertical connector with a chevron */
+.eco-connector { width: 2px; height: 1.5rem; align-self: center; background: linear-gradient(180deg, rgba(251,191,36,0.75), rgba(251,191,36,0.12)); position: relative; }
+.eco-connector::after { content: ''; position: absolute; left: 50%; bottom: -2px; width: 6px; height: 6px; border-right: 2px solid var(--amber-light); border-bottom: 2px solid var(--amber-light); transform: translateX(-50%) rotate(45deg); }
+
+/* artifact pill sitting on the spine */
+.eco-artifact { align-self: center; justify-self: center; font-family: 'IBM Plex Mono', monospace; font-size: 0.7rem; letter-spacing: 0.01em; color: var(--amber-light); background: rgba(251,191,36,0.1); border: 1px solid rgba(251,191,36,0.28); border-radius: 999px; padding: 0.25rem 0.75rem; white-space: nowrap; }
+
+/* branch row: empty | artifact (centered) | dashed line → evidence-seal */
+.eco-flow { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; }
+.eco-flow .eco-artifact { grid-column: 2; }
+.eco-branch { grid-column: 3; display: flex; align-items: center; min-width: 0; }
+.eco-branch::before { content: ''; flex-shrink: 0; width: 1.5rem; height: 2px; background: repeating-linear-gradient(90deg, rgba(251,191,36,0.65) 0 4px, transparent 4px 8px); }
+.eco-node--seal { border-style: dashed; border-color: rgba(251,191,36,0.32); padding: 0.6rem 0.75rem; }
+.eco-node--seal .eco-icon { width: 1.8rem; height: 1.8rem; }
+.eco-node--seal .eco-name { font-size: 0.82rem; }
+.eco-node--seal .eco-role { font-size: 0.72rem; }
+
+/* control-coverage outputs */
+.eco-outputs { display: flex; flex-wrap: wrap; gap: 0.4rem; justify-content: center; margin-top: 0.8rem; }
+.eco-outputs span { font-family: 'IBM Plex Mono', monospace; font-size: 0.68rem; color: var(--off-white); background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 0.24rem 0.55rem; }
+.eco-outputs span:first-child { color: var(--amber-light); border-color: rgba(251,191,36,0.35); background: rgba(251,191,36,0.1); }
+
+@media (max-width: 560px) {
+    .eco-flow { grid-template-columns: 1fr; justify-items: center; gap: 0.6rem; }
+    .eco-branch { grid-column: 1; }
+    .eco-branch::before { display: none; }
+}
+
 /* ---------- ANIMATION ---------- */
 @keyframes fadeUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } }
 .hero-label, .crumb { animation: fadeUp 0.5s ease both; }
@@ -185,10 +234,11 @@ h1 { animation: fadeUp 0.5s ease 0.1s both; }
 .hero-desc { animation: fadeUp 0.5s ease 0.2s both; }
 .hero-actions { animation: fadeUp 0.5s ease 0.3s both; }
 .terminal { animation: fadeUp 0.5s ease 0.4s both; }
-@media (prefers-reduced-motion: reduce) { * { animation: none !important; } }
+.ecosystem { animation: fadeUp 0.5s ease 0.4s both; }
+html { scroll-behavior: smooth; }
+@media (prefers-reduced-motion: reduce) { * { animation: none !important; } html { scroll-behavior: auto; } }
 
 /* ---------- RESPONSIVE ---------- */
 @media (max-width: 640px) {
-    .nav-links a:not(.btn-github):not(:last-child) { display: none; }
     h1 { font-size: 2.4rem; }
 }
diff --git a/audit-report/index.html b/audit-report/index.html
index 6d5c2b8..5e55322 100644
--- a/audit-report/index.html
+++ b/audit-report/index.html
@@ -15,8 +15,6 @@
     <div class="nav-inner">
         <a href="/" class="logo">AUDIT<span>LABS</span></a>
         <ul class="nav-links">
-            <li><a href="/">Home</a></li>
-            <li><a href="/evidence-seal/">evidence-seal</a></li>
             <li><a href="https://github.com/audit-labs/audit-report" class="btn-github">View on GitHub →</a></li>
         </ul>
     </div>
@@ -152,9 +150,6 @@ audit-report ./output/aws_audit_prod_2026-08 \
         </div>
         <div class="footer-links">
             <a href="/">Home</a>
-            <a href="https://github.com/audit-labs/audit-report">audit-report</a>
-            <a href="/evidence-seal/">evidence-seal</a>
-            <a href="/gh-attest/">gh-attest</a>
             <a href="https://github.com/audit-labs">GitHub</a>
         </div>
     </div>
diff --git a/control-coverage/index.html b/control-coverage/index.html
new file mode 100644
index 0000000..2742d68
--- /dev/null
+++ b/control-coverage/index.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>control-coverage | Audit Labs</title>
+    <meta name="description" content="Control-first coverage and blind-spot analysis. Scores an evidence corpus against the complete catalog of a framework's controls — SOC 2, ISO 27001, NIST 800-53 — for a true coverage percentage, the blind spots no finding touches, and a Statement of Applicability.">
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;700&family=DM+Serif+Display:ital@0;1&family=DM+Sans:wght@400;500;600&display=swap" rel="stylesheet">
+    <link rel="stylesheet" href="../assets/site.css">
+</head>
+<body>
+
+<nav>
+    <div class="nav-inner">
+        <a href="/" class="logo">AUDIT<span>LABS</span></a>
+        <ul class="nav-links">
+            <li><a href="https://github.com/audit-labs/control-coverage" class="btn-github">View on GitHub →</a></li>
+        </ul>
+    </div>
+</nav>
+
+<header class="hero split">
+    <div class="hero-inner">
+        <div>
+            <div class="crumb"><a href="/">Audit Labs</a> / control-coverage</div>
+            <h1>Measure what your evidence<br><em>doesn&rsquo;t cover.</em></h1>
+            <p class="hero-desc">
+                Every other tool is evidence-first: it maps what you collected to the controls it
+                touches. <strong>control-coverage</strong> is control-first &mdash; it starts from the
+                <em>complete</em> catalog of a framework&rsquo;s controls and scores your evidence against
+                it. The result is a true coverage percentage, the blind spots no finding touches, and a
+                Statement of Applicability &mdash; from audit-report JSON you already have.
+            </p>
+            <div class="hero-actions">
+                <a href="https://github.com/audit-labs/control-coverage" class="btn-primary">View on GitHub</a>
+                <a href="#install" class="btn-secondary">Install &amp; quickstart</a>
+            </div>
+        </div>
+        <div class="terminal">
+            <div class="terminal-bar"><div class="dot dot-red"></div><div class="dot dot-yellow"></div><div class="dot dot-green"></div></div>
+            <div class="terminal-body">
+                <span class="t-comment"># Score a corpus against the whole framework</span><br>
+                <span class="t-prompt">$</span> <span class="t-cmd">control-coverage ./reports/ --framework SOC2</span><br>
+                <span class="t-path">&nbsp;&nbsp;SOC 2: 16.7% coverage · 3 supported · 30 blind spots</span><br>
+                <span class="t-dim">──────────────────────────────</span><br>
+                <span class="t-comment"># List the controls nothing evidences yet</span><br>
+                <span class="t-prompt">$</span> <span class="t-cmd">control-coverage ./reports/ --blind-spots</span><br>
+                <span class="t-out">&nbsp;&nbsp;○ CC1.1  commitment to integrity and ethical values</span><br>
+                <span class="t-out">&nbsp;&nbsp;○ CC2.1  relevant, quality information</span><br>
+                <span class="t-bad">&nbsp;&nbsp;30 in-scope controls unaddressed</span>
+            </div>
+        </div>
+    </div>
+</header>
+
+<section>
+    <div class="section-inner">
+        <div class="eyebrow">Three analyses</div>
+        <h2>Coverage, trend, and crosswalk.</h2>
+        <p class="lede">One corpus, three questions &mdash; how much of the framework you address, how that moved since last time, and which evidence is doing the most work.</p>
+        <div class="guarantees">
+            <div class="card">
+                <div class="num">01 · COVERAGE</div>
+                <h3>What&rsquo;s missing</h3>
+                <p>Every control gets an assurance state &mdash; <em>supported</em>, <em>failing</em>, <em>asserted</em>, or <em>unaddressed</em>. The blind-spot list names the controls no finding touches, and a Statement of Applicability falls out for free. <span class="mono">--format md,html,json,soa</span>.</p>
+            </div>
+            <div class="card">
+                <div class="num">02 · TREND</div>
+                <h3>What moved</h3>
+                <p>Point <span class="mono">--baseline</span> at an earlier corpus. Each control is classified <em>improved</em>, <em>regressed</em>, <em>gained</em>, or <em>lost</em>, with the coverage delta per framework. Gate CI with <span class="mono">--fail-on-regression</span>.</p>
+            </div>
+            <div class="card">
+                <div class="num">03 · CROSSWALK</div>
+                <h3>What earns the most</h3>
+                <p>One 2FA check is evidence for SOC&nbsp;2 CC6.1, ISO A.5.17, and NIST IA-2 at once. <span class="mono">--crosswalk</span> shows that leverage and computes the <em>minimal evidence set</em> &mdash; the fewest checks that still cover everything.</p>
+            </div>
+        </div>
+    </div>
+</section>
+
+<section class="cmds">
+    <div class="section-inner">
+        <div class="eyebrow">What you get</div>
+        <h2>The denominator no other tool has.</h2>
+        <p class="lede">Coverage measures how much of a framework your evidence addresses &mdash; not whether you&rsquo;re compliant. An unaddressed control is a gap in <em>evidence</em>; the judgment stays with you and your auditor.</p>
+        <div class="cmd-list">
+            <div class="cmd-row"><div class="cmd-name">Complete catalogs</div><div class="cmd-desc">SOC&nbsp;2 (all five Trust Services categories, 61 controls), ISO&nbsp;27001:2022 Annex&nbsp;A (all 93), and the NIST 800-53 moderate baseline (177) &mdash; the full lists to measure against.</div></div>
+            <div class="cmd-row"><div class="cmd-name">Blind spots</div><div class="cmd-desc">The in-scope controls no finding touches &mdash; the gaps an auditor finds for you if you don&rsquo;t find them first.</div></div>
+            <div class="cmd-row"><div class="cmd-name">Statement of Applicability</div><div class="cmd-desc">The required ISO&nbsp;27001 artifact, derived from evidence rather than hand-kept. Exclude a control or a whole category with <span class="mono">--scope</span> &mdash; every exclusion needs a reason.</div></div>
+            <div class="cmd-row"><div class="cmd-name">CI gating</div><div class="cmd-desc"><span class="mono">--fail-under</span> exits non-zero when coverage drops below a floor; <span class="mono">--fail-on-regression</span> when a control slips. Coverage as a metric, not a fire drill.</div></div>
+        </div>
+    </div>
+</section>
+
+<section class="frameworks">
+    <div class="frameworks-inner">
+        <span class="frameworks-label">Measures coverage of</span>
+        <div class="frameworks-list">
+            <span class="framework-tag">SOC 2</span>
+            <span class="framework-tag">ISO 27001</span>
+            <span class="framework-tag">NIST 800-53</span>
+            <span class="framework-tag" style="color:var(--gray-4);">·</span>
+            <span class="framework-tag">reads audit-report JSON</span>
+        </div>
+    </div>
+</section>
+
+<section class="install" id="install">
+    <div class="section-inner">
+        <div class="eyebrow">Get started</div>
+        <h2>Install &amp; quickstart.</h2>
+        <div class="install-grid">
+            <div>
+                <pre><span class="c"># Install from source</span>
+pip install <span class="p">"control-coverage"</span> \
+  @ git+https://github.com/audit-labs/control-coverage
+
+<span class="c"># Score a folder of audit-report JSON reports</span>
+control-coverage ./reports/ \
+  --scope soa.yaml --format md,html,soa --out out/</pre>
+                <div class="badges">
+                    <span class="badge">Python 3.10+</span>
+                    <span class="badge">GPL-3.0</span>
+                    <span class="badge">PyYAML only</span>
+                    <span class="badge">SOC 2 · ISO 27001 · NIST</span>
+                </div>
+            </div>
+            <div>
+                <p class="lede">The exit-code contract, at a glance:</p>
+                <div class="exit">
+                    <div class="e"><span class="code g">0</span><span>Ran clean &mdash; no coverage or regression gate was crossed.</span></div>
+                    <div class="e"><span class="code r">1</span><span>Coverage fell below <span class="mono">--fail-under</span>, or a control regressed under <span class="mono">--fail-on-regression</span>.</span></div>
+                    <div class="e"><span class="code a">2</span><span>Usage error, e.g. no reports found or an unknown framework.</span></div>
+                </div>
+                <p class="lede" style="margin-top:1.4rem; font-size:.9rem;">
+                    Pairs with <a href="/audit-report/" style="color:var(--amber); text-decoration:none;">audit-report</a>
+                    &mdash; report on each package for compliance, then measure coverage across the whole corpus.
+                </p>
+            </div>
+        </div>
+    </div>
+</section>
+
+<footer>
+    <div class="footer-inner">
+        <div class="footer-left">
+            <a href="/" class="footer-logo">AUDIT<span>LABS</span></a>
+            <p>© 2026 Audit Labs — a two-person team building for the community.</p>
+        </div>
+        <div class="footer-links">
+            <a href="/">Home</a>
+            <a href="https://github.com/audit-labs">GitHub</a>
+        </div>
+    </div>
+</footer>
+
+</body>
+</html>
diff --git a/evidence-seal/index.html b/evidence-seal/index.html
index 52c25c5..c9e12d5 100644
--- a/evidence-seal/index.html
+++ b/evidence-seal/index.html
@@ -15,8 +15,6 @@
     <div class="nav-inner">
         <a href="/" class="logo">AUDIT<span>LABS</span></a>
         <ul class="nav-links">
-            <li><a href="/">Home</a></li>
-            <li><a href="/audit-report/">audit-report</a></li>
             <li><a href="https://github.com/audit-labs/evidence-seal" class="btn-github">View on GitHub →</a></li>
         </ul>
     </div>
@@ -141,9 +139,6 @@ evidence-seal verify ./evidence</pre>
         </div>
         <div class="footer-links">
             <a href="/">Home</a>
-            <a href="/audit-report/">audit-report</a>
-            <a href="https://github.com/audit-labs/evidence-seal">evidence-seal</a>
-            <a href="/gh-attest/">gh-attest</a>
             <a href="https://github.com/audit-labs">GitHub</a>
         </div>
     </div>
diff --git a/gh-attest/index.html b/gh-attest/index.html
index ea10305..a9fc4b8 100644
--- a/gh-attest/index.html
+++ b/gh-attest/index.html
@@ -15,8 +15,6 @@
     <div class="nav-inner">
         <a href="/" class="logo">AUDIT<span>LABS</span></a>
         <ul class="nav-links">
-            <li><a href="/">Home</a></li>
-            <li><a href="/audit-report/">audit-report</a></li>
             <li><a href="https://github.com/audit-labs/gh-attest" class="btn-github">View on GitHub →</a></li>
         </ul>
     </div>
@@ -149,9 +147,6 @@
         </div>
         <div class="footer-links">
             <a href="/">Home</a>
-            <a href="/audit-report/">audit-report</a>
-            <a href="/evidence-seal/">evidence-seal</a>
-            <a href="https://github.com/audit-labs/gh-attest">gh-attest</a>
             <a href="https://github.com/audit-labs">GitHub</a>
         </div>
     </div>
diff --git a/index.html b/index.html
index 4372ce9..a63130d 100644
--- a/index.html
+++ b/index.html
@@ -3,7 +3,8 @@
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Audit Labs | Open-Source Audit Automation</title>
+    <title>Audit Labs | Open-source audit evidence toolchain</title>
+    <meta name="description" content="An open-source toolchain for audit evidence: collect it from real systems, seal it tamper-evident, map it to SOC 2 / ISO 27001 / NIST controls, and measure how much of a framework you actually cover.">
     <a rel="me" href="https://c.im/@cmc"></a>
     <link rel="preconnect" href="https://fonts.googleapis.com">
     <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;700&family=DM+Serif+Display:ital@0;1&family=DM+Sans:wght@400;500;600&display=swap" rel="stylesheet">
@@ -15,8 +16,6 @@
     <div class="nav-inner">
         <a href="/" class="logo">AUDIT<span>LABS</span></a>
         <ul class="nav-links">
-            <li><a href="https://github.com/audit-labs/audit-tools">Tools</a></li>
-            <li><a href="https://github.com/audit-labs/tutorials">Tutorials</a></li>
             <li><a href="https://github.com/audit-labs" class="btn-github">GitHub →</a></li>
         </ul>
     </div>
@@ -27,88 +26,138 @@
         <div class="hero-label">Open-source · Free to use</div>
         <h1>Automate the<br><em>evidence trail.</em></h1>
         <p class="hero-desc">
-            Scripts, queries, and guides that help auditors programmatically gather evidence from real environments — databases, Linux systems, cloud platforms, and more.
+            An open-source toolchain for audit evidence — collect it from real systems, seal it tamper-evident, map it to SOC&nbsp;2, ISO&nbsp;27001 &amp; NIST controls, and measure how much of a framework you actually cover. Built for the auditor on the other side.
         </p>
         <div class="hero-actions">
-            <a href="https://github.com/audit-labs/audit-tools" class="btn-primary">Browse the tools</a>
+            <a href="#repos" class="btn-primary">Explore the tools</a>
             <a href="https://github.com/audit-labs/tutorials" class="btn-secondary">See tutorials</a>
         </div>
 
-        <div class="terminal">
-            <div class="terminal-bar">
-                <div class="dot dot-red"></div>
-                <div class="dot dot-yellow"></div>
-                <div class="dot dot-green"></div>
+        <div class="ecosystem" role="img" aria-label="The Audit Labs pipeline: audit-tools collects evidence into a CSV package; evidence-seal seals and verifies that package; audit-report turns each package into a control-mapped JSON report; one or more reports form a corpus that control-coverage turns into a coverage percentage, blind spots, a Statement of Applicability, trend, and crosswalk.">
+            <div class="eco-cap">One pipeline · collect → seal → report → measure</div>
+
+            <div class="eco-node">
+                <span class="eco-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="8" ry="3"/><path d="M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5"/><path d="M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6"/></svg></span>
+                <div class="eco-main">
+                    <span class="eco-name">audit-tools</span>
+                    <span class="eco-role">Collect evidence — cloud, GitHub, databases &amp; OS</span>
+                </div>
+            </div>
+
+            <div class="eco-connector"></div>
+
+            <div class="eco-flow">
+                <span class="eco-artifact">CSV evidence package</span>
+                <div class="eco-branch">
+                    <div class="eco-node eco-node--seal">
+                        <span class="eco-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l7 3v5c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6z"/><path d="M9 12l2 2 4-4"/></svg></span>
+                        <div class="eco-main">
+                            <span class="eco-name">evidence-seal</span>
+                            <span class="eco-role">Seal &amp; verify integrity</span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="eco-connector"></div>
+
+            <div class="eco-node">
+                <span class="eco-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z"/><path d="M14 3v5h5"/><path d="M9 13h6M9 17h6"/></svg></span>
+                <div class="eco-main">
+                    <span class="eco-name">audit-report</span>
+                    <span class="eco-role">Map findings to SOC 2, ISO 27001 &amp; NIST → JSON</span>
+                </div>
+            </div>
+
+            <div class="eco-connector"></div>
+            <span class="eco-artifact">one or more reports = a corpus</span>
+            <div class="eco-connector"></div>
+
+            <div class="eco-node eco-node--flagship">
+                <span class="eco-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="4"/><circle cx="12" cy="12" r="1" fill="currentColor" stroke="none"/></svg></span>
+                <div class="eco-main">
+                    <span class="eco-name">control-coverage</span>
+                    <span class="eco-role">Score the corpus against whole frameworks</span>
+                </div>
             </div>
-            <div class="terminal-body">
-                <span class="t-comment"># Pull user access report from a PostgreSQL database</span><br>
-                <span class="t-prompt">$</span> <span class="t-cmd">python3 databases/postgres/user_access.py</span><br>
-                <span class="t-out">✓ Connected to audit_db</span><br>
-                <span class="t-out">✓ Exported 142 rows → </span><span class="t-path">output/user_access_2025-01.csv</span><br>
-                <span class="t-dim">──────────────────────────────────</span><br>
-                <span class="t-comment"># Sample 25 items using random seed for reproducibility</span><br>
-                <span class="t-prompt">$</span> <span class="t-cmd">python3 sampling/random_sample.py --n 25 --seed 42</span><br>
-                <span class="t-out">✓ Sample written → </span><span class="t-path">output/sample_25.csv</span>
+
+            <div class="eco-outputs">
+                <span>coverage %</span>
+                <span>blind spots</span>
+                <span>Statement of Applicability</span>
+                <span>trend</span>
+                <span>crosswalk</span>
             </div>
         </div>
     </div>
 </header>
 
-<section class="repos">
+<section class="repos" id="repos">
     <div class="section-inner">
         <div class="section-header">
-            <h2>Five repos.<br>Pick what you need.</h2>
+            <h2>Six repos.<br>Pick what you need.</h2>
             <a href="https://github.com/audit-labs" class="section-link">View all on GitHub →</a>
         </div>
+        <p class="lede" style="margin: -0.5rem 0 2.4rem;">Each tool does one job and hands off to the next — run a single step or the whole chain, from collecting evidence to measuring control coverage.</p>
         <div class="repo-grid">
             <a href="https://github.com/audit-labs/audit-tools" class="repo-card">
-                <div class="repo-tag">Tools</div>
+                <div class="repo-tag">Collect</div>
                 <h3>audit-labs/audit-tools</h3>
-                <p>Ready-to-run scripts for common audit procedures: pseudo-random sampling, GITC extraction, database user access, Linux OS reports, and more. Use as-is or adapt to your environment.</p>
+                <p>Ready-to-run scripts for common audit procedures: pseudo-random sampling, GITC extraction, database user access, Linux OS reports, and more. Gathers raw evidence into CSV packages — use as-is or adapt to your environment.</p>
                 <div class="repo-langs">
                     <span class="lang-badge">Python</span>
                     <span class="lang-badge">Shell</span>
                     <span class="lang-badge">SQL</span>
                 </div>
             </a>
-            <a href="https://github.com/audit-labs/tutorials" class="repo-card">
-                <div class="repo-tag">Tutorials</div>
-                <h3>audit-labs/tutorials</h3>
-                <p>Step-by-step guides on building your own audit automation using Python, the CLI, and APIs. Good starting point if you're new to scripting or want to extend existing tools.</p>
+            <a href="/evidence-seal/" class="repo-card">
+                <div class="repo-tag">Seal</div>
+                <h3>audit-labs/evidence-seal</h3>
+                <p>Tamper-evident seals and chain of custody for evidence packages. SHA-256 Merkle manifests catch any change to any file; sequential seals chain into a verifiable history; optional ed25519 signing and RFC 3161 timestamping prove who sealed it and when.</p>
                 <div class="repo-langs">
-                    <span class="lang-badge">Jupyter</span>
                     <span class="lang-badge">Python</span>
-                    <span class="lang-badge">Markdown</span>
+                    <span class="lang-badge">ed25519</span>
+                    <span class="lang-badge">RFC 3161</span>
                 </div>
             </a>
-            <a href="/gh-attest/" class="repo-card">
-                <div class="repo-tag">GitHub App</div>
-                <h3>audit-labs/gh-attest</h3>
-                <p>A read-only GitHub App that turns your security configuration into compliance evidence. Captures branch protection, scanning alerts, and org access over time, maps them to SOC 2 and ISO 27001 controls, and exports CSV and PDF evidence packages.</p>
+            <a href="/audit-report/" class="repo-card">
+                <div class="repo-tag">Report</div>
+                <h3>audit-labs/audit-report</h3>
+                <p>Turns an audit-tools evidence package into a control-mapped, auditor-ready report — Markdown, self-contained HTML, or JSON. Declarative rulesets map findings to SOC 2, ISO 27001, and NIST 800-53, with diff and trend modes for tracking drift over time.</p>
                 <div class="repo-langs">
-                    <span class="lang-badge">TypeScript</span>
-                    <span class="lang-badge">Cloudflare</span>
-                    <span class="lang-badge">D1</span>
+                    <span class="lang-badge">Python</span>
+                    <span class="lang-badge">YAML</span>
+                    <span class="lang-badge">HTML</span>
                 </div>
             </a>
-            <a href="/audit-report/" class="repo-card">
-                <div class="repo-tag">CLI</div>
-                <h3>audit-labs/audit-report</h3>
-                <p>Turns an audit-tools evidence package into a control-mapped, auditor-ready report — Markdown, self-contained HTML, or JSON. Declarative rulesets map findings to SOC 2, ISO 27001, and NIST, with diff and trend modes for tracking drift over time.</p>
+            <a href="/control-coverage/" class="repo-card">
+                <div class="repo-tag">Measure</div>
+                <h3>audit-labs/control-coverage</h3>
+                <p>Control-first coverage analysis. Scores an evidence corpus against the complete catalog of a framework's controls — SOC 2, ISO 27001, NIST 800-53 — to report a true coverage percentage, the blind spots no finding touches, and a Statement of Applicability. Reads audit-report JSON.</p>
                 <div class="repo-langs">
                     <span class="lang-badge">Python</span>
                     <span class="lang-badge">YAML</span>
                     <span class="lang-badge">HTML</span>
                 </div>
             </a>
-            <a href="/evidence-seal/" class="repo-card">
-                <div class="repo-tag">CLI</div>
-                <h3>audit-labs/evidence-seal</h3>
-                <p>Tamper-evident seals and chain of custody for evidence packages. SHA-256 Merkle manifests catch any change to any file; sequential seals chain into a verifiable history; optional ed25519 signing and RFC 3161 timestamping prove who sealed it and when.</p>
+            <a href="/gh-attest/" class="repo-card">
+                <div class="repo-tag">GitHub App</div>
+                <h3>audit-labs/gh-attest</h3>
+                <p>A read-only GitHub App that collects continuously — turning your GitHub security configuration into compliance evidence. Captures branch protection, scanning alerts, and org access over time, maps them to SOC 2 and ISO 27001 controls, and exports CSV and PDF evidence packages.</p>
                 <div class="repo-langs">
+                    <span class="lang-badge">TypeScript</span>
+                    <span class="lang-badge">Cloudflare</span>
+                    <span class="lang-badge">D1</span>
+                </div>
+            </a>
+            <a href="https://github.com/audit-labs/tutorials" class="repo-card">
+                <div class="repo-tag">Learn</div>
+                <h3>audit-labs/tutorials</h3>
+                <p>Step-by-step guides on building your own audit automation using Python, the CLI, and APIs. Good starting point if you're new to scripting or want to extend any of the tools above.</p>
+                <div class="repo-langs">
+                    <span class="lang-badge">Jupyter</span>
                     <span class="lang-badge">Python</span>
-                    <span class="lang-badge">ed25519</span>
-                    <span class="lang-badge">RFC 3161</span>
+                    <span class="lang-badge">Markdown</span>
                 </div>
             </a>
         </div>
@@ -118,8 +167,8 @@
 <section class="tools">
     <div class="section-inner">
         <div class="tools-intro">
-            <h2>What's in the toolbox</h2>
-            <p>Coverage across the systems auditors most commonly deal with, with more being added.</p>
+            <h2>Inside audit-tools</h2>
+            <p>Step one of the pipeline — the collectors that pull raw evidence from the systems auditors most commonly deal with. New systems are added over time.</p>
         </div>
         <div class="tool-list">
             <div class="tool-item">
@@ -163,7 +212,7 @@
             <span class="framework-tag">SOX</span>
             <span class="framework-tag">SOC 1 / 2</span>
             <span class="framework-tag">ISO 27001</span>
-            <span class="framework-tag">NIST CSF</span>
+            <span class="framework-tag">NIST 800-53</span>
             <span class="framework-tag">ITGC</span>
         </div>
     </div>
@@ -176,11 +225,6 @@
             <p>© 2026 Audit Labs — a two-person team building for the community.</p>
         </div>
         <div class="footer-links">
-            <a href="https://github.com/audit-labs/audit-tools">audit-tools</a>
-            <a href="/audit-report/">audit-report</a>
-            <a href="/evidence-seal/">evidence-seal</a>
-            <a href="/gh-attest/">gh-attest</a>
-            <a href="https://github.com/audit-labs/tutorials">tutorials</a>
             <a href="https://github.com/audit-labs">GitHub</a>
         </div>
     </div>