verae-mcp-timestamping-server/site/ways.html

358 lines
19 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ways to use Verae timestamps</title>
<meta name="description" content="Ways to use Verae timestamps: AI MCP, browser, macOS direct download (notarized), TestFlight, Windows GUI, CLI, JavaScript, curl, explorer.">
<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);
}
* { 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: 20ch;
}
.lede { max-width: 46rem; font-size: 18px; color: var(--ink-soft); margin: 0; }
.gold { height: 3px; width: 72px; background: var(--gold); border: 0; margin: 28px 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; }
.grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 18px; margin-top: 22px; }
.card {
background: white; border: 1px solid var(--hair); border-radius: 16px; padding: 22px;
}
.card .step {
font-size: 12px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--purple-mid);
}
.card h3 { font-size: 18px; margin: 6px 0 8px; }
.card p { margin: 0; color: var(--ink-soft); font-size: 15px; }
.card.featured { border-color: color-mix(in oklch, var(--purple) 35%, var(--hair)); background: linear-gradient(180deg, var(--purple-wash), white 48%); }
.btn-row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-top: 14px; }
.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; cursor: pointer;
}
.btn.secondary { background: white; color: var(--purple); border: 1px solid var(--hair); }
.meta { font-size: 13px; color: var(--ink-mute); margin-top: 12px; }
code { 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;
}
label.field { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 600; color: var(--ink-soft); margin-top: 12px; max-width: 28rem; }
input[type=email], input[type=text], textarea {
font: inherit; font-weight: 500; color: var(--ink);
border: 1px solid var(--hair); border-radius: 10px; padding: 10px 12px; background: var(--soft);
}
textarea { min-height: 72px; resize: vertical; }
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) {
.grid { 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" class="active">Ways to use</a>
<a href="developers.html">Developers</a>
<a href="macos.html">macOS</a>
<a href="explorer.html">Explorer</a>
<a href="windows.html">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>
<main>
<section class="hero">
<p class="eyebrow">Same MCP · many clients</p>
<h1>Ways to use Verae timestamps</h1>
<p class="lede">Hash locally; stamp digests only against the public Streamable HTTP endpoint. Start with <strong>AI MCP</strong>, then choose a browser, Mac/Windows UI, CLI, JS, or curl client. File bytes never upload.</p>
<hr class="gold">
</section>
<div class="wrap">
<section id="list">
<div class="grid">
<article class="card featured" id="ai-mcp">
<p class="step">1 · Start here</p>
<h3>AI MCP</h3>
<p>Point Claude.ai, ChatGPT, Grok, Claude Desktop, or Cursor at <code id="mcp-url">https://mcp.verae.ai/mcp</code>. The assistant calls <code>stamp</code> / <code>verify</code> / <code>hash_report</code>. First connect may open Verae browser login.</p>
<div class="btn-row">
<a class="btn" href="index.html#connectors">Connectors by host</a>
<a class="btn secondary" href="index.html#connect">mcp.json snippet</a>
</div>
</article>
<article class="card" id="browser">
<p class="step">2 · Browser</p>
<h3>Browser app</h3>
<p>Full Register / Verify client in the browser (WASM hash, auth defaults, CSV / JSON / PDF / text). Digests only.</p>
<div class="btn-row">
<a class="btn" href="app.html">Open browser app</a>
<a class="btn secondary" href="register.html">Multi-doc register</a>
<a class="btn secondary" href="sample.html">MCP sample</a>
</div>
</article>
<article class="card" id="explorer">
<p class="step">2 · Explorer</p>
<h3>Verify receipt or file hash</h3>
<p>Public lookup: paste a receipt CID, SHA-256, or drop a file (hashed in-browser). On-chain merkle opens in the <a href="https://explorer.verae.ai/">blockchain explorer</a>.</p>
<div class="btn-row">
<a class="btn" href="explorer.html">Timestamp explorer</a>
<a class="btn secondary" href="https://explorer.verae.ai/" target="_blank" rel="noopener">Chain explorer</a>
</div>
</article>
<article class="card featured" id="mac-ui">
<p class="step">3 · UI · Mac</p>
<h3>macOS direct download</h3>
<p>Native SwiftUI <strong>Verae Timestamping</strong> — Developer ID signed, <strong>Apple-notarized</strong> universal zip. No TestFlight. Download → unzip → Open.</p>
<div class="btn-row">
<a class="btn" href="macos.html">macOS download page</a>
<a class="btn secondary" href="/downloads/macos/VeraeTimestamping-macos-universal.zip">.app zip</a>
<a class="btn secondary" href="#testflight">TestFlight invite</a>
</div>
<p class="meta">Gatekeeper: Notarized Developer ID · macOS 14+ · quarantine clear only if a download flag still blocks Open.</p>
</article>
<article class="card" id="windows-ui">
<p class="step">3 · UI · Windows</p>
<h3>Windows GUI</h3>
<p>Frozen amd64 EXEs — PySide6 GUI, CLI, optional hasher. SmartScreen warns (not code-signed); verify SHA-256 first.</p>
<div class="btn-row">
<a class="btn" href="windows.html">Windows download page</a>
<a class="btn secondary" href="/downloads/windows/verae-timestamp-gui.exe">GUI EXE</a>
</div>
</article>
<article class="card" id="cli">
<p class="step">4 · CLI</p>
<h3>Command line</h3>
<p>Official Python client: hash locally, stamp via MCP, write receipts under <code>~/.verae/receipts/</code>. On Windows use <code>verae-timestamp.exe</code>.</p>
<pre id="cli-snip">uvx verae-mcp-timestamping-client \
--url https://mcp.verae.ai/mcp \
--scope global \
./document.pdf</pre>
<div class="btn-row">
<a class="btn secondary" href="index.html#apps">More CLI notes</a>
<a class="btn secondary" href="windows.html#cli">Windows CLI</a>
</div>
</article>
<article class="card" id="js">
<p class="step">5 · JavaScript</p>
<h3>Embed with fetch</h3>
<p>Any web app: WASM/WebCrypto hash in-page, then <code>POST</code> Streamable HTTP JSON-RPC to <code>/mcp</code> (CORS <code>*</code>). Session id from <code>Mcp-Session-Id</code>.</p>
<div class="btn-row">
<a class="btn" href="index.html#apps">JS snippet on Install</a>
<a class="btn secondary" href="app.html">See live client</a>
</div>
</article>
<article class="card" id="curl">
<p class="step">6 · curl</p>
<h3>Raw JSON-RPC</h3>
<p><code>initialize</code> → <code>notifications/initialized</code> → <code>tools/call</code> (<code>stamp</code>, <code>verify</code>, <code>hash_report</code>). Include <code>Accept: application/json, text/event-stream</code>.</p>
<div class="btn-row">
<a class="btn" href="index.html#apps">curl examples</a>
<a class="btn secondary" href="developers.html#curl-mcp">Developers curl</a>
</div>
</article>
<article class="card featured" id="application-client">
<p class="step">7 · Application Client</p>
<h3>Application Client / OpenAPI</h3>
<p>Non-AI apps: Python &amp; TypeScript SDKs, digests-only OpenAPI, curl to VeraeTime (global) or MCP (local/shared). Logical SDK paths — not REST routes on this host.</p>
<div class="btn-row">
<a class="btn" href="developers.html">Developers page</a>
<a class="btn secondary" href="openapi/application-client.yaml">OpenAPI YAML</a>
</div>
</article>
<article class="card" id="hasher">
<p class="step">Also</p>
<h3>Local hasher · uvx server</h3>
<p>Download <code>verae-sha256</code> for your OS, or hash in-browser with WASM. Optional local MCP: <code>uvx verae-mcp-timestamping-server</code> and <code>… setup</code> for machine login.</p>
<div class="btn-row">
<a class="btn secondary" href="index.html#hasher">Get hasher</a>
<a class="btn secondary" href="hasher.html">WASM hasher</a>
<a class="btn secondary" href="index.html#register">Machine login</a>
</div>
</article>
</div>
</section>
<section id="downloads">
<h2 class="section">Downloads hub</h2>
<p class="section-note">Stable artifact URLs on this host. macOS zip is Developer ID + notarized (not MAS).</p>
<div class="btn-row">
<a class="btn" href="explorer.html">Timestamp explorer</a>
<a class="btn" href="macos.html">macOS direct download</a>
<a class="btn" href="windows.html">Windows GUI + CLI</a>
<a class="btn secondary" href="/downloads/macos/SHA256SUMS">macOS SHA256SUMS</a>
<a class="btn secondary" href="/downloads/windows/SHA256SUMS">Windows SHA256SUMS</a>
<a class="btn secondary" href="/hasher/latest.json">Hasher latest.json</a>
<a class="btn secondary" href="#testflight">Mac TestFlight</a>
</div>
</section>
<section id="macos-direct">
<h2 class="section">macOS direct download (no TestFlight)</h2>
<p class="section-note">Universal <strong>Verae Timestamping.app</strong> (v0.2.1 / build 7), signed <em>Developer ID Application: FlightLookup Inc.</em> and Apple-notarized with staple. Gatekeeper accepts as <em>Notarized Developer ID</em>.</p>
<div class="card" style="margin-top:18px">
<ol style="padding-left:1.2rem;margin:0;color:var(--ink-soft);font-size:15px;max-width:48rem">
<li style="margin:0.45rem 0"><strong>Download</strong> <a href="/downloads/macos/VeraeTimestamping-macos-universal.zip"><code>VeraeTimestamping-macos-universal.zip</code></a> (~546&nbsp;KiB).</li>
<li style="margin:0.45rem 0"><strong>Unzip</strong> → drag the app to <code>/Applications</code> (optional).</li>
<li style="margin:0.45rem 0">If Gatekeeper still blocks a quarantined copy: right-click → <em>Open</em>, or run <code>xattr -dr com.apple.quarantine "/Applications/Verae Timestamping.app"</code>.</li>
<li style="margin:0.45rem 0"><strong>Open</strong> → first launch (MCP default <code>https://mcp.verae.ai/mcp</code>).</li>
</ol>
<div class="btn-row">
<a class="btn" href="macos.html">Full macOS instructions</a>
<a class="btn secondary" href="/downloads/macos/VeraeTimestamping-macos-universal.zip">Download zip</a>
<a class="btn secondary" href="/downloads/macos/SHA256SUMS">SHA256SUMS</a>
</div>
<p class="meta">CLI without the .app: <code>uv sync</code> then <code>uv run verae-timestamp …</code> in the client repo, or <code>uvx verae-mcp-timestamping-client</code> when published.</p>
</div>
</section>
<section id="testflight">
<h2 class="section">Request a macOS TestFlight invite</h2>
<p class="section-note">Optional App Store–style beta. Prefer the <a href="#macos-direct">direct notarized zip</a> if you do not want TestFlight. External testing still requires Apple Beta App Review — until that lands, invites are added manually for your Apple ID.</p>
<div class="card" style="margin-top:18px">
<h3 style="margin:0 0 8px;font-size:18px">Public join link</h3>
<p>When external Beta Review is approved, open:</p>
<p style="margin:10px 0"><a href="https://testflight.apple.com/join/dsHsyx2Z"><code>https://testflight.apple.com/join/dsHsyx2Z</code></a></p>
<p class="meta">If the link says the beta is full or unavailable, request an invite below.</p>
<div class="btn-row">
<a class="btn" href="https://testflight.apple.com/join/dsHsyx2Z">Open TestFlight join</a>
</div>
</div>
<div class="card" style="margin-top:18px">
<h3 style="margin:0 0 8px;font-size:18px">Request invite (Apple ID email)</h3>
<p>Submit the Apple ID email you use for TestFlight. The server adds you to the external testers group via App Store Connect and resends the invitation.</p>
<form id="tf-form">
<label class="field">Apple ID email
<input type="email" id="tf-email" required placeholder="you@example.com" autocomplete="email">
</label>
<label class="field">Optional note
<textarea id="tf-note" placeholder="Name, org, or why you need access"></textarea>
</label>
<div class="btn-row">
<button type="submit" class="btn" id="tf-submit">Request TestFlight invite</button>
<a class="btn secondary" href="mailto:marchon@gmail.com?subject=Verae%20Timestamping%20%E2%80%94%20macOS%20TestFlight%20invite%20request">Fallback: email marchon@gmail.com</a>
</div>
</form>
<p id="tf-status" class="meta" role="status" aria-live="polite" style="margin-top:14px"></p>
<p class="meta">Enrollment can succeed while the build is still <code>WAITING_FOR_BETA_REVIEW</code> — you may not see the app in TestFlight until Apple approves the beta.</p>
</div>
</section>
</div>
</main>
<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="developers.html">Developers</a> · <a href="macos.html">macOS</a>
<a href="windows.html">Windows</a> · <a href="app.html">Browser app</a> · <a href="https://testflight.apple.com/join/dsHsyx2Z">TestFlight</a></span>
</div>
</footer>
<script>
(function () {
var host = location.hostname || "mcp.verae.ai";
var mcpUrl = "https://" + host + "/mcp";
var el = document.getElementById("mcp-url");
if (el) el.textContent = mcpUrl;
var snip = document.getElementById("cli-snip");
if (snip) snip.textContent = snip.textContent.replaceAll("https://mcp.verae.ai/mcp", mcpUrl);
var form = document.getElementById("tf-form");
var status = document.getElementById("tf-status");
var submit = document.getElementById("tf-submit");
var endpoint = (location.origin && location.origin.indexOf("http") === 0)
? (location.origin + "/api/testflight-invite")
: "https://mcp.verae.ai/api/testflight-invite";
function setStatus(msg, ok) {
if (!status) return;
status.textContent = msg;
status.style.color = ok === true ? "var(--ok)" : (ok === false ? "oklch(0.5 0.16 25)" : "var(--ink-mute)");
}
if (form) {
form.addEventListener("submit", async function (e) {
e.preventDefault();
var email = (document.getElementById("tf-email").value || "").trim();
var note = (document.getElementById("tf-note").value || "").trim();
if (!email) { setStatus("Enter an Apple ID email.", false); return; }
if (submit) submit.disabled = true;
setStatus("Enrolling via App Store Connect…", null);
try {
var res = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json", "Accept": "application/json" },
body: JSON.stringify({ email: email, note: note })
});
var data = {};
try { data = await res.json(); } catch (_) {}
if (res.ok && data.ok) {
var msg = "Invite requested for " + email + ". Check TestFlight / email from Apple.";
if (data.beta_review_note) msg += " " + data.beta_review_note;
if (data.join_url) msg += " Public join: " + data.join_url;
setStatus(msg, true);
} else {
setStatus((data && data.message) || ("Enrollment failed (" + res.status + "). Use the mailto fallback or try again."), false);
}
} catch (err) {
setStatus("Could not reach enrollment API. Use the mailto fallback to marchon@gmail.com.", false);
} finally {
if (submit) submit.disabled = false;
}
});
}
})();
</script>
</body>
</html>