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.
439 lines
18 KiB
HTML
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 MiB)</a>
|
|
<a class="btn secondary" href="/downloads/windows/verae-timestamp.exe">Download CLI (~22 MiB)</a>
|
|
<a class="btn secondary" href="/downloads/windows/verae-sha256.exe">Download hasher (~0.4 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 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 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 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 & 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\<sha256>.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>
|