verae-mcp-timestamping-server/site/windows.html
George Lambert 1ca834900e feat: site WIP — downloads, explorer, hasher, TestFlight enroll
Commit restored mcp.verae.ai site pages (app, register, macos, windows,
explorer), hasher/download artifacts, index/sample/hasher updates, ledger
and global_client improvements, NATS stamp helper, and TestFlight enroll
service. Ignore debug-trace/ and editor backups. Standard Readme for
download and enroll docs.
2026-09-29 11:18:59 -04:00

439 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Windows downloads — Verae Timestamping</title>
<meta name="description" content="Download Verae Timestamping for Windows amd64: GUI, CLI, and local hasher. Hash locally, register/verify digests via MCP. SmartScreen notes, SHA-256 checksums, install instructions.">
<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=Fraunces:opsz,wght@9..144,500;9..144,600&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="icon" href="assets/VeraeFullLogo.png">
<style>
:root {
--ink: oklch(0.21 0.020 310);
--ink-soft: oklch(0.42 0.018 310);
--ink-mute: oklch(0.60 0.014 310);
--paper: oklch(0.992 0.004 90);
--soft: oklch(0.972 0.008 85);
--hair: oklch(0.90 0.010 80);
--purple: oklch(0.32 0.110 310);
--purple-mid: oklch(0.42 0.130 312);
--purple-wash: oklch(0.96 0.020 312);
--gold: oklch(0.80 0.090 85);
--dark: oklch(0.19 0.022 312);
--ok: oklch(0.55 0.12 145);
--warn: oklch(0.55 0.14 70);
--warn-wash: oklch(0.96 0.04 85);
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
color: var(--ink);
background: var(--paper);
line-height: 1.55;
}
a { color: var(--purple); }
header {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1100px;
margin: 0 auto;
padding: 28px 28px 0;
flex-wrap: wrap;
gap: 12px;
}
.brand img { height: 46px; width: auto; display: block; }
nav { display: flex; gap: 22px; font-size: 14px; font-weight: 600; flex-wrap: wrap; }
nav a { color: var(--ink-soft); text-decoration: none; }
nav a:hover, nav a.active { color: var(--purple); }
.hero {
max-width: 1100px;
margin: 0 auto;
padding: 48px 28px 12px;
}
.eyebrow {
font-size: 13px;
font-weight: 700;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--purple-mid);
}
h1 {
font-family: Fraunces, Georgia, serif;
font-weight: 560;
font-size: clamp(34px, 5vw, 56px);
line-height: 1.08;
letter-spacing: -0.03em;
margin: 12px 0 18px;
max-width: 18ch;
}
.lede { max-width: 46rem; font-size: 18px; color: var(--ink-soft); margin: 0; }
.wrap { max-width: 1100px; margin: 0 auto; padding: 12px 28px 80px; }
h2.section {
font-family: Fraunces, Georgia, serif;
font-size: 30px;
font-weight: 560;
margin: 48px 0 8px;
}
.section-note { color: var(--ink-soft); max-width: 48rem; margin-top: 0; }
.gold { height: 3px; width: 72px; background: var(--gold); border: 0; margin: 28px 0; }
.btn-row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 18px 0; }
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
background: var(--purple);
color: white;
text-decoration: none;
border: 0;
border-radius: 999px;
padding: 12px 18px;
font: inherit;
font-weight: 600;
font-size: 14px;
}
.btn.secondary {
background: white;
color: var(--purple);
border: 1px solid var(--hair);
}
.meta { font-size: 13px; color: var(--ink-mute); margin-top: 10px; }
.card {
background: white;
border: 1px solid var(--hair);
border-radius: 16px;
padding: 22px;
margin-top: 18px;
}
.warnbox {
background: var(--warn-wash);
border: 1px solid oklch(0.88 0.06 85);
border-radius: 14px;
padding: 16px 18px;
margin: 18px 0;
color: var(--ink);
}
.warnbox strong { color: var(--warn); }
table.artifacts {
width: 100%;
border-collapse: collapse;
margin-top: 8px;
font-size: 14px;
}
table.artifacts th, table.artifacts td {
text-align: left;
padding: 10px 8px;
border-bottom: 1px solid var(--hair);
vertical-align: top;
}
table.artifacts th {
color: var(--ink-mute);
font-weight: 600;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.06em;
}
code, .mono {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 0.92em;
}
pre {
background: var(--dark);
color: oklch(0.95 0.01 90);
border-radius: 14px;
padding: 16px 18px;
overflow: auto;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 12.5px;
line-height: 1.5;
margin: 12px 0 0;
}
ol.steps { padding-left: 1.2rem; max-width: 48rem; }
ol.steps li { margin: 0.55rem 0; }
.shots {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18px;
margin-top: 18px;
}
.shot {
background: white;
border: 1px solid var(--hair);
border-radius: 14px;
overflow: hidden;
}
.shot img {
display: block;
width: 100%;
height: auto;
background: var(--soft);
}
.shot figcaption {
padding: 12px 14px 14px;
font-size: 13.5px;
color: var(--ink-soft);
}
.shot figcaption strong { color: var(--ink); display: block; margin-bottom: 4px; }
.tabs { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 0; }
.tabs button {
font: inherit;
font-size: 13px;
font-weight: 600;
border: 1px solid var(--hair);
background: white;
border-radius: 999px;
padding: 8px 14px;
cursor: pointer;
color: var(--ink-soft);
}
.tabs button.active {
background: var(--purple);
color: white;
border-color: var(--purple);
}
.panel[hidden] { display: none; }
footer {
border-top: 1px solid var(--hair);
padding: 28px;
color: var(--ink-mute);
font-size: 14px;
}
footer .inner {
max-width: 1100px;
margin: 0 auto;
display: flex;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
}
@media (max-width: 800px) {
.shots { grid-template-columns: 1fr; }
nav { gap: 14px; }
}
</style>
</head>
<body>
<header>
<a class="brand" href="https://www.verae.com/"><img src="assets/VeraeFullLogo.png" alt="Verae"></a>
<nav>
<a href="index.html">Install</a>
<a href="ways.html">Ways to use</a>
<a href="windows.html" class="active">Windows</a>
<a href="app.html">Browser app</a>
<a href="register.html">Register docs</a>
<a href="sample.html">Sample</a>
<a href="hasher.html">Hasher</a>
</nav>
</header>
<section class="hero">
<div class="eyebrow">Windows amd64 · v0.2.0 · 2026-09-28</div>
<h1>Verae Timestamping for Windows</h1>
<p class="lede">Standalone GUI, CLI, and optional local hasher. Hash on the PC, register or verify digests against <code>https://mcp.verae.ai/mcp</code>. File bytes never leave the machine — only SHA-256 digests are sent.</p>
<div class="btn-row">
<a class="btn" href="/downloads/windows/verae-timestamp-gui.exe">Download GUI (~65&nbsp;MiB)</a>
<a class="btn secondary" href="/downloads/windows/verae-timestamp.exe">Download CLI (~22&nbsp;MiB)</a>
<a class="btn secondary" href="/downloads/windows/verae-sha256.exe">Download hasher (~0.4&nbsp;MiB)</a>
<a class="btn secondary" href="/downloads/windows/SHA256SUMS">SHA256SUMS</a>
</div>
<p class="meta">Stable URLs under <code>/downloads/windows/</code> · PE32+ x86-64 · not code-signed · not in the Microsoft Store</p>
</section>
<div class="wrap">
<hr class="gold">
<div class="warnbox">
<strong>Windows SmartScreen / Defender caveat.</strong>
These builds are <em>not code-signed</em>. First launch will often show “Windows protected your PC.” Click <em>More info</em> → <em>Run anyway</em>, or right-click the EXE → Properties → check <em>Unblock</em> → Apply. This is expected for ad-hoc research builds. Always verify the SHA-256 below before running.
</div>
<h2 class="section" id="artifacts">Artifacts</h2>
<p class="section-note">All three EXEs are frozen one-file binaries (GUI/CLI via PyInstaller; hasher is a small native Rust build). Place them in the same folder so the GUI can find <code>verae-sha256.exe</code>.</p>
<div class="card">
<table class="artifacts">
<thead>
<tr><th>File</th><th>Size</th><th>SHA-256</th><th>What it is</th></tr>
</thead>
<tbody>
<tr>
<td><a href="/downloads/windows/verae-timestamp-gui.exe"><code>verae-timestamp-gui.exe</code></a></td>
<td>65.4&nbsp;MiB</td>
<td><code style="font-size:11px;word-break:break-all">b3075e5a8d9ccaecb3f05231dd09d9de136bb41c064a175fc2418409f9319550</code></td>
<td>Qt GUI (windowed). Add files → Hash / Register / Verify → Export.</td>
</tr>
<tr>
<td><a href="/downloads/windows/verae-timestamp.exe"><code>verae-timestamp.exe</code></a></td>
<td>21.7&nbsp;MiB</td>
<td><code style="font-size:11px;word-break:break-all">1e79afbd1cd1eb86094a4c3961d382b5292b4ff452f6f07399b52c559f5e59a9</code></td>
<td>Console CLI. Same register/verify/hash pipeline as the GUI.</td>
</tr>
<tr>
<td><a href="/downloads/windows/verae-sha256.exe"><code>verae-sha256.exe</code></a></td>
<td>0.4&nbsp;MiB</td>
<td><code style="font-size:11px;word-break:break-all">43e58d969eed10265fe028671ea3fa98d068209ff489b2020e30c0179daba48a</code></td>
<td>Optional fast local hasher. Also published under <a href="/hasher/0.1.2/">/hasher/0.1.2/</a>.</td>
</tr>
</tbody>
</table>
<p class="meta">Checksum file: <a href="/downloads/windows/SHA256SUMS">/downloads/windows/SHA256SUMS</a> · package notes: <a href="/downloads/windows/README.md">README.md</a></p>
</div>
<h2 class="section" id="install">Install &amp; first run</h2>
<ol class="steps">
<li>Download the three EXEs (or at least the GUI) into a folder such as <code>%USERPROFILE%\Verae\</code>.</li>
<li>Verify checksums, e.g. in PowerShell:
<pre>Get-FileHash .\verae-timestamp-gui.exe -Algorithm SHA256
Get-Content .\SHA256SUMS</pre>
</li>
<li>If SmartScreen blocks: <em>More info</em> → <em>Run anyway</em>, or unblock via Properties.</li>
<li>Double-click <code>verae-timestamp-gui.exe</code> (first launch can be slow while the onefile bundle extracts to <code>%TEMP%\_MEI…</code>).</li>
<li>Confirm MCP URL is <code>https://mcp.verae.ai/mcp</code>, scope <code>global</code>, then <strong>Save defaults</strong> (writes <code>%USERPROFILE%\.verae\client.json</code>).</li>
<li>Optional auth for global stamps that need a VeraeTime account — use the CLI <code>login</code> / <code>set-auth</code> helpers; tokens live in <code>%USERPROFILE%\.verae\auth.properties</code> (mode 600 on Unix; ACL-protected on Windows where possible).</li>
</ol>
<h2 class="section" id="gui">GUI: Register · Verify · Hash · Export</h2>
<p class="section-note">Status colors: <strong style="color:#1B7F3A">green = PASS</strong> (registered / valid), <strong style="color:#C62828">red = FAIL</strong>, <strong style="color:#1565C0">blue = hashed</strong>. Results table columns: Status, File, SHA-256, Timestamp, Receipt, Scope. Export JSON / CSV / Text, or Copy output.</p>
<div class="shots">
<figure class="shot">
<img src="assets/windows/gui-ready-web.png" alt="Verae Timestamping GUI ready with a sample file added" width="1100" height="720" loading="lazy">
<figcaption>
<strong>Ready</strong>
Defaults pointed at mcp.verae.ai · sample file added · Hash / Verify / Register awaiting action.
</figcaption>
</figure>
<figure class="shot">
<img src="assets/windows/gui-hash-web.png" alt="GUI after Hash — blue hashed status and SHA-256" width="1100" height="720" loading="lazy">
<figcaption>
<strong>Hash</strong>
Local SHA-256 only (no network). Status shows hashed in blue.
</figcaption>
</figure>
<figure class="shot">
<img src="assets/windows/gui-register-web.png" alt="GUI after Register — green PASS Registered with receipt" width="1100" height="720" loading="lazy">
<figcaption>
<strong>Register</strong>
Digest stamped via MCP. Green PASS · Registered with receipt id.
</figcaption>
</figure>
<figure class="shot">
<img src="assets/windows/gui-verify-web.png" alt="GUI after Verify — green PASS Valid with timestamp and merkle" width="1100" height="720" loading="lazy">
<figcaption>
<strong>Verify</strong>
Lookup against global ledger. Green PASS · Valid with original timestamp and merkle.
</figcaption>
</figure>
</div>
<p class="meta">Screenshots are the real PySide6 Qt GUI shipped inside <code>verae-timestamp-gui.exe</code> (same <code>gui_qt.py</code>), captured in a dry run against <code>https://mcp.verae.ai/mcp</code> on 2026-09-28. Window chrome may differ slightly on a native Windows desktop; layout and results are identical.</p>
<h2 class="section" id="cli">CLI usage</h2>
<pre>verae-timestamp.exe
verae-timestamp.exe set-defaults --url https://mcp.verae.ai/mcp --scope global --output text
verae-timestamp.exe hash .\sample-contract.txt
verae-timestamp.exe register .\sample-contract.txt
verae-timestamp.exe verify .\sample-contract.txt
verae-timestamp.exe verify --output json --output-dir .\out .\sample-contract.txt
verae-timestamp.exe verify --output csv --output-dir .\out .\sample-contract.txt</pre>
<p class="meta">Receipts also land under <code>%USERPROFILE%\.verae\receipts\&lt;sha256&gt;.json</code> unless <code>--no-persist</code> is set.</p>
<h2 class="section" id="outputs">Example outputs (real dry run)</h2>
<p class="section-note">Captured 2026-09-28 against the live MCP with a local sample file. Paths below reflect the capture host; on Windows you would see a <code>C:\…</code> path instead. Digests, receipt ids, and timestamps are authentic.</p>
<div class="tabs" role="tablist">
<button type="button" class="active" data-panel="out-hash">Hash</button>
<button type="button" data-panel="out-reg-txt">Register (text)</button>
<button type="button" data-panel="out-ver-txt">Verify (text)</button>
<button type="button" data-panel="out-ver-json">Verify (JSON)</button>
<button type="button" data-panel="out-ver-csv">Verify (CSV)</button>
</div>
<div class="panel" id="out-hash">
<pre>c4c2489ebe491a110c26fb66cdfb3545785d4746453a46d21cb6eb2f2972d60c sample-contract.txt</pre>
</div>
<div class="panel" id="out-reg-txt" hidden>
<pre>File: sample-contract.txt
SHA-256: c4c2489ebe491a110c26fb66cdfb3545785d4746453a46d21cb6eb2f2972d60c
Scope: global
Receipt: QmTV7gB2vb3ALTCKe1DZ1qxBvawF6h6a4ajYax2chNp6Nc
Original timestamp: 2026-09-28T17:15:39.073480469Z
Merkle: (none)
Status: ok</pre>
</div>
<div class="panel" id="out-ver-txt" hidden>
<pre>File: sample-contract.txt
SHA-256: c4c2489ebe491a110c26fb66cdfb3545785d4746453a46d21cb6eb2f2972d60c
Scope: global
Receipt: QmTV7gB2vb3ALTCKe1DZ1qxBvawF6h6a4ajYax2chNp6Nc
Original timestamp: 2026-09-28T17:15:38.657720898Z
Merkle: 113072
Status: valid</pre>
</div>
<div class="panel" id="out-ver-json" hidden>
<pre>[
{
"sha256": "c4c2489ebe491a110c26fb66cdfb3545785d4746453a46d21cb6eb2f2972d60c",
"scope": "global",
"path": "sample-contract.txt",
"valid": true,
"error": null,
"receipt": {
"receipt_id": "QmTV7gB2vb3ALTCKe1DZ1qxBvawF6h6a4ajYax2chNp6Nc",
"scope": "global",
"created_at": "2026-09-28T17:15:38.657720898Z",
"merkle": "113072"
},
"receipt_id": "QmTV7gB2vb3ALTCKe1DZ1qxBvawF6h6a4ajYax2chNp6Nc",
"status": "valid"
}
]</pre>
</div>
<div class="panel" id="out-ver-csv" hidden>
<pre>path,sha256,scope,receipt_id,created_at,merkle,status
sample-contract.txt,c4c2489ebe491a110c26fb66cdfb3545785d4746453a46d21cb6eb2f2972d60c,global,QmTV7gB2vb3ALTCKe1DZ1qxBvawF6h6a4ajYax2chNp6Nc,2026-09-28T17:15:38.657720898Z,113072,valid</pre>
</div>
<p class="meta">Raw capture files (full paths as written by the client):
<a href="assets/windows/samples/verae-verify.json">verae-verify.json</a> ·
<a href="assets/windows/samples/verae-verify.csv">verae-verify.csv</a> ·
<a href="assets/windows/samples/verae-register.txt">verae-register.txt</a> ·
<a href="assets/windows/samples/hash-only.txt">hash-only.txt</a>
</p>
<h2 class="section" id="notes">Runtime notes</h2>
<ul class="section-note">
<li>Architecture: PE32+ x86-64 (amd64). GUI subsystem for the GUI EXE.</li>
<li>PyInstaller embeds MSVC runtime DLLs; a separate VC++ Redistributable is usually <strong>not</strong> required.</li>
<li>Config / auth / receipts: <code>%USERPROFILE%\.verae\</code> (same layout as macOS <code>~/.verae</code>).</li>
<li>Also try the <a href="app.html">browser app</a> if you prefer not to install binaries.</li>
</ul>
</div>
<footer>
<div class="inner">
<span>Verae timestamping · <a href="https://www.verae.com/">verae.com</a></span>
<span><a href="index.html">Install</a> · <a href="ways.html">Ways to use</a> · <a href="ways.html#testflight">TestFlight</a> · <a href="explorer.html">Explorer</a>
<a href="macos.html">macOS</a>
<a href="windows.html">Windows</a> · <a href="app.html">Browser app</a> · <a href="/downloads/windows/SHA256SUMS">SHA256SUMS</a></span>
</div>
</footer>
<script>
(function () {
var tabs = document.querySelectorAll(".tabs button");
var panels = document.querySelectorAll(".panel");
tabs.forEach(function (btn) {
btn.addEventListener("click", function () {
tabs.forEach(function (b) { b.classList.remove("active"); });
panels.forEach(function (p) { p.hidden = true; });
btn.classList.add("active");
var panel = document.getElementById(btn.getAttribute("data-panel"));
if (panel) panel.hidden = false;
});
});
})();
</script>
</body>
</html>