<!doctype html>
<!--
  trentpower.fr
  static, self-managed, privacy-first
  no analytics, no cookies, no external assets
  detached verification notes for /integrity/
-->
<html lang="en" dir="ltr">
<head>
  <!-- foundations -->
  <meta charset="utf-8">
  <script>(()=>{const e=document.documentElement;let t='';try{t=localStorage.getItem('tp-lang')||''}catch{}const n=(navigator.languages&&navigator.languages[0])||navigator.language||'en',a=t&&['en','fr'].includes(t)?t:/^fr\b/i.test(n)?'fr':'en';e.lang=a,e.dataset.lang=a,e.classList.add("js")})();</script>
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
  <meta name="color-scheme" content="light dark">
  <meta name="supported-color-schemes" content="light dark">
  <meta name="theme-color" content="#E9E5DC" media="(prefers-color-scheme: light)">
  <meta name="theme-color" content="#22201B" media="(prefers-color-scheme: dark)">

  <!-- document -->
  <title>Verify locally · Trent Power</title>
  <meta name="description" content="Detached verification notes: signed manifest check from a temporary keyring">
  <meta name="document-edition" content="2026-05-09">
  <link rel="canonical" href="https://trentpower.fr/integrity/verify-locally/">

  <!-- identity -->
  <meta name="author" content="Trent Power">
  <meta name="application-name" content="Trent Power">
  <meta name="apple-mobile-web-app-title" content="Trent Power">
  <link rel="author" href="/.well-known/attribution.txt">
  <link rel="alternate" type="application/ld+json" href="/.well-known/person.json">

  <!-- discovery -->
  <meta name="robots" content="noindex">
  <meta name="referrer" content="no-referrer">

  <!-- social preview -->
  <meta property="og:type" content="website">
  <meta property="og:site_name" content="Trent Power">
  <meta property="og:title" content="Verify locally · Trent Power">
  <meta property="og:description" content="Detached verification notes: signed manifest check from a temporary keyring">
  <meta property="og:url" content="https://trentpower.fr/integrity/verify-locally/">
  <meta property="og:image" content="https://trentpower.fr/images/og/integrity-og.png">
  <meta property="og:image:width" content="1200">
  <meta property="og:image:height" content="630">
  <meta property="og:image:type" content="image/png">
  <meta property="og:image:alt" content="Verify locally · Trent Power">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:title" content="Verify locally · Trent Power">
  <meta name="twitter:description" content="Detached verification notes: signed manifest check from a temporary keyring">
  <meta name="twitter:image" content="https://trentpower.fr/images/og/integrity-og.png">
  <meta name="twitter:image:alt" content="Verify locally · Trent Power">
  <meta name="twitter:site"    content="@trentpower">
  <meta name="twitter:creator" content="@trentpower">

  <!-- icons and app surface -->
  <link rel="icon" href="/favicon.ico" sizes="any">
  <link rel="icon" href="/favicon.svg" type="image/svg+xml">
  <link rel="apple-touch-icon" href="/apple-touch-icon.png">
  <link rel="manifest" href="/manifest.webmanifest" type="application/manifest+json">
  <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/">

  <!-- assets -->
  <link rel="stylesheet" href="/styles.css?v=2026-05-09.fceaf1e4">
  <link rel="stylesheet" href="/print.css?v=2026-05-09.fceaf1e4" media="print">

  <!-- structured data -->
  <script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","@id":"https://trentpower.fr/integrity/verify-locally/#article","headline":"Verify locally · Trent Power","url":"https://trentpower.fr/integrity/verify-locally/","description":"Detached verification notes for the signed integrity manifest","inLanguage":"en","isPartOf":{"@id":"https://trentpower.fr/#website"},"author":{"@id":"https://trentpower.fr/#trent-power"},"publisher":{"@id":"https://trentpower.fr/#trent-power"},"datePublished":"2026-05-13","dateModified":"2026-05-15T00:00:00+00:00"}</script>
</head>
<body data-page="integrity-verify-locally" data-surface="record" data-masthead="brand-only" data-edition="2026-05-09">

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

<header class="site-header" data-component="site-header">
  <div class="nav">
    <div class="nav-inner">
      <a class="nav-mark" href="/" aria-label="Trent Power home"><span>Trent</span> <span>Power</span></a>
    </div>
  </div>
</header>

<main class="site" id="main" tabindex="-1" itemscope itemtype="https://schema.org/TechArticle">
  <div class="page">
    <h1 class="page-title" data-i18n="verify_locally.page_title">Verify locally</h1>
    <div class="page-body">
      <p class="page-lede" data-i18n="verify_locally.body_intro">Detached verification notes for the signed integrity manifest. Run the check in a temporary keyring so the public signing key does not enter your default keychain.</p>

      <div class="trust-code-block">
        <div class="trust-code-block-header">
          <button type="button" class="trust-code-copy verify-command-copy record-inline-action"
                  data-copy-target="integrity-verify-command"
                  data-i18n="copy.command"
                  data-i18n-copied="copy.copied">Copy command</button>
        </div>
        <pre class="trust-code" id="integrity-verify-command"><code><span class="code-var">tmpdir</span>=<span class="code-str">"$(mktemp -d)"</span>
<span class="code-cmd">export</span> <span class="code-var">GNUPGHOME</span>=<span class="code-str">"$tmpdir"</span>

<span class="code-var">ts</span>=<span class="code-cmd">$(</span>date +%s<span class="code-cmd">)</span>
<span class="code-cmd">curl</span> -fsS <span class="code-str">"https://trentpower.fr/integrity.json?ts=$ts"</span> -o integrity.json
<span class="code-cmd">curl</span> -fsS <span class="code-str">"https://trentpower.fr/integrity.json.sig?ts=$ts"</span> -o integrity.json.sig
<span class="code-cmd">curl</span> -fsS <span class="code-str">"https://trentpower.fr/.well-known/pgp-key.asc?ts=$ts"</span> | <span class="code-cmd">gpg</span> --import
<span class="code-cmd">gpg</span> --verify integrity.json.sig integrity.json

<span class="code-cmd">rm</span> -rf <span class="code-str">"$tmpdir"</span> integrity.json integrity.json.sig</code></pre>
      </div>

      <p class="integrity-page-level-note" data-i18n="verify_locally.body_close">The command imports the public key into a throw-away keyring, verifies the signed manifest, and removes the working files. No state is retained on the machine afterwards.</p>
    </div>
    <a href="/integrity/" class="page-back" data-i18n="verify_locally.back">← Integrity</a>
  </div>

</main>


<footer class="site-footer">
  <p class="site-footer__seal" aria-hidden="true">· · ·</p>
  <p class="site-footer__colophon">2026&nbsp;&nbsp;Trent Power&nbsp;&nbsp;Paris,&nbsp;France</p>
  <nav class="site-footer__language" aria-label="Language">
    <button type="button" data-lang="en" lang="en" aria-pressed="true" aria-label="English">English</button>
    <span class="site-footer__lang-sep" aria-hidden="true">/</span>
    <button type="button" data-lang="fr" lang="fr" aria-pressed="false" aria-label="Français">Français</button>
  </nav>
</footer>

<script src="/i18n-core.js?v=2026-05-09.fceaf1e4" defer></script>
<script src="/app.js?v=2026-05-09.fceaf1e4" defer></script>
<script src="/app-enhance.js?v=2026-05-09.fceaf1e4" defer></script>
<script src="/verify/verification-data.js?v=2026-05-09.fceaf1e4" defer></script>
<script src="/cite.js?v=2026-05-09.fceaf1e4" defer></script>

</body>
</html>
