Replace IF.Trace marketing site

This commit is contained in:
root 2025-12-31 21:32:46 +00:00
parent 05bc7089e3
commit 573e0accbc
118 changed files with 658 additions and 2169 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

After

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 KiB

After

Width:  |  Height:  |  Size: 689 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 474 KiB

After

Width:  |  Height:  |  Size: 485 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

After

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

After

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 KiB

After

Width:  |  Height:  |  Size: 689 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 473 KiB

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

After

Width:  |  Height:  |  Size: 515 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 KiB

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

After

Width:  |  Height:  |  Size: 515 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 KiB

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

View file

@ -12,6 +12,13 @@ This packet exists because many “AI browser / fetch” tools cannot load a liv
If you cannot fetch `https://infrafabric.io/` in your environment, use this packet instead. It contains the live URLs, the current plain-language intent, and screenshots. If you cannot fetch `https://infrafabric.io/` in your environment, use this packet instead. It contains the live URLs, the current plain-language intent, and screenshots.
## 0) Changelog (so reviewers can trust the packet)
- 2025-12-31: Added `Whitepaper` to the top nav.
- 2025-12-31: Added plain examples for offline bundles (light/standard/full).
- 2025-12-31: Added `Privacy` + `Terms` pages and linked them in the footer.
- 2025-12-31: Refreshed desktop/mobile screenshots in this packet.
## 1) What You Are Reviewing (plain description) ## 1) What You Are Reviewing (plain description)
IF.Trace is a small public website for a verification protocol. IF.Trace is a small public website for a verification protocol.
@ -56,7 +63,7 @@ Main routes (public):
- FR: `https://infrafabric.io/fr/` - FR: `https://infrafabric.io/fr/`
Header nav is intentionally minimal: Header nav is intentionally minimal:
- `Sector | Pricing | API` - `Sector | Pricing | API | Whitepaper`
## 5) Current “Home Page” Intent (the core promise) ## 5) Current “Home Page” Intent (the core promise)
@ -138,4 +145,3 @@ Please do not be polite. Assume we prefer accuracy over encouragement.
If you find yourself agreeing with everything, pause and look for weaknesses: If you find yourself agreeing with everything, pause and look for weaknesses:
- who would *not* trust this, and why? - who would *not* trust this, and why?
- what could be misunderstood and cause harm? - what could be misunderstood and cause harm?

View file

@ -53,6 +53,8 @@ const langSwitch =
<a class="hover:text-white" href="/pricing/">Pricing</a> <a class="hover:text-white" href="/pricing/">Pricing</a>
<span class="text-white/20" aria-hidden="true">|</span> <span class="text-white/20" aria-hidden="true">|</span>
<a class="hover:text-white" href="/api/">API</a> <a class="hover:text-white" href="/api/">API</a>
<span class="text-white/20" aria-hidden="true">|</span>
<a class="hover:text-white" href="/whitepaper/">Whitepaper</a>
</nav> </nav>
<a <a
class="inline-flex h-7 items-center justify-center rounded-md border border-white/10 bg-white/5 px-2 text-[11px] font-semibold text-white/70 hover:bg-white/10 hover:text-white" class="inline-flex h-7 items-center justify-center rounded-md border border-white/10 bg-white/5 px-2 text-[11px] font-semibold text-white/70 hover:bg-white/10 hover:text-white"
@ -69,6 +71,17 @@ const langSwitch =
<slot /> <slot />
</main> </main>
<footer class="mx-auto max-w-6xl px-4 pb-10 pt-12 text-xs text-white/50 sm:px-6">
<div class="flex flex-col items-start justify-between gap-4 border-t border-white/10 pt-6 sm:flex-row sm:items-center">
<div>© {new Date().getFullYear()} InfraFabric</div>
<div class="flex flex-wrap items-center gap-3">
<a class="hover:text-white/80" href="/privacy/">Privacy</a>
<span aria-hidden="true" class="text-white/20">|</span>
<a class="hover:text-white/80" href="/terms/">Terms</a>
</div>
</div>
</footer>
<a <a
href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact" href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact"
class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white" class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white"

View file

@ -8,169 +8,245 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
--- ---
<BaseLayout <BaseLayout
title="IF.Trace — Developers / API" title="IF.Trace — API"
description="Developer-facing overview of the IF.Trace public receipt surface: stable no-login URLs, HTML fallbacks for sandboxes, and offline verification bundles." description="Upload a file, get a SHA256, and receive a public receipt URL. Includes code examples and a live test page."
> >
<Hero <Hero
link={{ text: "Public receipt surface (no login)", href: "/", icon: "arrow-left" }} link={{ text: "Back to home", href: "/", icon: "arrow-left" }}
links={[ links={[
{ text: "See a live receipt", href: "https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n", target: "_blank", icon: "sparkles" }, { text: "Open console", href: "/console/login", icon: "lock" },
{ text: "Browse sectors", href: "/verticals/", icon: "layers" }, { text: "Read the whitepaper", href: "/whitepaper/", icon: "file-text" },
]} ]}
image={{ src: "/assets/iftrace-diagram.svg", alt: "Verification flow diagram (example)" }} image={{ src: "/assets/iftrace-diagram.svg", alt: "Upload → hash → receipt → share (example)" }}
> >
<p>Public receipt surface (no login)</p> <p>API</p>
<h1>Stable URLs, predictable verification.</h1> <h1>Upload a file. Get a receipt.</h1>
<p> <p>
IF.Trace is intentionally boring from a developer perspective: compute This is the practical page. Copy/paste the examples, run a real request, and share the receipt URL with a reviewer.
hashes, publish receipts, and keep the proof surface stable. The system is
designed for third parties who are not inside your network.
</p> </p>
</Hero> </Hero>
<Section aria-label="Verification meaning"> <Section aria-label="Quickstart">
<SectionContent class="items-center"> <SectionContent class="items-center">
<SectionProse class="text-center"> <SectionProse class="text-center">
<p>What “VERIFIED” means (black/white)</p> <p>Quickstart</p>
<h2>Integrity, not interpretation.</h2> <h2>Three steps.</h2>
<p>1) Login. 2) Create an API key. 3) Upload a file to <code>/api/v1/traces</code>.</p>
</SectionProse> </SectionProse>
</SectionContent> </SectionContent>
<SectionGrid class="@3xl:grid-cols-3"> <SectionGrid class="@3xl:grid-cols-3">
<Tile variant="floating"> <Tile variant="floating">
<TileContent> <TileContent>
<TileTitle class="text-xl">Verified</TileTitle> <TileTitle class="text-xl">1) Console</TileTitle>
<TileDescription> <TileDescription>Login and create an API key for your organization.</TileDescription>
The bytes you can download hash to the same values shown on the trace receipt. <div class="mt-4 flex flex-wrap gap-2">
</TileDescription> <Button size="sm" href="/console/login">
<Icon name="lock" />
Login
</Button>
<Button size="sm" variant="outline" href="/console/api-keys">
<Icon name="key" />
API keys
</Button>
</div>
</TileContent> </TileContent>
</Tile> </Tile>
<Tile variant="floating"> <Tile variant="floating">
<TileContent> <TileContent>
<TileTitle class="text-xl">Quantum ready</TileTitle> <TileTitle class="text-xl">2) Upload</TileTitle>
<TileDescription> <TileDescription>POST a file to <code>/api/v1/traces</code>.</TileDescription>
A postquantum signature receipt can be added (integrity hashes still stand). <pre class="mt-4 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">curl -fsS -X POST \\
</TileDescription> -H 'X-API-Key: &lt;your_key&gt;' \\
-F 'file=@./document.pdf' \\
-F 'expected_sha256=&lt;optional_expected_sha256&gt;' \\
https://infrafabric.io/api/v1/traces</pre>
</TileContent> </TileContent>
</Tile> </Tile>
<Tile variant="floating"> <Tile variant="floating">
<TileContent> <TileContent>
<TileTitle class="text-xl">Not implied</TileTitle> <TileTitle class="text-xl">3) Share</TileTitle>
<TileDescription>Compliance, intent, or correctness of interpretation.</TileDescription> <TileDescription>Send the receipt URL to the reviewer. No login required.</TileDescription>
<pre class="mt-4 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground"># Response includes:
receipt_url: https://infrafabric.io/api/v1/public/receipt/&lt;public_id&gt;</pre>
</TileContent> </TileContent>
</Tile> </Tile>
</SectionGrid> </SectionGrid>
</Section> </Section>
<Section variant="floating" aria-label="Share surface reference"> <Section variant="floating" aria-label="Live test">
<SectionContent class="gap-8 @5xl:grid @5xl:grid-cols-2 @5xl:items-start"> <SectionContent class="items-center">
<SectionProse> <SectionProse class="text-center">
<p>Share surface</p> <p>Live test</p>
<h2>Copy/pasteable proof links.</h2> <h2>Try an upload right now.</h2>
<p>These URLs are stable by design so review packs remain checkable later.</p> <p>Paste your API key, pick a file, optionally provide an expected SHA256, and run the call.</p>
</SectionProse> </SectionProse>
<div class="rounded-xl border bg-card p-6 text-card-foreground"> <div class="mt-8 w-full max-w-4xl rounded-xl border bg-card p-6 text-card-foreground">
<div class="text-sm font-semibold">Paths</div> <div class="@3xl:grid @3xl:grid-cols-2 @3xl:gap-6">
<pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground"> <form id="iftrace-upload" class="space-y-4">
https://infrafabric.io/static/trace/&lt;shareId&gt; <div>
https://infrafabric.io/static/dossier/&lt;shareId&gt; <div class="text-sm font-semibold">API key</div>
https://infrafabric.io/static/dossier/&lt;shareId&gt;/download <input
https://infrafabric.io/static/pack/&lt;shareId&gt;.md id="apiKey"
https://infrafabric.io/static/review/&lt;shareId&gt;.md class="mt-2 w-full rounded-lg border bg-muted px-3 py-2 text-sm text-foreground"
https://infrafabric.io/static/marketing/&lt;shareId&gt;.md placeholder="iftr_...."
https://infrafabric.io/static/source/&lt;source_sha256&gt;.pdf autocomplete="off"
</pre> />
</div> </div>
<div>
<div class="text-sm font-semibold">File</div>
<input id="file" type="file" class="mt-2 w-full text-sm" />
</div>
<div>
<div class="text-sm font-semibold">Expected SHA256 (optional)</div>
<input
id="expected"
class="mt-2 w-full rounded-lg border bg-muted px-3 py-2 text-sm text-foreground"
placeholder="64 hex characters"
autocomplete="off"
/>
</div>
<Button type="submit" class="w-full">
<Icon name="upload" />
Upload and verify
</Button>
<p class="text-xs text-white/60">
This endpoint returns <code>verified</code> only if you provide <code>expected_sha256</code>. Otherwise it returns the computed hash.
</p>
</form>
<div>
<div class="text-sm font-semibold">Result</div>
<pre
id="result"
class="mt-2 min-h-[220px] overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground"
>{"{}"}</pre>
<div id="receiptWrap" class="mt-3 hidden">
<a id="receiptUrl" class="text-sm text-primary hover:underline" href="#" target="_blank" rel="noreferrer"
>Open public receipt</a
>
</div>
</div>
</div>
</div>
<script is:inline>
function qs(id) {
return document.getElementById(id);
}
async function runUpload(ev) {
ev.preventDefault();
const apiKey = (qs("apiKey").value || "").trim();
const fileEl = qs("file");
const expected = (qs("expected").value || "").trim();
const out = qs("result");
const receiptWrap = qs("receiptWrap");
const receiptUrl = qs("receiptUrl");
receiptWrap.classList.add("hidden");
receiptUrl.href = "#";
if (!apiKey) {
out.textContent = JSON.stringify({ error: "Missing API key" }, null, 2);
return;
}
if (!fileEl.files || fileEl.files.length === 0) {
out.textContent = JSON.stringify({ error: "Pick a file" }, null, 2);
return;
}
const fd = new FormData();
fd.append("file", fileEl.files[0]);
if (expected) fd.append("expected_sha256", expected);
out.textContent = "Uploading…";
try {
const res = await fetch("/api/v1/traces", {
method: "POST",
headers: { "X-API-Key": apiKey },
body: fd,
});
const body = await res.json().catch(() => ({}));
out.textContent = JSON.stringify(body, null, 2);
if (body && body.receipt_url) {
receiptUrl.href = body.receipt_url;
receiptWrap.classList.remove("hidden");
}
} catch (e) {
out.textContent = JSON.stringify({ error: String(e || "Request failed") }, null, 2);
}
}
const form = document.getElementById("iftrace-upload");
if (form) form.addEventListener("submit", runUpload);
</script>
</SectionContent> </SectionContent>
</Section> </Section>
<Section aria-label="HTML fallback"> <Section aria-label="Code examples">
<SectionContent class="items-center"> <SectionContent class="items-center">
<SectionProse class="text-center"> <SectionProse class="text-center">
<p>HTML fallback</p> <p>Examples</p>
<h2>For sandboxed reviewers.</h2> <h2>Copy/paste for common platforms.</h2>
<p>
Some external review environments can load HTML but reject downloadable binaries or raw markdown. For those, we publish HTML views alongside the raw assets.
</p>
</SectionProse> </SectionProse>
</SectionContent>
<SectionGrid class="@3xl:grid-cols-2"> <SectionGrid class="@3xl:grid-cols-2">
<Tile variant="floating"> <Tile variant="floating">
<TileContent> <TileContent>
<TileTitle class="text-xl">Raw</TileTitle> <TileTitle class="text-xl">Python (requests)</TileTitle>
<pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground"> <pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">import requests
/static/pack/&lt;shareId&gt;.md
/static/review/&lt;shareId&gt;.md API_KEY = "iftr_..."
/static/marketing/&lt;shareId&gt;.md with open("document.pdf", "rb") as f:
</pre> res = requests.post(
"https://infrafabric.io/api/v1/traces",
headers=&#123;"X-API-Key": API_KEY&#125;,
files=&#123;"file": ("document.pdf", f, "application/pdf")&#125;,
data=&#123;"expected_sha256": ""&#125;, # optional
timeout=60,
)
print(res.status_code)
print(res.json())</pre>
</TileContent> </TileContent>
</Tile> </Tile>
<Tile variant="floating"> <Tile variant="floating">
<TileContent> <TileContent>
<TileTitle class="text-xl">HTML view</TileTitle> <TileTitle class="text-xl">Node.js (fetch)</TileTitle>
<pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground"> <pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">import fs from "node:fs";
/static/pack/&lt;shareId&gt;
/static/review/&lt;shareId&gt; const apiKey = "iftr_...";
/static/marketing/&lt;shareId&gt; const fd = new FormData();
</pre> fd.append("file", new Blob([fs.readFileSync("document.pdf")]), "document.pdf");
// fd.append("expected_sha256", ""); // optional
const res = await fetch("https://infrafabric.io/api/v1/traces", &#123;
method: "POST",
headers: &#123; "X-API-Key": apiKey &#125;,
body: fd,
&#125;);
console.log(res.status);
console.log(await res.json());</pre>
</TileContent> </TileContent>
</Tile> </Tile>
</SectionGrid> </SectionGrid>
</Section>
<Section variant="floating" aria-label="Offline verification">
<SectionContent class="gap-10 @5xl:grid @5xl:grid-cols-2 @5xl:items-start">
<SectionProse>
<p>Offline verification</p>
<h2>Triage bundles</h2>
<p>Download a bundle (light/standard/full) and verify without relying on the live site.</p>
</SectionProse>
<div class="space-y-4">
<div class="rounded-xl border bg-card p-6 text-card-foreground">
<div class="text-sm font-semibold">Bundle selector (demo)</div>
<div class="mt-3 space-y-2 text-sm">
<a class="block text-primary hover:underline" href="https://infrafabric.io/static/hosted/review/trace-bundles/d70ed99a/index.html" target="_blank" rel="noreferrer">
https://infrafabric.io/static/hosted/review/trace-bundles/d70ed99a/index.html
</a>
<a class="block text-primary hover:underline" href="https://infrafabric.io/static/hosted/iftrace.html" target="_blank" rel="noreferrer">
https://infrafabric.io/static/hosted/iftrace.html
</a>
<a class="block text-primary hover:underline" href="https://infrafabric.io/static/hosted/iftrace.py" target="_blank" rel="noreferrer">
https://infrafabric.io/static/hosted/iftrace.py
</a>
</div>
<p class="mt-3 text-xs text-white/60">
Note: some “web fetchers” reject <code class="rounded bg-white/5 px-1.5 py-0.5">.tar.gz</code> even when browsers/curl succeed. Use HTML views and download bundles locally.
</p>
</div>
<div class="rounded-xl border bg-card p-6 text-card-foreground">
<div class="text-sm font-semibold">Verify (CLI)</div>
<pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">
curl -fsSL -o iftrace.py 'https://infrafabric.io/static/hosted/iftrace.py'
python3 iftrace.py verify trace_bundle_&lt;id&gt;_standard.tar.gz --expected-sha256 &lt;sha256&gt;
</pre>
<p class="mt-3 text-xs text-white/60">If hashes match, the receipts integrity claim is satisfied.</p>
</div>
</div>
</SectionContent> </SectionContent>
</Section> </Section>
<Section aria-label="Docs"> <Section aria-label="Meaning of verified">
<SectionContent class="items-center"> <SectionContent class="items-center">
<SectionProse class="text-center"> <SectionProse class="text-center">
<p>Docs</p> <p>Meaning</p>
<h2>Review packs</h2> <h2>Integrity, not interpretation.</h2>
<p>Use the paper update as a reviewer-friendly packet.</p> <p>
“Verified” means the computed hash matched an expected hash you provided.
It does not mean “true”, “compliant”, or “approved”.
</p>
</SectionProse> </SectionProse>
<div class="mt-6 flex flex-wrap justify-center gap-3">
<Button href="https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html" target="_blank" rel="noreferrer">
<Icon name="file-text" />
IF.Trace paper update (review pack)
</Button>
</div>
</SectionContent> </SectionContent>
</Section> </Section>
</BaseLayout> </BaseLayout>

View file

@ -52,7 +52,7 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
}, },
{ {
title: "Fallback HTML", title: "Fallback HTML",
description: "Certains reviewers chargent du HTML mais refusent les téléchargements : on publie les deux.", description: "Version HTML de secours : certains reviewers chargent du HTML mais refusent les téléchargements, donc on publie les deux.",
icon: "file-text", icon: "file-text",
}, },
{ {
@ -102,4 +102,3 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
</p> </p>
</Content> </Content>
</BaseLayout> </BaseLayout>

View file

@ -18,17 +18,20 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
target: "_blank", target: "_blank",
icon: "sparkles", icon: "sparkles",
}, },
{ text: "Read the paper", href: "/whitepaper/", icon: "file-text" }, { text: "Read the whitepaper", href: "/whitepaper/", icon: "file-text" },
]} ]}
image={{ image={{
src: "/assets/iftrace-diagram.svg", src: "/assets/iftrace-diagram.svg",
alt: "Verification flow diagram (example)", alt: "Verification flow (example): 1) keep source private 2) hash output 3) publish receipt 4) third party verifies",
}} }}
> >
<p>IF.Transparent &gt; IF.Traceable &gt; IF.Trustworthy</p> <p>IF.Transparent &gt; IF.Traceable &gt; IF.Trustworthy</p>
<h1>IF.Trace</h1> <h1>IF.Trace</h1>
<p>Confidential work &gt; open verification.</p> <p>Proof for outsiders, without giving access.</p>
<p>Let a third party check integrity later, without joining your tools.</p> <p>
When an auditor, client, partner, or reviewer says “prove it”, the problem is not the hash.
The problem is access. IF.Trace gives you a public receipt they can verify without accounts.
</p>
</Hero> </Hero>
<Features <Features
@ -38,21 +41,21 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
]} ]}
items={[ items={[
{ {
title: "Nologin receipts", title: "One link to send",
description: description:
"Stable URLs that any third party can verify without accounts or access.", "A stable receipt URL you can paste into an email thread. No logins, no onboarding.",
icon: "shield-check", icon: "shield-check",
}, },
{ {
title: "Offline verification bundles", title: "Works in locked-down review rooms",
description: description:
"Triage bundles (light/standard/full) for review environments that cannot rely on the live site.", "If a reviewer cannot download files or cannot use your tools, give them HTML or an offline bundle (light/standard/full).",
icon: "package", icon: "package",
}, },
{ {
title: "Black/white integrity claims", title: "Clear yes / no result",
description: description:
"Clear yes/no checks: if the hashes match, its verified.", "If the bytes match the hashes on the receipt, it is verified. No extra claims.",
icon: "badge-check", icon: "badge-check",
}, },
{ {
@ -62,25 +65,24 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
icon: "file-text", icon: "file-text",
}, },
{ {
title: "Source → output binding", title: "Stops “what changed?” arguments",
description: description:
"Bind a confidential source to its derived output so the debate stays grounded.", "Bind a confidential source (e.g., internal report) to its derived output (e.g., public summary) so the debate stays grounded.",
icon: "link-2", icon: "link-2",
}, },
{ {
title: "Designed for audits", title: "Built for blame-heavy moments",
description: description:
"Proof that survives vendors, contractors, handoffs, and time.", "Proof that survives vendors, contractors, handoffs, and time.",
icon: "scale", icon: "scale",
}, },
]} ]}
> >
<p>What IF.Trace is</p> <p>What it is</p>
<h2>A verification layer for thirdparty pressure.</h2> <h2>A public receipt for a private workflow.</h2>
<p> <p>
When someone needs proof, the bottleneck is almost always the same: If you have ever lost days to “can you prove this existed then?” or “can you share access so we can check?”,
they cant be onboarded into your internal systems. IF.Trace keeps the proof IF.Trace is the simple alternative: keep the work private, publish a receipt for outsiders.
outside: stable links they can verify without accounts.
</p> </p>
</Features> </Features>
@ -102,7 +104,7 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
]} ]}
image={{ image={{
src: "/assets/iftrace-diagram.svg", src: "/assets/iftrace-diagram.svg",
alt: "Verification flow diagram (example)", alt: "Verification flow (example): 1) keep source private 2) hash output 3) publish receipt 4) third party verifies",
}} }}
> >
<p>How it works</p> <p>How it works</p>

View file

@ -1,68 +1,202 @@
--- ---
import Hero from "@/components/blocks/hero-1.astro"; import Hero from "@/components/blocks/hero-1.astro";
import Pricings from "@/components/blocks/pricings-1.astro"; import { Button } from "@/components/ui/button";
import { Icon } from "@/components/ui/icon";
import { Section, SectionContent, SectionGrid, SectionProse } from "@/components/ui/section";
import { Tile, TileActions, TileContent, TileDescription, TileTitle } from "@/components/ui/tile";
import BaseLayout from "@/layouts/BaseLayout.astro"; import BaseLayout from "@/layouts/BaseLayout.astro";
--- ---
<BaseLayout title="IF.Trace — Pricing" description="Simple pricing for IF.Trace (early access)."> <BaseLayout title="IF.Trace — Pricing" description="Simple pricing for IF.Trace: free, monthly, or payasyougo.">
<Hero <Hero
link={{ text: "Early access", href: "mailto:ds@infrafabric.io?subject=IF.Trace%20pricing", icon: "mail" }} link={{ text: "Questions", href: "mailto:ds@infrafabric.io?subject=IF.Trace%20pricing%20question", icon: "mail" }}
links={[ links={[
{ text: "Email for pricing", href: "mailto:ds@infrafabric.io?subject=IF.Trace%20pricing", icon: "mail" }, { text: "Email us", href: "mailto:ds@infrafabric.io?subject=IF.Trace%20pricing", icon: "mail" },
{ text: "Browse sectors", href: "/verticals/", icon: "layers" }, { text: "Browse sectors", href: "/verticals/", icon: "layers" },
]} ]}
image={{ src: "/assets/iftrace-diagram.svg", alt: "Verification flow diagram (example)" }} image={{ src: "/assets/iftrace-diagram.svg", alt: "Verification flow diagram (example)" }}
> >
<p>A simple model, on purpose</p> <p>Simple pricing, on purpose</p>
<h1>Pricing</h1> <h1>Pricing</h1>
<p>If you need auditready verification, we price by risk and responsibility.</p> <p>Pick the plan that matches your monthly volume. No jargon.</p>
</Hero> </Hero>
<Pricings <Section aria-label="Pricing">
items={[ <SectionContent>
{ <SectionProse class="text-center">
title: "Starter", <p>Choose a plan</p>
description: "Proof surface for one workflow.", <h2>Free, monthly, or payasyougo.</h2>
price: "Talk to us",
unit: "",
list: [
"Public proof links (no login)",
"Offline bundle pattern",
"Verification scope (black/white)",
],
links: [{ text: "Contact", href: "mailto:ds@infrafabric.io?subject=IF.Trace%20starter" }],
},
{
title: "Teams",
description: "Governance patterns + rollout support.",
price: "Talk to us",
unit: "",
list: [
"Triage bundle templates",
"Integration support",
"Basic evidence logging / trace IDs",
],
links: [{ text: "Contact", href: "mailto:ds@infrafabric.io?subject=IF.Trace%20teams" }],
},
{
title: "Enterprise / Regulated",
description: "High-stakes deployment support.",
price: "Talk to us",
unit: "",
list: [
"Audit-aligned proof surfaces",
"Offline-first reviewer flows",
"Hardening + review support",
],
links: [{ text: "Contact", href: "mailto:ds@infrafabric.io?subject=IF.Trace%20enterprise" }],
},
]}
>
<p>Early access</p>
<h2>We charge for setup, not for verification clicks.</h2>
<p> <p>
Setup + governance configuration, integration support, and proof-surface A “transaction” is one published receipt (a trace link) with a yes/no integrity result.
hardening. Third-party checking should stay cheap.
</p> </p>
</Pricings> </SectionProse>
<SectionGrid class="@3xl:grid-cols-3">
<Tile variant="floating" class="justify-between">
<TileContent>
<TileTitle class="text-xl">Free</TileTitle>
<TileDescription>Try it. Share a receipt. See if it fits your workflow.</TileDescription>
<div class="mt-4 flex items-end gap-2">
<div class="text-4xl font-semibold tracking-tight text-white">10</div>
<div class="pb-1 text-sm text-white/60">transactions / month</div>
</div>
<ul class="mt-4 space-y-2 text-sm text-white/75">
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />Public receipt pages (no login)</li>
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />HTML fallback for reviewers</li>
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />Best for testing and low volume</li>
</ul>
</TileContent>
<TileActions class="mt-auto w-full">
<Button class="w-full" size="sm" href="https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n" target="_blank" rel="noreferrer">
<Icon name="sparkles" />
See a live receipt
</Button>
</TileActions>
</Tile>
<Tile variant="floating" class="justify-between">
<TileContent>
<TileTitle class="text-xl">Monthly</TileTitle>
<TileDescription>Pick a monthly volume. The slider shows the price.</TileDescription>
<div class="mt-5 rounded-xl border border-white/10 bg-white/5 p-4">
<div class="flex items-center justify-between gap-3">
<div class="text-sm font-semibold text-white/85">Monthly volume</div>
<div class="text-xs text-white/60"><span id="plan-volume">100</span> / month</div>
</div>
<input
id="plan-slider"
type="range"
min="0"
max="3"
step="1"
value="0"
class="mt-4 w-full accent-orange-500"
aria-label="Monthly plan volume selector"
/>
<div class="mt-2 flex items-center justify-between text-[11px] text-white/55">
<span>100</span>
<span>1,000</span>
<span>10,000</span>
<span>25,000+</span>
</div>
<div class="mt-5 grid grid-cols-2 gap-3">
<div class="rounded-lg border border-white/10 bg-slate-950/40 p-3">
<div class="text-[11px] text-white/60">Price / month</div>
<div class="mt-1 text-2xl font-semibold tracking-tight text-white" id="plan-monthly">$9.99</div>
</div>
<div class="rounded-lg border border-white/10 bg-slate-950/40 p-3">
<div class="text-[11px] text-white/60">Effective price</div>
<div class="mt-1 text-2xl font-semibold tracking-tight text-white" id="plan-effective">$0.10</div>
<div class="text-[11px] text-white/50">per transaction</div>
</div>
</div>
</div>
<ul class="mt-4 space-y-2 text-sm text-white/75">
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />Includes everything in Free</li>
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />Designed for repeated external review</li>
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />Upgrade or switch to payasyougo anytime</li>
</ul>
</TileContent>
<TileActions class="mt-auto w-full">
<Button class="w-full" size="sm" href="mailto:ds@infrafabric.io?subject=IF.Trace%20monthly%20plan">
<Icon name="mail" />
Start monthly plan
</Button>
</TileActions>
</Tile>
<Tile variant="floating" class="justify-between">
<TileContent>
<TileTitle class="text-xl">Payasyougo</TileTitle>
<TileDescription>For irregular volume. No monthly commitment.</TileDescription>
<div class="mt-4 flex items-end gap-2">
<div class="text-4xl font-semibold tracking-tight text-white">$0.12</div>
<div class="pb-1 text-sm text-white/60">per transaction</div>
</div>
<ul class="mt-4 space-y-2 text-sm text-white/75">
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />Same receipt surface</li>
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />Good for spikes and seasonal workflows</li>
<li class="flex gap-2"><Icon name="check" class="mt-0.5" />No commitment</li>
</ul>
</TileContent>
<TileActions class="mt-auto w-full">
<Button class="w-full" size="sm" href="mailto:ds@infrafabric.io?subject=IF.Trace%20paygo">
<Icon name="mail" />
Enable payasyougo
</Button>
</TileActions>
</Tile>
</SectionGrid>
<div class="mx-auto mt-10 max-w-3xl text-sm text-white/70">
<p class="text-white/80 font-semibold">Notes</p>
<ul class="mt-2 list-disc space-y-1 pl-5">
<li>We may introduce fairuse limits (for example: unusually large files or unusually high download volume) to protect reliability.</li>
<li>We will warn you before applying any new overage pricing.</li>
</ul>
<p class="mt-4">
Terms: <a class="text-primary hover:underline" href="/terms/">/terms/</a>
</p>
</div>
</SectionContent>
</Section>
<script is:inline>
const tiers = [
{ volume: 100, monthly: 9.99, effective: 0.0999 },
{ volume: 1000, rate: 0.07 },
{ volume: 10000, rate: 0.06 },
{ volume: 25000, rate: 0.05, plus: true }
];
function money(n) {
return `$${n.toFixed(2)}`;
}
function money4(n) {
return `$${n.toFixed(2)}`;
}
function fmtVolume(n, plus) {
const s = n.toLocaleString("en-US");
return plus ? `${s}+` : s;
}
function initPricingSlider() {
const slider = document.getElementById("plan-slider");
if (!slider) return;
const volumeEl = document.getElementById("plan-volume");
const monthlyEl = document.getElementById("plan-monthly");
const effectiveEl = document.getElementById("plan-effective");
function render() {
const idx = Number(slider.value || 0);
const tier = tiers[idx] || tiers[0];
const volume = tier.volume;
const monthly = tier.monthly ?? (volume * (tier.rate ?? 0));
const effective = monthly / volume;
if (volumeEl) volumeEl.textContent = fmtVolume(volume, Boolean(tier.plus));
if (monthlyEl) monthlyEl.textContent = money(monthly);
if (effectiveEl) effectiveEl.textContent = money4(effective);
}
slider.addEventListener("input", render);
render();
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initPricingSlider);
} else {
initPricingSlider();
}
document.addEventListener("astro:page-load", initPricingSlider);
</script>
</BaseLayout> </BaseLayout>

View file

@ -0,0 +1,48 @@
---
import BaseLayout from "@/layouts/BaseLayout.astro";
---
<BaseLayout title="IF.Trace — Privacy" description="Privacy notes for IF.Trace.">
<section class="mx-auto max-w-3xl px-4 py-16 text-white/85 sm:px-6">
<h1 class="text-3xl font-semibold tracking-tight text-white">Privacy</h1>
<p class="mt-4 text-sm text-white/70">
IF.Trace is designed so third parties can verify integrity without being onboarded into your internal tools.
This page is a short, plain-English summary.
</p>
<div class="prose prose-invert mt-8 max-w-none prose-p:text-white/75">
<h2>Short version</h2>
<ul>
<li>We do not need to see your confidential content to publish a receipt.</li>
<li>Receipts are public pages by design. Do not put secrets in what you publish.</li>
</ul>
<h2>What IF.Trace is built to avoid</h2>
<ul>
<li>Reviewer accounts, logins, or access to your internal systems.</li>
<li>Collecting more personal data than needed to provide a proof surface.</li>
</ul>
<h2>What can appear on public receipts</h2>
<ul>
<li>Integrity hashes and identifiers used to verify bytes.</li>
<li>Links to published outputs (only what you choose to share).</li>
</ul>
<h2>What we may store</h2>
<ul>
<li>Contact emails when you request support or early access.</li>
<li>Technical logs needed to operate the service (for example: request timing and errors).</li>
</ul>
<h2>What we do not want</h2>
<ul>
<li>Private data that does not need to be public.</li>
<li>Secrets embedded in “proof” links.</li>
</ul>
<h2>Contact</h2>
<p>If you have questions about data handling for your workflow, email <a href="mailto:ds@infrafabric.io">ds@infrafabric.io</a>.</p>
</div>
</section>
</BaseLayout>

View file

@ -0,0 +1,60 @@
---
import BaseLayout from "@/layouts/BaseLayout.astro";
---
<BaseLayout title="IF.Trace — Terms" description="Terms notes for IF.Trace.">
<section class="mx-auto max-w-3xl px-4 py-16 text-white/85 sm:px-6">
<h1 class="text-3xl font-semibold tracking-tight text-white">Terms</h1>
<p class="mt-4 text-sm text-white/70">
Plain-English terms while IF.Trace is in early access. The intent is clarity, not fine print.
</p>
<div class="prose prose-invert mt-8 max-w-none prose-p:text-white/75">
<h2>What IF.Trace does (and does not) claim</h2>
<ul>
<li>IF.Trace can support byte-level integrity checks (hashes match = verified).</li>
<li>IF.Trace does not claim compliance, intent, or correctness of interpretation.</li>
</ul>
<h2>Definitions</h2>
<ul>
<li><strong>Transaction</strong>: one published receipt (a trace link) with a yes/no integrity result.</li>
<li><strong>Receipt</strong>: a public page that publishes the integrity hashes and what they apply to.</li>
</ul>
<h2>Pricing (early access)</h2>
<p>Current public pricing is described on <a href="/pricing/">/pricing/</a>.</p>
<ul>
<li>Free: 10 transactions per month.</li>
<li>Monthly plans: priced by the selected monthly volume tier.</li>
<li>Payasyougo: $0.12 per transaction.</li>
</ul>
<p>
We may change pricing over time. If we introduce new usage limits or overage pricing for existing users, we will
warn you before it applies.
</p>
<h2>Responsible use</h2>
<ul>
<li>Do not publish confidential content as “proof”. Publish hashes and receipts, not secrets.</li>
<li>Use offline bundles where reviewers cannot rely on live systems.</li>
<li>You are responsible for what you choose to publish or share via IF.Trace links.</li>
</ul>
<h2>Fair use and reliability</h2>
<p>
IF.Trace is designed to be simple and stable. If usage materially threatens reliability (for example: unusually
large files, unusually high download volume, or abusive automation), we may temporarily ratelimit or suspend
access. We will aim to contact you first when feasible.
</p>
<h2>Early access</h2>
<p>
IF.Trace is evolving. Features may change. Availability is besteffort unless you have a separate written agreement.
</p>
<h2>Contact</h2>
<p>Questions or requests: <a href="mailto:ds@infrafabric.io">ds@infrafabric.io</a>.</p>
</div>
</section>
</BaseLayout>

1
ifttt/404.html Normal file
View file

@ -0,0 +1 @@
<!DOCTYPE html><html lang="en" class="dark"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="theme-color" content="#0b1020"><link rel="canonical" href="http://localhost:4321/404/"><title>IF.Trace — Not found</title><meta name="description" content="Page not found."><meta property="og:title" content="IF.Trace — Not found"><meta property="og:description" content="Page not found."><meta property="og:type" content="website"><meta property="og:image" content="/assets/iftrace-og.svg"><meta name="twitter:card" content="summary_large_image"><link rel="icon" href="/assets/if-logo-simple.svg" type="image/svg+xml"><link rel="stylesheet" href="/assets/_astro/index.niIggI7A.css"></head> <body class="min-h-screen bg-background text-foreground"> <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10"> <div class="absolute inset-0 bg-[radial-gradient(1200px_circle_at_20%_0%,rgba(16,185,129,0.18),transparent_60%),radial-gradient(1200px_circle_at_90%_10%,rgba(59,130,246,0.14),transparent_55%),radial-gradient(900px_circle_at_30%_100%,rgba(244,63,94,0.10),transparent_55%)]"></div> <div class="absolute inset-0 bg-[linear-gradient(to_bottom,rgba(2,6,23,0.75),rgba(2,6,23,0.95))]"></div> <div class="absolute inset-0 opacity-[0.06] mix-blend-overlay [background-image:url('data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22300%22%20height=%22300%22%3E%3Cfilter%20id=%22n%22%3E%3CfeTurbulence%20type=%22fractalNoise%22%20baseFrequency=%220.8%22%20numOctaves=%224%22%20stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect%20width=%22300%22%20height=%22300%22%20filter=%22url(%23n)%22%20opacity=%220.5%22/%3E%3C/svg%3E')]"></div> </div> <header class="fixed left-0 right-0 top-0 z-50"> <div class="mx-auto max-w-6xl px-4 py-4 sm:px-6"> <div class="flex items-center justify-between rounded-2xl border border-white/10 bg-slate-950/40 px-4 py-3 backdrop-blur-md shadow-[0_20px_80px_rgba(0,0,0,0.35)] sm:px-6"> <a href="/" class="text-sm font-semibold tracking-tight text-white/90 hover:text-white">IF.Trace</a> <nav class="flex items-center gap-3 text-xs text-white/70 sm:gap-4"> <a class="hover:text-white" href="/verticals/">Sector</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/pricing/">Pricing</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/api/">API</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/whitepaper/">Whitepaper</a> </nav> <a class="hidden rounded-full border border-white/10 bg-white/5 px-3 py-1 text-xs font-medium text-white/80 hover:bg-white/10 hover:text-white sm:inline-flex" href="https://api.infrafabric.io/login">Login</a> </div> </div> </header> <main class="pt-28 sm:pt-32"> <div class="mx-auto w-full max-w-6xl px-4 sm:px-6 "> <section class="py-24"> <div class="mx-auto max-w-xl text-center"> <p class="text-xs font-medium uppercase tracking-[0.18em] text-white/55">404</p> <h1 class="mt-4 text-4xl font-semibold tracking-tight text-white/95 sm:text-5xl">Page not found</h1> <p class="mt-4 text-sm leading-relaxed text-white/70">If you expected a receipt link, make sure you have the exact URL.</p> <div class="mt-8 flex justify-center"> <a class="inline-flex items-center justify-center rounded-full px-4 py-2 text-sm font-medium transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background bg-primary text-primary-foreground hover:bg-primary/90 " href="/"> Return to home </a> </div> </div> </section> </div> </main> <a href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact" class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white">contact</a> </body></html>

View file

@ -1,80 +0,0 @@
<!DOCTYPE html><html lang="en" class="dark"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="theme-color" content="#0b1020"><link rel="canonical" href="https://infrafabric.io/about/"><title>IF.Trace — About</title><meta name="description" content="IF.Trace is a simple proof protocol: stable links, no logins, and clear yes/no integrity checks. This page explains who it helps, why it exists, and what it does (and doesnt) prove."><meta property="og:title" content="IF.Trace — About"><meta property="og:description" content="IF.Trace is a simple proof protocol: stable links, no logins, and clear yes/no integrity checks. This page explains who it helps, why it exists, and what it does (and doesnt) prove."><meta property="og:type" content="website"><meta property="og:image" content="https://infrafabric.io/assets/iftrace-og.svg"><meta name="twitter:card" content="summary_large_image"><link rel="icon" href="/assets/if-logo-simple.svg" type="image/svg+xml"><link rel="stylesheet" href="/assets/_astro/index.DjS-2tUw.css">
<style>[data-slot=section]{--section-width: var(--container, var(--breakpoint-xl));--section-py: calc(var(--spacing) * 12);--section-px: max( var(--gutter, 24px), calc((100cqw - var(--section-width)) / 2) )}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 6)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 8)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 24)}@media(min-width:1024px){[data-slot=section]{--section-py: calc(var(--spacing) * 16)}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 16)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 12)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 32)}}
[data-slot=tile]{--tile-padding: 0px}[data-slot=tile][data-variant=floating]{--tile-padding: 24px}
</style></head> <body class="min-h-screen bg-background text-foreground"> <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10"> <div class="absolute inset-0 bg-[radial-gradient(1200px_circle_at_20%_0%,rgba(16,185,129,0.18),transparent_60%),radial-gradient(1200px_circle_at_90%_10%,rgba(59,130,246,0.14),transparent_55%),radial-gradient(900px_circle_at_30%_100%,rgba(244,63,94,0.10),transparent_55%)]"></div> <div class="absolute inset-0 bg-[linear-gradient(to_bottom,rgba(2,6,23,0.75),rgba(2,6,23,0.95))]"></div> <div class="absolute inset-0 opacity-[0.06] mix-blend-overlay [background-image:url('data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22300%22%20height=%22300%22%3E%3Cfilter%20id=%22n%22%3E%3CfeTurbulence%20type=%22fractalNoise%22%20baseFrequency=%220.8%22%20numOctaves=%224%22%20stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect%20width=%22300%22%20height=%22300%22%20filter=%22url(%23n)%22%20opacity=%220.5%22/%3E%3C/svg%3E')]"></div> </div> <header class="fixed left-0 right-0 top-0 z-50"> <div class="mx-auto max-w-6xl px-4 py-4 sm:px-6"> <div class="flex items-center justify-between rounded-2xl border border-white/10 bg-slate-950/40 px-4 py-3 backdrop-blur-md shadow-[0_20px_80px_rgba(0,0,0,0.35)] sm:px-6"> <a href="/" class="text-sm font-semibold tracking-tight text-white/90 hover:text-white">IF.Trace</a> <div class="flex items-center gap-3 sm:gap-4"> <nav class="flex items-center gap-3 text-xs text-white/70 sm:gap-4" aria-label="Primary"> <a class="hover:text-white" href="/verticals/">Sector</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/pricing/">Pricing</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/api/">API</a> </nav> <a class="inline-flex h-7 items-center justify-center rounded-md border border-white/10 bg-white/5 px-2 text-[11px] font-semibold text-white/70 hover:bg-white/10 hover:text-white" href="/fr/" aria-label="Passer en français">FR</a> </div> </div> </div> </header> <main class="pt-28 sm:pt-32"> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <a data-slot="badge" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&#38;>svg]:pointer-events-none [&#38;>svg]:size-3 bg-secondary text-secondary-foreground [a&#38;]:hover:bg-secondary/90 border-transparent" href="/about/">Why this exists<svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
<path d="M14 2v4a2 2 0 0 0 2 2h4" />
<path d="M10 9H8" />
<path d="M16 13H8" />
<path d="M16 17H8" />
</svg></a> <div class="text-foreground w-full space-y-4 [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-4xl text-lg [&#38;_h1]:text-4xl @5xl:[&#38;_h1]:text-5xl [&#38;_h2]:text-4xl [&#38;_h3]:text-3xl [&#38;_h4]:text-2xl [&#38;_h5]:text-xl [&#38;_h6]:text-lg text-center text-balance"> <p>Why this exists</p> <h1>We built the skeleton first.</h1> <p>
Most systems produce answers and call that “governance”. IF.Trace starts
earlier: it produces receipts that a third party can verify without
joining your internal world.
</p> </div> <div class="relative z-10 flex flex-wrap gap-2 justify-center"><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-10 rounded-md px-6 has-[>svg]:px-4" href="https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n" target="_blank"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" />
<path d="M20 2v4" />
<path d="M22 4h-4" />
<circle cx="4" cy="20" r="2" />
</svg>Try a live trace</a><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 rounded-md px-6 has-[>svg]:px-4" href="/api/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m16 18 6-6-6-6" />
<path d="m8 6-6 6 6 6" />
</svg>Developer surface</a></div> </div> <div data-slot="section-media" class="relative flex items-center justify-center overflow-hidden rounded-lg *:size-full *:object-cover"> <img class="h-auto w-full" alt="Verification flow diagram (example)" src="/assets/iftrace-diagram.svg" sizes="(min-width: 1536px) 1536px, 100vw" priority="true"> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section" aria-label="Who / Why / What / Where / When / How"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base text-center"> <p>Who / Why / What / Where / When / How</p> <h2>A proof protocol you can show a stranger.</h2> </div> </div> <div class="grid w-full gap-6 grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(260px,1fr))] @3xl:grid-cols-2 @5xl:grid-cols-3"> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Who</h3> <p class="text-muted-foreground text-sm">
Teams who need to show proof to someone outside their network.
</p> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Why</h3> <p class="text-muted-foreground text-sm">
Because “trust us” fails the moment a reviewer asks for receipts.
</p> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">What</h3> <p class="text-muted-foreground text-sm">
Bind <code>source_sha256</code><code>output_sha256</code> under a stable trace receipt.
</p> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Where</h3> <p class="text-muted-foreground text-sm">
On a stable public share surface (no login): trace, dossier, packs, and source.
</p> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">When</h3> <p class="text-muted-foreground text-sm">
At publication time: the receipt is generated and can be verified later during disputes.
</p> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">How</h3> <p class="text-muted-foreground text-sm">
Hashes + receipts + optional offline bundles; nothing magical, just opposable proof.
</p> </div> </div> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background border shadow-md w-[calc(100%-2*var(--gutter,24px))] max-w-(--section-width) my-(--section-py) overflow-hidden rounded-xl" data-slot="section" data-variant="floating" aria-label="Traps to avoid"> <div class="relative z-10 flex flex-col gap-10 @5xl:grid @5xl:grid-cols-2 @5xl:items-start"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base"> <p>Traps</p> <h2>How receipts break.</h2> <p>These are common ways “open verification” quietly becomes theater.</p> </div> <div> <ul class="list-none space-y-2 p-0"> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Broken share surface:</strong> moving URLs or forcing login turns receipts into theater.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Mixing identifiers:</strong> <code>shareId</code> is public; <code>trace_id</code> is chainofcustody. Dont swap them.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>“Compliance” claims:</strong> receipts support audits; they do not guarantee scope or behavior.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Unverifiable artifacts:</strong> screenshots and PDFs are not gates unless bound to machinecheckable signals.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>WAF surprises:</strong> some clients can fetch HTML but reject binary downloads—publish HTML views.
</li> </ul> </div> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section" aria-label="What a receipt proves"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base text-center"> <p>Scope</p> <h2>What a receipt proves (and what it doesnt).</h2> </div> </div> <div class="grid w-full gap-6 grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(260px,1fr))] @5xl:grid-cols-2"> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Proves</h3> <ul class="mt-3 list-none space-y-2 p-0"> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Integrity binding: published bytes match receipt hashes.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Traceability: reviewers can point to stable, nologin receipts.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Replay: verification works during disputes (offline bundles when needed).
</li> </ul> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Does not prove</h3> <ul class="mt-3 list-none space-y-2 p-0"> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Intent, interpretation, or narrative “correctness”.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> That a control is effective—only that evidence exists and is bound to the record.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Compliance scope (people, policy, contracts); receipts are inputs to governance.
</li> </ul> </div> </div> </div> <div class="relative z-10 flex flex-wrap gap-2 justify-center"> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[>svg]:px-3" href="/whitepaper/"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
<path d="M14 2v4a2 2 0 0 0 2 2h4" />
<path d="M10 9H8" />
<path d="M16 13H8" />
<path d="M16 17H8" />
</svg>
Read the paper
</a> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg>
Verify the examples
</a> </div> </section> </main> <a href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact" class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white">contact</a> </body></html>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,5 @@
import{j as e}from"./jsx-runtime.ClP7wGfN.js";import{r as a}from"./index.DK-fsZOb.js";function j(r){try{return JSON.parse(r)}catch{return null}}function S(r){const[o,p]=a.useState(""),[l,b]=a.useState(""),[n,g]=a.useState(""),[d,w]=a.useState('{"kind":"report-summary","public_title":"Q4 review pack"}'),[i,c]=a.useState(null),[u,h]=a.useState(!1),x=a.useMemo(()=>{const t=j(d),s={source_sha256:l.trim(),output_sha256:n.trim()};return t&&typeof t=="object"&&(s.metadata=t),s},[d,n,l]),m=a.useMemo(()=>{const t=r.baseUrl.replace(/\/+$/,""),s=JSON.stringify(x).replace(/'/g,"'\\''");return`curl -sS -X POST ${t}/v1/trace \\
-H 'Authorization: Bearer $IFTRACE_API_KEY' \\
-H 'Content-Type: application/json' \\
-d '${s}'`},[x,r.baseUrl]);async function y(){h(!0),c(null);try{const t=r.baseUrl.replace(/\/+$/,""),s=await fetch(`${t}/v1/trace`,{method:"POST",headers:{"Content-Type":"application/json",...o.trim()?{Authorization:`Bearer ${o.trim()}`}:{}},body:JSON.stringify(x)}),f=await s.text();c({ok:s.ok,status:s.status,body:f})}catch(t){c({ok:!1,status:0,body:t?.message?String(t.message):String(t)})}finally{h(!1)}}return e.jsxs("div",{className:"rounded-2xl border border-white/10 bg-white/5 p-5 shadow-[0_16px_60px_rgba(0,0,0,0.35)]",children:[e.jsx("div",{className:"text-sm font-semibold text-white/90",children:"Try the endpoint"}),e.jsxs("p",{className:"mt-2 text-sm text-white/70",children:["This sends a real request to ",e.jsx("span",{className:"font-medium text-white/85",children:r.baseUrl}),". Use non-confidential hashes."]}),e.jsxs("div",{className:"mt-4 grid gap-3 sm:grid-cols-2",children:[e.jsxs("label",{className:"grid gap-1 text-xs text-white/70",children:["API key (optional)",e.jsx("input",{value:o,onChange:t=>p(t.target.value),placeholder:"IFTRACE_API_KEY",className:"rounded-xl border border-white/10 bg-slate-950/30 px-3 py-2 text-sm text-white/90 placeholder:text-white/35"})]}),e.jsx("div",{className:"hidden sm:block"}),e.jsxs("label",{className:"grid gap-1 text-xs text-white/70",children:["source_sha256",e.jsx("input",{value:l,onChange:t=>b(t.target.value),placeholder:"64-hex",className:"rounded-xl border border-white/10 bg-slate-950/30 px-3 py-2 text-sm text-white/90 placeholder:text-white/35"})]}),e.jsxs("label",{className:"grid gap-1 text-xs text-white/70",children:["output_sha256",e.jsx("input",{value:n,onChange:t=>g(t.target.value),placeholder:"64-hex",className:"rounded-xl border border-white/10 bg-slate-950/30 px-3 py-2 text-sm text-white/90 placeholder:text-white/35"})]}),e.jsxs("label",{className:"grid gap-1 text-xs text-white/70 sm:col-span-2",children:["metadata (JSON, optional)",e.jsx("textarea",{value:d,onChange:t=>w(t.target.value),rows:3,className:"rounded-xl border border-white/10 bg-slate-950/30 px-3 py-2 font-mono text-xs text-white/90 placeholder:text-white/35"})]})]}),e.jsxs("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row sm:items-center",children:[e.jsx("button",{type:"button",onClick:y,disabled:u,className:"inline-flex items-center justify-center rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-60",children:u?"Sending…":"Send request"}),e.jsx("button",{type:"button",onClick:()=>navigator.clipboard?.writeText(m),className:"inline-flex items-center justify-center rounded-full border border-white/12 bg-white/5 px-4 py-2 text-sm font-medium text-white/85 transition hover:bg-white/10 hover:text-white",children:"Copy curl"})]}),e.jsxs("div",{className:"mt-4",children:[e.jsx("div",{className:"text-xs font-medium uppercase tracking-wide text-white/50",children:"curl"}),e.jsx("pre",{className:"mt-2 overflow-x-auto rounded-2xl border border-white/10 bg-slate-950/40 p-4 text-xs text-white/85",children:e.jsx("code",{children:m})})]}),i&&e.jsxs("div",{className:"mt-4",children:[e.jsx("div",{className:"text-xs font-medium uppercase tracking-wide text-white/50",children:"Response"}),e.jsx("pre",{className:"mt-2 overflow-x-auto rounded-2xl border border-white/10 bg-slate-950/40 p-4 text-xs text-white/85",children:e.jsxs("code",{children:[i.ok?"OK":"FAIL"," status=",i.status,`
`,i.body]})})]})]})}export{S as ApiTryForm};

View file

@ -0,0 +1 @@
import{j as e}from"./jsx-runtime.ClP7wGfN.js";import{r as h}from"./index.DK-fsZOb.js";function n(t){return Number.isFinite(t)?new Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}).format(t):"$0.00"}function g(t){const i=h.useMemo(()=>[...t.steps].sort((s,r)=>s.receipts-r.receipts),[t.steps]),[l,c]=h.useState(0),a=i[Math.min(Math.max(l,0),i.length-1)],p=a.unitUsd,o=a.receipts,d=a.monthlyUsd,x=o*t.paygUnitUsd,m=x-d;return e.jsxs("div",{className:"rounded-2xl border border-white/10 bg-white/5 p-5 shadow-[0_16px_60px_rgba(0,0,0,0.35)]",children:[e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium uppercase tracking-wide text-white/50",children:"Monthly volume"}),e.jsxs("div",{className:"mt-1 text-2xl font-semibold tracking-tight text-white/90",children:[o.toLocaleString()," receipts"]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3 sm:grid-cols-3",children:[e.jsxs("div",{className:"rounded-xl border border-white/10 bg-slate-950/30 px-3 py-2",children:[e.jsx("div",{className:"text-[11px] text-white/60",children:"Unit price"}),e.jsx("div",{className:"mt-1 text-sm font-semibold text-white/90",children:n(p)})]}),e.jsxs("div",{className:"rounded-xl border border-white/10 bg-slate-950/30 px-3 py-2",children:[e.jsx("div",{className:"text-[11px] text-white/60",children:"Subscription"}),e.jsx("div",{className:"mt-1 text-sm font-semibold text-white/90",children:n(d)})]}),e.jsxs("div",{className:"hidden rounded-xl border border-white/10 bg-slate-950/30 px-3 py-2 sm:block",children:[e.jsx("div",{className:"text-[11px] text-white/60",children:"PAYG equivalent"}),e.jsx("div",{className:"mt-1 text-sm font-semibold text-white/90",children:n(x)})]})]})]}),e.jsxs("div",{className:"mt-5",children:[e.jsx("input",{"aria-label":"Select monthly receipt volume",className:"w-full accent-[oklch(var(--primary))]",type:"range",min:0,max:Math.max(0,i.length-1),step:1,value:l,onChange:s=>c(Number.parseInt(s.target.value,10))}),e.jsx("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:i.map((s,r)=>e.jsx("button",{type:"button",onClick:()=>c(r),className:"rounded-full border px-3 py-1 text-xs font-medium transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background "+(r===l?"border-white/25 bg-white/10 text-white":"border-white/10 bg-white/5 text-white/70 hover:bg-white/10 hover:text-white"),children:s.receipts.toLocaleString()},s.receipts))})]}),e.jsx("div",{className:"mt-4 text-sm text-white/70",children:m>0?e.jsxs("span",{children:["At this volume, subscription is about ",e.jsx("span",{className:"font-semibold text-white/90",children:n(m)})," less than PAYG."]}):e.jsx("span",{children:"At this volume, subscription and PAYG are within the same range."})})]})}export{g as PricingCalculator};

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-arrow-left"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m12 19-7-7 7-7" />
<path d="M19 12H5" />
</svg>

Before

Width:  |  Height:  |  Size: 344 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-arrow-right"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M5 12h14" />
<path d="m12 5 7 7-7 7" />
</svg>

Before

Width:  |  Height:  |  Size: 344 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-arrow-up-right"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg>

Before

Width:  |  Height:  |  Size: 346 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-badge-check"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z" />
<path d="m9 12 2 2 4-4" />
</svg>

Before

Width:  |  Height:  |  Size: 495 B

View file

@ -1,17 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-banknote"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<rect width="20" height="12" x="2" y="6" rx="2" />
<circle cx="12" cy="12" r="2" />
<path d="M6 12h.01M18 12h.01" />
</svg>

Before

Width:  |  Height:  |  Size: 411 B

View file

@ -1,20 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-bot"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 8V4H8" />
<rect width="16" height="12" x="4" y="8" rx="2" />
<path d="M2 14h2" />
<path d="M20 14h2" />
<path d="M15 13v2" />
<path d="M9 13v2" />
</svg>

Before

Width:  |  Height:  |  Size: 455 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-briefcase"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16" />
<rect width="20" height="14" x="2" y="6" rx="2" />
</svg>

Before

Width:  |  Height:  |  Size: 400 B

View file

@ -1,19 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-building-2"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 12h4" />
<path d="M10 8h4" />
<path d="M14 21v-3a2 2 0 0 0-4 0v3" />
<path d="M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2" />
<path d="M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16" />
</svg>

Before

Width:  |  Height:  |  Size: 523 B

View file

@ -1,15 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-check"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M20 6 9 17l-5-5" />
</svg>

Before

Width:  |  Height:  |  Size: 316 B

View file

@ -1,15 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-chevron-down"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m6 9 6 6 6-6" />
</svg>

Before

Width:  |  Height:  |  Size: 320 B

File diff suppressed because one or more lines are too long

View file

@ -1,15 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-cloud"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" />
</svg>

Before

Width:  |  Height:  |  Size: 352 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-code"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m16 18 6-6-6-6" />
<path d="m8 6-6 6 6 6" />
</svg>

Before

Width:  |  Height:  |  Size: 342 B

View file

@ -1,19 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-file-text"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
<path d="M14 2v4a2 2 0 0 0 2 2h4" />
<path d="M10 9H8" />
<path d="M16 13H8" />
<path d="M16 17H8" />
</svg>

Before

Width:  |  Height:  |  Size: 473 B

View file

@ -1,17 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-flask-conical"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2" />
<path d="M6.453 15h11.094" />
<path d="M8.5 2h7" />
</svg>

Before

Width:  |  Height:  |  Size: 468 B

View file

@ -1,19 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-gavel"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m14 13-8.381 8.38a1 1 0 0 1-3.001-3l8.384-8.381" />
<path d="m16 16 6-6" />
<path d="m21.5 10.5-8-8" />
<path d="m8 8 6-6" />
<path d="m8.5 7.5 8 8" />
</svg>

Before

Width:  |  Height:  |  Size: 456 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-heart-pulse"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5" />
<path d="M3.22 13H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27" />
</svg>

Before

Width:  |  Height:  |  Size: 512 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,9 @@
import{a as v}from"./index.DK-fsZOb.js";var i={exports:{}},t={};/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var p;function y(){if(p)return t;p=1;var a=v(),R=Symbol.for("react.element"),x=Symbol.for("react.fragment"),c=Object.prototype.hasOwnProperty,l=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,d={key:!0,ref:!0,__self:!0,__source:!0};function s(n,r,_){var e,o={},u=null,f=null;_!==void 0&&(u=""+_),r.key!==void 0&&(u=""+r.key),r.ref!==void 0&&(f=r.ref);for(e in r)c.call(r,e)&&!d.hasOwnProperty(e)&&(o[e]=r[e]);if(n&&n.defaultProps)for(e in r=n.defaultProps,r)o[e]===void 0&&(o[e]=r[e]);return{$$typeof:R,type:n,key:u,ref:f,props:o,_owner:l.current}}return t.Fragment=x,t.jsx=s,t.jsxs=s,t}var m;function O(){return m||(m=1,i.exports=y()),i.exports}var j=O();export{j};

View file

@ -1,20 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-landmark"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M10 18v-7" />
<path d="M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z" />
<path d="M14 18v-7" />
<path d="M18 18v-7" />
<path d="M3 22h18" />
<path d="M6 18v-7" />
</svg>

Before

Width:  |  Height:  |  Size: 527 B

View file

@ -1,17 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-layers"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" />
<path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" />
<path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" />
</svg>

Before

Width:  |  Height:  |  Size: 588 B

View file

@ -1,17 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-link-2"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M9 17H7A5 5 0 0 1 7 7h2" />
<path d="M15 7h2a5 5 0 1 1 0 10h-2" />
<line x1="8" x2="16" y1="12" y2="12" />
</svg>

Before

Width:  |  Height:  |  Size: 408 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-mail"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7" />
<rect x="2" y="4" width="20" height="16" rx="2" />
</svg>

Before

Width:  |  Height:  |  Size: 392 B

View file

@ -1,18 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-package"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z" />
<path d="M12 22V12" />
<polyline points="3.29 7 12 12 20.71 7" />
<path d="m7.5 4.27 9 5.15" />
</svg>

Before

Width:  |  Height:  |  Size: 525 B

View file

@ -1,19 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-scale"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" />
<path d="m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" />
<path d="M7 21h10" />
<path d="M12 3v18" />
<path d="M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2" />
</svg>

Before

Width:  |  Height:  |  Size: 508 B

View file

@ -1,16 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-shield-check"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
<path d="m9 12 2 2 4-4" />
</svg>

Before

Width:  |  Height:  |  Size: 499 B

View file

@ -1,15 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-shield"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
</svg>

Before

Width:  |  Height:  |  Size: 464 B

View file

@ -1,18 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-sparkles"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" />
<path d="M20 2v4" />
<path d="M22 4h-4" />
<circle cx="4" cy="20" r="2" />
</svg>

Before

Width:  |  Height:  |  Size: 647 B

View file

@ -1,19 +0,0 @@
<!-- @license lucide-static v0.546.0 - ISC -->
<svg
class="lucide lucide-truck"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2" />
<path d="M15 18H9" />
<path d="M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14" />
<circle cx="17" cy="18" r="2" />
<circle cx="7" cy="18" r="2" />
</svg>

Before

Width:  |  Height:  |  Size: 545 B

View file

@ -1,92 +0,0 @@
Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION AND CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View file

@ -1,60 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" fill="none">
<svg <rect width="120" height="120" rx="28" fill="#0b1020"/>
xmlns="http://www.w3.org/2000/svg" <path d="M30 40h60v12H66v38H54V52H30V40Z" fill="#ffffff" opacity="0.92"/>
width="1024" <path d="M30 40h24v12H30V40Z" fill="#ff6a00" opacity="0.95"/>
height="1024"
viewBox="0 0 512 512"
role="img"
aria-labelledby="title desc"
>
<title id="title">if. mark</title>
<desc id="desc">Stylized “if.” mark with subtle gradient and shadow.</desc>
<defs>
<linearGradient id="ifBlue" x1="70" y1="0" x2="440" y2="0" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#0b253b" />
<stop offset="0.44" stop-color="#164d7a" />
<stop offset="0.56" stop-color="#1b5a8e" />
<stop offset="1" stop-color="#0b253b" />
</linearGradient>
<filter id="ifShadow" x="-40%" y="-40%" width="180%" height="180%">
<feOffset in="SourceAlpha" dx="0" dy="14" result="off" />
<feGaussianBlur in="off" stdDeviation="12" result="blur" />
<feColorMatrix
in="blur"
type="matrix"
values="0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0.28 0"
result="shadow"
/>
<feMerge>
<feMergeNode in="shadow" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<!--
Mark group:
- i (stem + dot)
- f (stem + top bar + crossbar)
- period dot
-->
<g filter="url(#ifShadow)" transform="translate(75 15)" fill="url(#ifBlue)">
<!-- i -->
<circle cx="35" cy="125" r="32" />
<rect x="0" y="170" width="70" height="220" rx="8" />
<!-- f -->
<rect x="120" y="140" width="86" height="250" rx="10" />
<rect x="120" y="110" width="150" height="90" rx="45" />
<rect x="120" y="240" width="140" height="80" rx="28" />
<!-- . -->
<circle cx="330" cy="358" r="32" />
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 281 B

View file

@ -1,73 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="900" viewBox="0 0 1600 900" fill="none" role="img" aria-label="IF.Trace verification flow diagram">
<defs>
<linearGradient id="g" x1="240" y1="180" x2="1360" y2="720" gradientUnits="userSpaceOnUse">
<stop stop-color="#60A5FA" stop-opacity="0.95" />
<stop offset="0.5" stop-color="#34D399" stop-opacity="0.85" />
<stop offset="1" stop-color="#F472B6" stop-opacity="0.85" />
</linearGradient>
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="10" result="b" />
<feColorMatrix
in="b"
type="matrix"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.35 0"
/>
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<style>
.card { fill: rgba(2,6,23,0.35); stroke: rgba(255,255,255,0.10); }
.title { fill: rgba(255,255,255,0.92); font: 600 28px ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji"; }
.sub { fill: rgba(255,255,255,0.70); font: 500 18px ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial; }
.mono { fill: rgba(255,255,255,0.75); font: 500 16px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
.stroke { stroke: rgba(226,232,240,0.70); stroke-width: 2.5; }
</style>
</defs>
<rect x="0" y="0" width="1600" height="900" rx="36" fill="rgba(2,6,23,0.08)" />
<path
d="M250 740 C 520 560, 740 600, 920 420 C 1080 260, 1240 260, 1360 180"
stroke="url(#g)"
stroke-width="10"
stroke-linecap="round"
stroke-opacity="0.35"
filter="url(#glow)"
/>
<g>
<rect class="card" x="190" y="160" width="360" height="170" rx="22" />
<text class="title" x="230" y="218">1) Keep it private</text>
<text class="sub" x="230" y="254">You hold the source.</text>
<text class="mono" x="230" y="292">source_sha256</text>
</g>
<g>
<rect class="card" x="620" y="220" width="360" height="170" rx="22" />
<text class="title" x="660" y="278">2) Hash the output</text>
<text class="sub" x="660" y="314">What you will share.</text>
<text class="mono" x="660" y="352">output_sha256</text>
</g>
<g>
<rect class="card" x="1040" y="160" width="390" height="170" rx="22" />
<text class="title" x="1080" y="218">3) Publish a receipt</text>
<text class="sub" x="1080" y="254">No login required.</text>
<text class="mono" x="1080" y="292">/trace/…</text>
</g>
<g>
<rect class="card" x="900" y="540" width="530" height="190" rx="22" />
<text class="title" x="940" y="602">4) Third party verifies</text>
<text class="sub" x="940" y="638">They download bytes and compare hashes.</text>
<text class="mono" x="940" y="676">verified == (hashes match)</text>
</g>
<path class="stroke" d="M550 245 C 610 245, 600 260, 620 270" />
<path class="stroke" d="M980 270 C 1025 260, 1005 245, 1040 245" />
<path class="stroke" d="M1235 330 C 1235 400, 1170 450, 1100 540" />
<path class="stroke" d="M800 390 C 800 460, 880 500, 980 540" />
<text class="sub" x="190" y="800">Integrity claims only: byte-level verification, not interpretation.</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -1,49 +1,31 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630" fill="none" role="img" aria-label="IF.Trace — Open verification for confidential work"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" fill="none">
<defs> <defs>
<linearGradient id="bg" x1="0" y1="0" x2="1200" y2="630" gradientUnits="userSpaceOnUse"> <linearGradient id="bg" x1="0" y1="0" x2="1200" y2="630" gradientUnits="userSpaceOnUse">
<stop stop-color="#0B1020" /> <stop stop-color="#071225"/>
<stop offset="0.55" stop-color="#07122A" /> <stop offset="1" stop-color="#030712"/>
<stop offset="1" stop-color="#0B1020" />
</linearGradient> </linearGradient>
<linearGradient id="g" x1="210" y1="110" x2="980" y2="520" gradientUnits="userSpaceOnUse"> <radialGradient id="glow" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(300 90) rotate(20) scale(700 420)">
<stop stop-color="#60A5FA" /> <stop stop-color="#10b981" stop-opacity="0.22"/>
<stop offset="0.55" stop-color="#34D399" /> <stop offset="1" stop-color="#10b981" stop-opacity="0"/>
<stop offset="1" stop-color="#F472B6" /> </radialGradient>
</linearGradient> <radialGradient id="glow2" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(980 120) rotate(-8) scale(720 420)">
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%"> <stop stop-color="#3b82f6" stop-opacity="0.18"/>
<feGaussianBlur stdDeviation="18" result="b" /> <stop offset="1" stop-color="#3b82f6" stop-opacity="0"/>
<feColorMatrix </radialGradient>
in="b"
type="matrix"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.45 0"
/>
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<style>
.h1 { fill: rgba(255,255,255,0.96); font: 800 88px ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial; letter-spacing: -0.02em; }
.sub { fill: rgba(255,255,255,0.78); font: 600 30px ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial; }
.small { fill: rgba(255,255,255,0.68); font: 600 22px ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial; }
.mono { fill: rgba(226,232,240,0.80); font: 600 18px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
</style>
</defs> </defs>
<rect width="1200" height="630" fill="url(#bg)"/>
<rect x="0" y="0" width="1200" height="630" rx="44" fill="url(#bg)" /> <rect width="1200" height="630" fill="url(#glow)"/>
<rect width="1200" height="630" fill="url(#glow2)"/>
<path <g opacity="0.12">
d="M165 505 C 380 335, 520 360, 670 250 C 800 155, 930 160, 1040 105" <path d="M0 400C160 320 340 500 520 420C720 330 860 300 1200 370" stroke="#ffffff" stroke-width="2"/>
stroke="url(#g)" <path d="M0 460C200 380 320 520 540 450C760 380 900 360 1200 420" stroke="#ffffff" stroke-width="2"/>
stroke-width="12" </g>
stroke-linecap="round" <g>
stroke-opacity="0.45" <text x="92" y="300" font-family="ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial" font-size="86" font-weight="700" fill="#ffffff" opacity="0.96">IF.Trace</text>
filter="url(#glow)" <text x="92" y="360" font-family="ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial" font-size="28" fill="#e5e7eb" opacity="0.85">Confidential work → open verification.</text>
/> <text x="92" y="410" font-family="ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial" font-size="20" fill="#e5e7eb" opacity="0.7">No login. Black/white integrity checks. Optional offline bundles.</text>
<rect x="92" y="450" width="208" height="44" rx="22" fill="#ff6a00"/>
<text class="small" x="110" y="140">IF.Transparent &gt; IF.Traceable &gt; IF.Trustworthy</text> <text x="112" y="479" font-family="ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial" font-size="16" font-weight="600" fill="#0b1020">See a receipt</text>
<text class="h1" x="110" y="260">IF.Trace</text> </g>
<text class="sub" x="110" y="320">Confidential documents → open verification</text>
<text class="mono" x="110" y="390">source_sha256 → output_sha256 → /trace/…</text>
<text class="small" x="110" y="460">3rd party audit trails, without publishing the source.</text>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,72 +0,0 @@
[
{
"text": "Footnotes aren't decorations. They're load-bearing walls.",
"source": "IF.Trace paper (v2.3)",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "If there's no IF.Trace trace, it didn't happen—or shouldn't be trusted.",
"source": "IF.Trace doctrine",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "No trace, no trust. Simple as that.",
"source": "IF.Trace doctrine",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "Trust isn't claimed. It's proven.",
"source": "IF.Trace paper (v2.3)",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "We dont claim trust. We publish receipts.",
"source": "IF.Trace stance",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "Your auditor shouldnt need your credentials.",
"source": "IF.Trace public receipts",
"href": "https://infrafabric.io/static/hosted/ifttt/"
},
{
"text": "Third parties verify. We just publish the math.",
"source": "IF.Trace posture",
"href": "https://infrafabric.io/static/hosted/ifttt/"
},
{
"text": "Receipts must be readable and verifiable without credentials.",
"source": "IF.Trace public receipt surface",
"href": "https://infrafabric.io/static/hosted/ifttt/"
},
{
"text": "Design constraint: black/white clarity. No “maybe”.",
"source": "IF.Trace ops (full stack)",
"href": "https://infrafabric.io/static/hosted/ifttt/api/"
},
{
"text": "We do not claim “quantum-secure”. We claim “quantum-ready”.",
"source": "IF.Trace tech stack",
"href": "https://infrafabric.io/static/hosted/ifttt/api/"
},
{
"text": "The stenographer doesn't make the therapy cold. The stenographer makes it accountable.",
"source": "IF.emotion on IF.Trace",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "That's the moat.",
"source": "IF.Trace paper (v2.3)",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "The moat is not the AI. The moat is the proof.",
"source": "IF.Trace paper (v2.3)",
"href": "https://infrafabric.io/static/hosted/review/ifttt-paper-update/2025-12-28/review-pack.html"
},
{
"text": "If its not verifiable, label it as a gap. Do not endorse it.",
"source": "IF.Trace stance",
"href": "https://infrafabric.io/static/hosted/ifttt/"
}
]

View file

@ -1,39 +0,0 @@
<!DOCTYPE html><html lang="fr" class="dark"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="theme-color" content="#0b1020"><link rel="canonical" href="https://infrafabric.io/fr/governance/"><title>IF.Trace — Gouvernance ouverte</title><meta name="description" content="La gouvernance ouverte signifie quun tiers peut vérifier ce qui sest passé sans login. IF.Trace est lossature de reçus : trace, liens stables, bundles horsligne."><meta property="og:title" content="IF.Trace — Gouvernance ouverte"><meta property="og:description" content="La gouvernance ouverte signifie quun tiers peut vérifier ce qui sest passé sans login. IF.Trace est lossature de reçus : trace, liens stables, bundles horsligne."><meta property="og:type" content="website"><meta property="og:image" content="https://infrafabric.io/assets/iftrace-og.svg"><meta name="twitter:card" content="summary_large_image"><link rel="icon" href="/assets/if-logo-simple.svg" type="image/svg+xml"><link rel="stylesheet" href="/assets/_astro/index.DjS-2tUw.css">
<style>[data-slot=section]{--section-width: var(--container, var(--breakpoint-xl));--section-py: calc(var(--spacing) * 12);--section-px: max( var(--gutter, 24px), calc((100cqw - var(--section-width)) / 2) )}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 6)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 8)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 24)}@media(min-width:1024px){[data-slot=section]{--section-py: calc(var(--spacing) * 16)}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 16)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 12)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 32)}}
</style></head> <body class="min-h-screen bg-background text-foreground"> <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10"> <div class="absolute inset-0 bg-[radial-gradient(1200px_circle_at_20%_0%,rgba(16,185,129,0.18),transparent_60%),radial-gradient(1200px_circle_at_90%_10%,rgba(59,130,246,0.14),transparent_55%),radial-gradient(900px_circle_at_30%_100%,rgba(244,63,94,0.10),transparent_55%)]"></div> <div class="absolute inset-0 bg-[linear-gradient(to_bottom,rgba(2,6,23,0.75),rgba(2,6,23,0.95))]"></div> <div class="absolute inset-0 opacity-[0.06] mix-blend-overlay [background-image:url('data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22300%22%20height=%22300%22%3E%3Cfilter%20id=%22n%22%3E%3CfeTurbulence%20type=%22fractalNoise%22%20baseFrequency=%220.8%22%20numOctaves=%224%22%20stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect%20width=%22300%22%20height=%22300%22%20filter=%22url(%23n)%22%20opacity=%220.5%22/%3E%3C/svg%3E')]"></div> </div> <header class="fixed left-0 right-0 top-0 z-50"> <div class="mx-auto max-w-6xl px-4 py-4 sm:px-6"> <div class="flex items-center justify-between rounded-2xl border border-white/10 bg-slate-950/40 px-4 py-3 backdrop-blur-md shadow-[0_20px_80px_rgba(0,0,0,0.35)] sm:px-6"> <a href="/" class="text-sm font-semibold tracking-tight text-white/90 hover:text-white">IF.Trace</a> <div class="flex items-center gap-3 sm:gap-4"> <nav class="flex items-center gap-3 text-xs text-white/70 sm:gap-4" aria-label="Primary"> <a class="hover:text-white" href="/verticals/">Sector</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/pricing/">Pricing</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/api/">API</a> </nav> <a class="inline-flex h-7 items-center justify-center rounded-md border border-white/10 bg-white/5 px-2 text-[11px] font-semibold text-white/70 hover:bg-white/10 hover:text-white" href="/" aria-label="Switch to English">EN</a> </div> </div> </div> </header> <main class="pt-28 sm:pt-32"> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <a data-slot="badge" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&#38;>svg]:pointer-events-none [&#38;>svg]:size-3 bg-secondary text-secondary-foreground [a&#38;]:hover:bg-secondary/90 border-transparent" href="/fr/governance/">FR / Gouvernance<svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
<path d="m9 12 2 2 4-4" />
</svg></a> <div class="text-foreground w-full space-y-4 [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-4xl text-lg [&#38;_h1]:text-4xl @5xl:[&#38;_h1]:text-5xl [&#38;_h2]:text-4xl [&#38;_h3]:text-3xl [&#38;_h4]:text-2xl [&#38;_h5]:text-xl [&#38;_h6]:text-lg text-center text-balance"> <p>Gouvernance ouverte</p> <h1>Lisible par les gouvernés.</h1> <p>
Une “gouvernance” qui ne se lit quen interne nest pas une preuve.
IF.Trace publie des reçus stables, accessibles sans login, pour que des
tiers puissent vérifier lintégrité sans entrer dans votre réseau.
</p> </div> <div class="relative z-10 flex flex-wrap gap-2 justify-center"><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-10 rounded-md px-6 has-[>svg]:px-4" href="/api/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m16 18 6-6-6-6" />
<path d="m8 6-6 6 6 6" />
</svg>Surface publique</a><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 rounded-md px-6 has-[>svg]:px-4" href="https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n" target="_blank"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" />
<path d="M20 2v4" />
<path d="M22 4h-4" />
<circle cx="4" cy="20" r="2" />
</svg>Voir une trace</a></div> </div> <div data-slot="section-media" class="relative flex items-center justify-center overflow-hidden rounded-lg *:size-full *:object-cover"> <img class="h-auto w-full" alt="Schéma de vérification (exemple)" src="/assets/iftrace-diagram.svg" sizes="(min-width: 1536px) 1536px, 100vw" priority="true"> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background border shadow-md w-[calc(100%-2*var(--gutter,24px))] max-w-(--section-width) my-(--section-py) overflow-hidden rounded-xl" data-slot="section" data-variant="floating" aria-label="Stack de gouvernance (FR)"> <div class="relative z-10 flex flex-col gap-10 @5xl:grid @5xl:grid-cols-2 @5xl:items-start"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base"> <p>La stack</p> <h2>Où IF.Trace se place.</h2> </div> <div> <ul class="list-none space-y-2 p-0"> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>IF.Trace (reçus)</strong> : source_sha256 ↔ output_sha256, trace_id, shareId.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Revue</strong> : packs externes, critiques, disputes.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Contrôles</strong> : gates/stopconditions qui consomment ces reçus.</li> </ul> <div class="mt-6 flex flex-wrap gap-3"> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/hosted/gov/TRIAGE.md" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg> Politique de triage
</a> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/hosted/gov/PANEL.md" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg> Panel / revue externe
</a> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/hosted/gov/WITNESS.md" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg> Modèle “witness”
</a> </div> </div> </div> </section> <div class="mx-auto max-w-4xl px-6 pb-20 text-center"> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-9 px-4 py-2 has-[>svg]:px-3" href="/fr/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m12 19-7-7 7-7" />
<path d="M19 12H5" />
</svg> Retour (FR)</a> </div> </main> <a href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact" class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white">contact</a> </body></html>

View file

@ -1,74 +0,0 @@
<!DOCTYPE html><html lang="fr" class="dark"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="theme-color" content="#0b1020"><link rel="canonical" href="https://infrafabric.io/fr/"><title>IF.Trace — Vérification ouverte</title><meta name="description" content="IF.Trace permet à des tiers de vérifier un travail confidentiel sans login : liens stables, vérification oui/non, et bundles horsligne si besoin."><meta property="og:title" content="IF.Trace — Vérification ouverte"><meta property="og:description" content="IF.Trace permet à des tiers de vérifier un travail confidentiel sans login : liens stables, vérification oui/non, et bundles horsligne si besoin."><meta property="og:type" content="website"><meta property="og:image" content="https://infrafabric.io/assets/iftrace-og.svg"><meta name="twitter:card" content="summary_large_image"><link rel="icon" href="/assets/if-logo-simple.svg" type="image/svg+xml"><link rel="stylesheet" href="/assets/_astro/index.DjS-2tUw.css">
<style>[data-slot=tile]{--tile-padding: 0px}[data-slot=tile][data-variant=floating]{--tile-padding: 24px}
[data-slot=section]{--section-width: var(--container, var(--breakpoint-xl));--section-py: calc(var(--spacing) * 12);--section-px: max( var(--gutter, 24px), calc((100cqw - var(--section-width)) / 2) )}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 6)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 8)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 24)}@media(min-width:1024px){[data-slot=section]{--section-py: calc(var(--spacing) * 16)}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 16)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 12)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 32)}}
</style></head> <body class="min-h-screen bg-background text-foreground"> <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10"> <div class="absolute inset-0 bg-[radial-gradient(1200px_circle_at_20%_0%,rgba(16,185,129,0.18),transparent_60%),radial-gradient(1200px_circle_at_90%_10%,rgba(59,130,246,0.14),transparent_55%),radial-gradient(900px_circle_at_30%_100%,rgba(244,63,94,0.10),transparent_55%)]"></div> <div class="absolute inset-0 bg-[linear-gradient(to_bottom,rgba(2,6,23,0.75),rgba(2,6,23,0.95))]"></div> <div class="absolute inset-0 opacity-[0.06] mix-blend-overlay [background-image:url('data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22300%22%20height=%22300%22%3E%3Cfilter%20id=%22n%22%3E%3CfeTurbulence%20type=%22fractalNoise%22%20baseFrequency=%220.8%22%20numOctaves=%224%22%20stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect%20width=%22300%22%20height=%22300%22%20filter=%22url(%23n)%22%20opacity=%220.5%22/%3E%3C/svg%3E')]"></div> </div> <header class="fixed left-0 right-0 top-0 z-50"> <div class="mx-auto max-w-6xl px-4 py-4 sm:px-6"> <div class="flex items-center justify-between rounded-2xl border border-white/10 bg-slate-950/40 px-4 py-3 backdrop-blur-md shadow-[0_20px_80px_rgba(0,0,0,0.35)] sm:px-6"> <a href="/" class="text-sm font-semibold tracking-tight text-white/90 hover:text-white">IF.Trace</a> <div class="flex items-center gap-3 sm:gap-4"> <nav class="flex items-center gap-3 text-xs text-white/70 sm:gap-4" aria-label="Primary"> <a class="hover:text-white" href="/verticals/">Sector</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/pricing/">Pricing</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/api/">API</a> </nav> <a class="inline-flex h-7 items-center justify-center rounded-md border border-white/10 bg-white/5 px-2 text-[11px] font-semibold text-white/70 hover:bg-white/10 hover:text-white" href="/" aria-label="Switch to English">EN</a> </div> </div> </div> </header> <main class="pt-28 sm:pt-32"> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <a data-slot="badge" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&#38;>svg]:pointer-events-none [&#38;>svg]:size-3 bg-secondary text-secondary-foreground [a&#38;]:hover:bg-secondary/90 border-transparent" href="/api/">Sans login<svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M5 12h14" />
<path d="m12 5 7 7-7 7" />
</svg></a> <div class="text-foreground w-full space-y-4 [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-4xl text-lg [&#38;_h1]:text-4xl @5xl:[&#38;_h1]:text-5xl [&#38;_h2]:text-4xl [&#38;_h3]:text-3xl [&#38;_h4]:text-2xl [&#38;_h5]:text-xl [&#38;_h6]:text-lg text-center text-balance"> <p>IF.Transparent &gt; IF.Traceable &gt; IF.Trustworthy</p> <h1>IF.Trace</h1> <p>Travail confidentiel &gt; vérification ouverte.</p> <p>Permettre à un tiers de vérifier lintégrité plus tard, sans rejoindre vos outils.</p> </div> <div class="relative z-10 flex flex-wrap gap-2 justify-center"><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-10 rounded-md px-6 has-[>svg]:px-4" href="https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n" target="_blank"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" />
<path d="M20 2v4" />
<path d="M22 4h-4" />
<circle cx="4" cy="20" r="2" />
</svg>Voir une trace</a><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 rounded-md px-6 has-[>svg]:px-4" href="/whitepaper/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
<path d="M14 2v4a2 2 0 0 0 2 2h4" />
<path d="M10 9H8" />
<path d="M16 13H8" />
<path d="M16 17H8" />
</svg>Lire le livre blanc</a></div> </div> <div data-slot="section-media" class="relative flex items-center justify-center overflow-hidden rounded-lg *:size-full *:object-cover"> <img class="h-auto w-full" alt="Schéma de vérification (exemple)" src="/assets/iftrace-diagram.svg" sizes="(min-width: 1536px) 1536px, 100vw" priority="true"> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base text-center"> <p>Ce que cest</p> <h2>Une couche de vérification pour la pression externe.</h2> <p>
Quand quelquun demande une preuve, le problème est souvent le même :
il ne peut pas être onboardé dans vos systèmes. IF.Trace garde la preuve à lextérieur :
des liens stables que lon peut vérifier sans compte.
</p> </div> <div class="relative z-10 flex flex-wrap gap-2 justify-center"><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[>svg]:px-3" href="/verticals/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" />
<path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" />
<path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" />
</svg>Secteurs</a><a data-slot="button" class="focus-visible:border-ring text-foreground focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border shadow-xs h-9 px-4 py-2 has-[>svg]:px-3" href="/api/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m16 18 6-6-6-6" />
<path d="m8 6-6 6 6 6" />
</svg>Espace dev</a></div> </div> <div class="grid w-full gap-6 grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(260px,1fr))]"><div data-slot="tile" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 relative flex flex-col gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all [a]:hover:ring-accent/50 [a]:hover:bg-accent/50 rounded-sm bg-transparent [a]:hover:ring-12 items-center"> <div data-slot="tile-media" data-variant="icon" class="flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=tile-description]]/tile:translate-y-0.5 group-has-[[data-slot=tile-description]]/tile:self-start [&#38;_svg]:pointer-events-none transition-opacity duration-100 [&#38;:is(a:hover>&#38;)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&#38;_svg:not([class*='size-'])]:size-4"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
<path d="m9 12 2 2 4-4" />
</svg> </div> <div class="relative z-10 flex flex-col gap-3 items-center text-center text-balance"> <h3 class="leading-none font-semibold">Reçus sans login</h3> <p class="text-muted-foreground text-sm">Des liens stables quun tiers peut vérifier sans compte.</p> </div> </div><div data-slot="tile" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 relative flex flex-col gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all [a]:hover:ring-accent/50 [a]:hover:bg-accent/50 rounded-sm bg-transparent [a]:hover:ring-12 items-center"> <div data-slot="tile-media" data-variant="icon" class="flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=tile-description]]/tile:translate-y-0.5 group-has-[[data-slot=tile-description]]/tile:self-start [&#38;_svg]:pointer-events-none transition-opacity duration-100 [&#38;:is(a:hover>&#38;)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&#38;_svg:not([class*='size-'])]:size-4"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z" />
<path d="M12 22V12" />
<polyline points="3.29 7 12 12 20.71 7" />
<path d="m7.5 4.27 9 5.15" />
</svg> </div> <div class="relative z-10 flex flex-col gap-3 items-center text-center text-balance"> <h3 class="leading-none font-semibold">Bundles horsligne</h3> <p class="text-muted-foreground text-sm">Pour les environnements de revue qui ne peuvent pas dépendre du site.</p> </div> </div><div data-slot="tile" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 relative flex flex-col gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all [a]:hover:ring-accent/50 [a]:hover:bg-accent/50 rounded-sm bg-transparent [a]:hover:ring-12 items-center"> <div data-slot="tile-media" data-variant="icon" class="flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=tile-description]]/tile:translate-y-0.5 group-has-[[data-slot=tile-description]]/tile:self-start [&#38;_svg]:pointer-events-none transition-opacity duration-100 [&#38;:is(a:hover>&#38;)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&#38;_svg:not([class*='size-'])]:size-4"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z" />
<path d="m9 12 2 2 4-4" />
</svg> </div> <div class="relative z-10 flex flex-col gap-3 items-center text-center text-balance"> <h3 class="leading-none font-semibold">Oui / non</h3> <p class="text-muted-foreground text-sm">Si les hashes correspondent, cest vérifié.</p> </div> </div><div data-slot="tile" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 relative flex flex-col gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all [a]:hover:ring-accent/50 [a]:hover:bg-accent/50 rounded-sm bg-transparent [a]:hover:ring-12 items-center"> <div data-slot="tile-media" data-variant="icon" class="flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=tile-description]]/tile:translate-y-0.5 group-has-[[data-slot=tile-description]]/tile:self-start [&#38;_svg]:pointer-events-none transition-opacity duration-100 [&#38;:is(a:hover>&#38;)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&#38;_svg:not([class*='size-'])]:size-4"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
<path d="M14 2v4a2 2 0 0 0 2 2h4" />
<path d="M10 9H8" />
<path d="M16 13H8" />
<path d="M16 17H8" />
</svg> </div> <div class="relative z-10 flex flex-col gap-3 items-center text-center text-balance"> <h3 class="leading-none font-semibold">Fallback HTML</h3> <p class="text-muted-foreground text-sm">Certains reviewers chargent du HTML mais refusent les téléchargements : on publie les deux.</p> </div> </div><div data-slot="tile" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 relative flex flex-col gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all [a]:hover:ring-accent/50 [a]:hover:bg-accent/50 rounded-sm bg-transparent [a]:hover:ring-12 items-center"> <div data-slot="tile-media" data-variant="icon" class="flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=tile-description]]/tile:translate-y-0.5 group-has-[[data-slot=tile-description]]/tile:self-start [&#38;_svg]:pointer-events-none transition-opacity duration-100 [&#38;:is(a:hover>&#38;)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&#38;_svg:not([class*='size-'])]:size-4"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M9 17H7A5 5 0 0 1 7 7h2" />
<path d="M15 7h2a5 5 0 1 1 0 10h-2" />
<line x1="8" x2="16" y1="12" y2="12" />
</svg> </div> <div class="relative z-10 flex flex-col gap-3 items-center text-center text-balance"> <h3 class="leading-none font-semibold">Source → output</h3> <p class="text-muted-foreground text-sm">Relier une source confidentielle à son output, sans fuite.</p> </div> </div><div data-slot="tile" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 relative flex flex-col gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all [a]:hover:ring-accent/50 [a]:hover:bg-accent/50 rounded-sm bg-transparent [a]:hover:ring-12 items-center"> <div data-slot="tile-media" data-variant="icon" class="flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=tile-description]]/tile:translate-y-0.5 group-has-[[data-slot=tile-description]]/tile:self-start [&#38;_svg]:pointer-events-none transition-opacity duration-100 [&#38;:is(a:hover>&#38;)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&#38;_svg:not([class*='size-'])]:size-4"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" />
<path d="m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" />
<path d="M7 21h10" />
<path d="M12 3v18" />
<path d="M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2" />
</svg> </div> <div class="relative z-10 flex flex-col gap-3 items-center text-center text-balance"> <h3 class="leading-none font-semibold">Conçu pour la revue</h3> <p class="text-muted-foreground text-sm">Une preuve qui survit aux handoffs, aux fournisseurs et au temps.</p> </div> </div></div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section"> <div class="relative z-10 flex flex-col gap-y-8"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base"> <p>Comment ça marche</p> <h2>Une preuve sans permission.</h2> <p>
Loutput peut être public pendant que la source reste confidentielle.
La preuve reste simple et stable.
</p> </div> <ul class="list-disc space-y-2"><li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em]"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Gardez la source privée. Hashez-la localement.</li><li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em]"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Hashez loutput que vous allez partager.</li><li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em]"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Publiez un reçu qui relie source → output.</li><li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em]"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Partagez les liens. Un tiers vérifie sans login.</li></ul> <div class="relative z-10 flex flex-wrap gap-2"><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n" target="_blank"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg>Essayer la surface de reçus</a><a data-slot="button" class="focus-visible:border-ring text-foreground focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border shadow-xs h-9 px-4 py-2 has-[>svg]:px-3" href="/verticals/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" />
<path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" />
<path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" />
</svg>Secteurs</a></div> </div> <div data-slot="section-media" class="relative flex items-center justify-center overflow-hidden rounded-lg *:size-full *:object-cover"> <img class="h-auto w-full" alt="Schéma de vérification (exemple)" src="/assets/iftrace-diagram.svg" sizes="(min-width: 1536px) 1536px, 100vw"> </div> </section> </main> <a href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact" class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white">contact</a> </body></html>

View file

@ -1,95 +0,0 @@
<!DOCTYPE html><html lang="en" class="dark"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="theme-color" content="#0b1020"><link rel="canonical" href="https://infrafabric.io/governance/"><title>IF.Trace — Open Governance</title><meta name="description" content="Open governance means third parties can verify what happened without your login. IF.Trace is the receipt backbone: trace pages, stable no-login links, and offline bundles."><meta property="og:title" content="IF.Trace — Open Governance"><meta property="og:description" content="Open governance means third parties can verify what happened without your login. IF.Trace is the receipt backbone: trace pages, stable no-login links, and offline bundles."><meta property="og:type" content="website"><meta property="og:image" content="https://infrafabric.io/assets/iftrace-og.svg"><meta name="twitter:card" content="summary_large_image"><link rel="icon" href="/assets/if-logo-simple.svg" type="image/svg+xml"><link rel="stylesheet" href="/assets/_astro/index.DjS-2tUw.css">
<style>[data-slot=section]{--section-width: var(--container, var(--breakpoint-xl));--section-py: calc(var(--spacing) * 12);--section-px: max( var(--gutter, 24px), calc((100cqw - var(--section-width)) / 2) )}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 6)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 8)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 24)}@media(min-width:1024px){[data-slot=section]{--section-py: calc(var(--spacing) * 16)}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 16)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 12)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 32)}}
[data-slot=tile]{--tile-padding: 0px}[data-slot=tile][data-variant=floating]{--tile-padding: 24px}
</style></head> <body class="min-h-screen bg-background text-foreground"> <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10"> <div class="absolute inset-0 bg-[radial-gradient(1200px_circle_at_20%_0%,rgba(16,185,129,0.18),transparent_60%),radial-gradient(1200px_circle_at_90%_10%,rgba(59,130,246,0.14),transparent_55%),radial-gradient(900px_circle_at_30%_100%,rgba(244,63,94,0.10),transparent_55%)]"></div> <div class="absolute inset-0 bg-[linear-gradient(to_bottom,rgba(2,6,23,0.75),rgba(2,6,23,0.95))]"></div> <div class="absolute inset-0 opacity-[0.06] mix-blend-overlay [background-image:url('data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22300%22%20height=%22300%22%3E%3Cfilter%20id=%22n%22%3E%3CfeTurbulence%20type=%22fractalNoise%22%20baseFrequency=%220.8%22%20numOctaves=%224%22%20stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect%20width=%22300%22%20height=%22300%22%20filter=%22url(%23n)%22%20opacity=%220.5%22/%3E%3C/svg%3E')]"></div> </div> <header class="fixed left-0 right-0 top-0 z-50"> <div class="mx-auto max-w-6xl px-4 py-4 sm:px-6"> <div class="flex items-center justify-between rounded-2xl border border-white/10 bg-slate-950/40 px-4 py-3 backdrop-blur-md shadow-[0_20px_80px_rgba(0,0,0,0.35)] sm:px-6"> <a href="/" class="text-sm font-semibold tracking-tight text-white/90 hover:text-white">IF.Trace</a> <div class="flex items-center gap-3 sm:gap-4"> <nav class="flex items-center gap-3 text-xs text-white/70 sm:gap-4" aria-label="Primary"> <a class="hover:text-white" href="/verticals/">Sector</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/pricing/">Pricing</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/api/">API</a> </nav> <a class="inline-flex h-7 items-center justify-center rounded-md border border-white/10 bg-white/5 px-2 text-[11px] font-semibold text-white/70 hover:bg-white/10 hover:text-white" href="/fr/" aria-label="Passer en français">FR</a> </div> </div> </div> </header> <main class="pt-28 sm:pt-32"> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <a data-slot="badge" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&#38;>svg]:pointer-events-none [&#38;>svg]:size-3 bg-secondary text-secondary-foreground [a&#38;]:hover:bg-secondary/90 border-transparent" href="/governance/">Open governance<svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
<path d="m9 12 2 2 4-4" />
</svg></a> <div class="text-foreground w-full space-y-4 [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-4xl text-lg [&#38;_h1]:text-4xl @5xl:[&#38;_h1]:text-5xl [&#38;_h2]:text-4xl [&#38;_h3]:text-3xl [&#38;_h4]:text-2xl [&#38;_h5]:text-xl [&#38;_h6]:text-lg text-center text-balance"> <p>Open governance</p> <h1>Legible to the governed.</h1> <p>
“Governance” fails when its only legible inside your network. IF.Trace moves
the proof outside: stable, nologin receipts that third parties can verify
without joining your internal world.
</p> </div> <div class="relative z-10 flex flex-wrap gap-2 justify-center"><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-10 rounded-md px-6 has-[>svg]:px-4" href="https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n" target="_blank"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" />
<path d="M20 2v4" />
<path d="M22 4h-4" />
<circle cx="4" cy="20" r="2" />
</svg>Try a live trace</a><a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 rounded-md px-6 has-[>svg]:px-4" href="/api/"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m16 18 6-6-6-6" />
<path d="m8 6-6 6 6 6" />
</svg>Public share surface</a></div> </div> <div data-slot="section-media" class="relative flex items-center justify-center overflow-hidden rounded-lg *:size-full *:object-cover"> <img class="h-auto w-full" alt="Verification flow diagram (example)" src="/assets/iftrace-diagram.svg" sizes="(min-width: 1536px) 1536px, 100vw" priority="true"> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section" aria-label="What this page is"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base text-center"> <p>Black/white</p> <h2>What this page is (and is not).</h2> </div> </div> <div class="grid w-full gap-6 grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(260px,1fr))] @3xl:grid-cols-3"> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Goal</h3> <p class="text-muted-foreground text-sm">
Make thirdparty verification possible without credentials.
</p> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Mechanism</h3> <p class="text-muted-foreground text-sm">
Hashes + trace receipts + stable URLs + optional offline bundles.
</p> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Not implied</h3> <p class="text-muted-foreground text-sm">
“Compliance achieved” or “correctness of interpretation”.
</p> </div> </div> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background border shadow-md w-[calc(100%-2*var(--gutter,24px))] max-w-(--section-width) my-(--section-py) overflow-hidden rounded-xl" data-slot="section" data-variant="floating" aria-label="Governance stack"> <div class="relative z-10 flex flex-col gap-10 @5xl:grid @5xl:grid-cols-2 @5xl:items-start"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base"> <p>The governance stack</p> <h2>Where IF.Trace sits.</h2> <p>Receipts dont replace governance. They remove ambiguity from it.</p> </div> <div> <ul class="list-none space-y-2 p-0"> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Receipt layer (IF.Trace):</strong> integrity binding + chainofcustody IDs + share surface.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Review layer:</strong> external review packs, panel critique, dispute workflows.
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Enforcement layer:</strong> gates/stopconditions that consume receipts (CI, access, runtime).
</li> </ul> <div class="mt-6 rounded-xl border bg-card p-6 text-card-foreground"> <div class="text-sm font-semibold">Stable receipt surface</div> <pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">/static/trace/&lt;shareId&gt;
/static/dossier/&lt;shareId&gt;
/static/dossier/&lt;shareId&gt;/download
/static/pack/&lt;shareId&gt;.md
/static/review/&lt;shareId&gt;.md
/static/marketing/&lt;shareId&gt;.md
/static/source/&lt;source_sha256&gt;.pdf
</pre> </div> </div> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section" aria-label="For whom"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base text-center"> <p>For whom (and who will hate it)</p> <h2>Legible to outsiders.</h2> <p>A constitutional framing: the goal is external verifiability, not internal comfort.</p> </div> </div> <div class="grid w-full gap-6 grid-cols-1 sm:grid-cols-[repeat(auto-fit,minmax(260px,1fr))] @5xl:grid-cols-2"> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">For</h3> <ul class="mt-3 list-none space-y-2 p-0"> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>GRC / Audit leads</strong> drowning in evidence requests.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Security architects</strong> who need proof without theater.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Legal / compliance</strong> teams needing chainofcustody.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>AI product teams</strong> facing “why did it say that?” questions.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> <strong>Gov/defense contractors</strong> requiring offline verification.</li> </ul> </div> </div> <div data-slot="tile" data-variant="floating" class="group/tile focus-visible:border-ring focus-visible:ring-ring/50 [a]:hover:ring-accent/50 relative flex flex-col items-start gap-6 outline-none focus-visible:ring-[3px] [a]:transition-all bg-card text-card-foreground [a]:hover:bg-accent/50 overflow-hidden rounded-sm border p-6 shadow-sm duration-100"> <div class="relative z-10 flex flex-col gap-3"> <h3 class="font-semibold text-xl">Not for</h3> <ul class="mt-3 list-none space-y-2 p-0"> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Teams seeking a “badge” without publishing verifiable artifacts.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Workflows where evidence cannot leave the internal network.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Organizations that want uncertainty to stay hidden.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&#38;_svg]:shrink-0 [&#38;_svg]:translate-y-[30%] [&#38;_svg:not([class*='size-'])]:size-[1em] text-sm"><svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg> Anyone who needs governance to remain ambiguous.</li> </ul> </div> </div> </div> <div class="relative z-10 flex flex-wrap gap-2 justify-center"> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[>svg]:px-3" href="/whitepaper/"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
<path d="M14 2v4a2 2 0 0 0 2 2h4" />
<path d="M10 9H8" />
<path d="M16 13H8" />
<path d="M16 17H8" />
</svg>
Read the paper
</a> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-9 px-4 py-2 has-[>svg]:px-3" href="/verticals/"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" />
<path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" />
<path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" />
</svg>
Browse sectors
</a> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background border shadow-md w-[calc(100%-2*var(--gutter,24px))] max-w-(--section-width) my-(--section-py) overflow-hidden rounded-xl" data-slot="section" data-variant="floating" aria-label="Charters"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base text-center"> <p>Charters</p> <h2>How we keep it honest.</h2> <p>Plain Markdown docs: readable, linkable, easy to critique.</p> </div> <div class="mt-6 flex flex-wrap justify-center gap-3"> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/hosted/gov/TRIAGE.md" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg>
Triage policy
</a> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/hosted/gov/PANEL.md" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg>
Panel / external review
</a> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/hosted/gov/WITNESS.md" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg>
Witness model
</a> </div> </div> </section> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section" aria-label="Live example"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-3xl text-base [&#38;_h1]:text-4xl [&#38;_h2]:text-3xl [&#38;_h3]:text-2xl [&#38;_h4]:text-xl [&#38;_h5]:text-lg [&#38;_h6]:text-base text-center"> <p>Live example</p> <h2>A real trace receipt you can verify right now.</h2> </div> <div class="mt-6"> <a data-slot="button" class="focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&#38;_svg]:pointer-events-none [&#38;_svg]:shrink-0 [&#38;_svg:not([class*='size-'])]:size-4 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-4 py-2 has-[>svg]:px-3" href="https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n" target="_blank" rel="noreferrer"> <svg class="size-[1em] text-base" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 7h10v10" />
<path d="M7 17 17 7" />
</svg>
Example trace receipt
</a> </div> <p class="mt-4 max-w-3xl text-center text-sm text-white/60">
“VERIFIED” means the published bytes hash to what the receipt says. “QUANTUM READY” means a postquantum signature receipt exists (additive; integrity hashes still stand).
</p> </div> </section> </main> <a href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact" class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white">contact</a> </body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
ifttt/privacy/index.html Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,145 +0,0 @@
<!DOCTYPE html><html lang="en" class="dark"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="theme-color" content="#0b1020"><link rel="canonical" href="https://infrafabric.io/review/"><title>IF.Trace — External Review Packet</title><meta name="description" content="Single-file packet for external reviewers: context, links, and questions."><meta property="og:title" content="IF.Trace — External Review Packet"><meta property="og:description" content="Single-file packet for external reviewers: context, links, and questions."><meta property="og:type" content="website"><meta property="og:image" content="https://infrafabric.io/assets/iftrace-og.svg"><meta name="twitter:card" content="summary_large_image"><link rel="icon" href="/assets/if-logo-simple.svg" type="image/svg+xml"><link rel="stylesheet" href="/assets/_astro/index.DjS-2tUw.css">
<style>[data-slot=section]{--section-width: var(--container, var(--breakpoint-xl));--section-py: calc(var(--spacing) * 12);--section-px: max( var(--gutter, 24px), calc((100cqw - var(--section-width)) / 2) )}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 6)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 8)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 24)}@media(min-width:1024px){[data-slot=section]{--section-py: calc(var(--spacing) * 16)}[data-slot=section][data-variant=floating]{--section-px: calc(var(--spacing) * 16)}[data-slot=section][data-size=sm]{--section-py: calc(var(--spacing) * 12)}[data-slot=section][data-size=lg]{--section-py: calc(var(--spacing) * 32)}}
</style></head> <body class="min-h-screen bg-background text-foreground"> <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10"> <div class="absolute inset-0 bg-[radial-gradient(1200px_circle_at_20%_0%,rgba(16,185,129,0.18),transparent_60%),radial-gradient(1200px_circle_at_90%_10%,rgba(59,130,246,0.14),transparent_55%),radial-gradient(900px_circle_at_30%_100%,rgba(244,63,94,0.10),transparent_55%)]"></div> <div class="absolute inset-0 bg-[linear-gradient(to_bottom,rgba(2,6,23,0.75),rgba(2,6,23,0.95))]"></div> <div class="absolute inset-0 opacity-[0.06] mix-blend-overlay [background-image:url('data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22300%22%20height=%22300%22%3E%3Cfilter%20id=%22n%22%3E%3CfeTurbulence%20type=%22fractalNoise%22%20baseFrequency=%220.8%22%20numOctaves=%224%22%20stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect%20width=%22300%22%20height=%22300%22%20filter=%22url(%23n)%22%20opacity=%220.5%22/%3E%3C/svg%3E')]"></div> </div> <header class="fixed left-0 right-0 top-0 z-50"> <div class="mx-auto max-w-6xl px-4 py-4 sm:px-6"> <div class="flex items-center justify-between rounded-2xl border border-white/10 bg-slate-950/40 px-4 py-3 backdrop-blur-md shadow-[0_20px_80px_rgba(0,0,0,0.35)] sm:px-6"> <a href="/" class="text-sm font-semibold tracking-tight text-white/90 hover:text-white">IF.Trace</a> <div class="flex items-center gap-3 sm:gap-4"> <nav class="flex items-center gap-3 text-xs text-white/70 sm:gap-4" aria-label="Primary"> <a class="hover:text-white" href="/verticals/">Sector</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/pricing/">Pricing</a> <span class="text-white/20" aria-hidden="true">|</span> <a class="hover:text-white" href="/api/">API</a> </nav> <a class="inline-flex h-7 items-center justify-center rounded-md border border-white/10 bg-white/5 px-2 text-[11px] font-semibold text-white/70 hover:bg-white/10 hover:text-white" href="/fr/" aria-label="Passer en français">FR</a> </div> </div> </div> </header> <main class="pt-28 sm:pt-32"> <section class="relative mx-auto flex scroll-m-(--section-py) flex-col gap-16 px-(--section-px) py-(--section-py) bg-background w-full" data-slot="section" aria-label="External review packet"> <div class="relative z-10 flex flex-col gap-y-8 items-center"> <div class="text-foreground w-full space-y-4 text-pretty [&#38;_p]:leading-[1.8] [&#38;_p]:not-first:mt-4 [&#38;_ul]:ml-5 [&#38;_ul]:list-disc [&#38;_ul]:space-y-2 [&#38;_ul]:not-first:mt-4 [&#38;_ol]:ml-5 [&#38;_ol]:list-decimal [&#38;_ol]:space-y-2 [&#38;_ol]:not-first:mt-4 [&#38;_li_p]:inline [&#38;_a]:text-primary [&#38;_a]:hover:underline @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&#38;_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&#38;_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&#38;_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&#38;_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&#38;_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&#38;_img]:rounded-lg [&#38;_img]:not-first:mt-12 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&#38;_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&#38;_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&#38;_pre]:bg-muted [&#38;_pre]:mt-6 [&#38;_pre]:rounded-md [&#38;_pre]:border [&#38;_pre]:p-4 [&#38;_pre]:text-sm max-w-4xl text-lg [&#38;_h1]:text-4xl @5xl:[&#38;_h1]:text-5xl [&#38;_h2]:text-4xl [&#38;_h3]:text-3xl [&#38;_h4]:text-2xl [&#38;_h5]:text-xl [&#38;_h6]:text-lg text-center"> <p>External review</p> <h1>IF.Trace review packet (single file)</h1> <p>
Raw markdown: <a class="text-primary hover:underline" href="/review/index.md">/review/index.md</a> </p> </div> <div class="mt-10 w-full max-w-5xl rounded-xl border bg-card p-6 text-card-foreground shadow-sm"> <pre class="whitespace-pre-wrap break-words text-sm leading-relaxed text-white/90"><code>---
title: IF.Trace External Review Packet
last_updated_utc: 2025-12-31
site: https://infrafabric.io/
packet: https://infrafabric.io/review/
raw_packet: https://infrafabric.io/review/index.md
---
# IF.Trace External Review Packet (Public)
This packet exists because many “AI browser / fetch” tools cannot load a live site reliably, even when it is static HTML.
If you cannot fetch `https://infrafabric.io/` in your environment, use this packet instead. It contains the live URLs, the current plain-language intent, and screenshots.
## 1) What You Are Reviewing (plain description)
IF.Trace is a small public website for a verification protocol.
Goal: **let a third party verify the integrity of confidential work without getting logins**.
The promise is intentionally narrow:
- If the bytes someone downloads match the hashes on the receipt, it is verified.
- IF.Trace does **not** claim “correctness” or “truth” of the content.
## 2) Who The Buyer Is (working assumption)
Primary buyers we are optimizing for:
- people responsible for external review outcomes (procurement / audit / legal / security / research review)
- people who get blamed when proof is missing later
People we are not optimizing for:
- casual readers
- “cool protocol vibes” audiences
## 3) Languages
Live language options:
- English (default)
- French (`/fr/`)
Request to reviewers:
- evaluate whether the language feels like “buyer language” in both EN and FR
- flag any phrases that sound technical, salesy, or “inside baseball”
## 4) Site Map (what exists)
Main routes (public):
- Home: `https://infrafabric.io/`
- Sector: `https://infrafabric.io/verticals/`
- Pricing: `https://infrafabric.io/pricing/`
- API / developer surface: `https://infrafabric.io/api/`
- Whitepaper: `https://infrafabric.io/whitepaper/`
- About: `https://infrafabric.io/about/`
- Governance: `https://infrafabric.io/governance/`
- Review packet (this): `https://infrafabric.io/review/`
- FR: `https://infrafabric.io/fr/`
Header nav is intentionally minimal:
- `Sector | Pricing | API`
## 5) Current “Home Page” Intent (the core promise)
What we want the user to understand quickly:
- This is a way to share proof with outsiders (no login).
- The verification is a simple yes/no integrity check (hashes match).
- It supports offline bundles for review environments.
If any of that reads unclear, untrustworthy, or “too clever”, call it out.
## 6) Screenshots (desktop + mobile)
Desktop:
- Home: `https://infrafabric.io/review/screens/desktop/home.png`
- Sector: `https://infrafabric.io/review/screens/desktop/verticals.png`
- Pricing: `https://infrafabric.io/review/screens/desktop/pricing.png`
- API: `https://infrafabric.io/review/screens/desktop/api.png`
Mobile:
- Home: `https://infrafabric.io/review/screens/mobile/home.png`
- Sector: `https://infrafabric.io/review/screens/mobile/verticals.png`
- Pricing: `https://infrafabric.io/review/screens/mobile/pricing.png`
- API: `https://infrafabric.io/review/screens/mobile/api.png`
Navigation flow (useful for “first 20 seconds” critique):
- Desktop: `https://infrafabric.io/review/screens/desktop/flow/01-home.png` → `02-sector.png` → `03-pricing.png` → `04-api.png`
- Mobile: `https://infrafabric.io/review/screens/mobile/flow/01-home.png` → `02-sector.png` → `03-pricing.png` → `04-api.png`
## 7) What We Want From You (constructive, objective critique)
Please answer in a structured way.
### A) Your model and your limits
- Model name and version (if you know it)
- Knowledge cutoff (if you know it)
- Can you fetch live sites / run JavaScript, or only read text?
### B) “10-second test”
After 10 seconds on the home page, can you answer:
1) What is this?
2) Who is it for?
3) What can I do with it right now?
If not, say what blocked you.
### C) Trust signals (what makes you believe it)
From the page alone:
- What feels credible?
- What feels vague?
- What feels like marketing theatre?
### D) Cognitive load (mental effort)
- What words / sections require re-reading?
- What could be removed without losing meaning?
- What would you add **only if it reduces confusion**?
### E) Buyer psychology (the “sold” moment)
Assume a cautious buyer who has been burned before:
- What makes them say “yes, this is the right shape of solution”?
- What makes them say “no, this is risky / unclear / too early”?
### F) Layout and structure
Compare to other “serious verification / trust infrastructure” sites:
- Is the layout lean enough?
- Is it missing any “minimum viable” credibility elements?
- Is the ordering of sections right?
### G) Language quality (EN + FR)
- Any phrases that sound like a bot, like a pitch, or like an academic paper?
- Any phrases that sound culturally off in French?
### H) Concrete patches
Provide 310 actionable edits (copy or layout). No vague advice.
## 8) Bias Control (important)
Please do not be polite. Assume we prefer accuracy over encouragement.
If you find yourself agreeing with everything, pause and look for weaknesses:
- who would *not* trust this, and why?
- what could be misunderstood and cause harm?
</code></pre> </div> </div> </section> </main> <a href="mailto:ds@infrafabric.io?subject=IF.Trace%20contact" class="fixed bottom-6 right-6 inline-flex h-10 items-center justify-center rounded-full border border-white/10 bg-slate-950/50 px-4 text-xs font-medium text-white/80 backdrop-blur hover:bg-slate-950/70 hover:text-white">contact</a> </body></html>

View file

@ -1,141 +0,0 @@
---
title: IF.Trace External Review Packet
last_updated_utc: 2025-12-31
site: https://infrafabric.io/
packet: https://infrafabric.io/review/
raw_packet: https://infrafabric.io/review/index.md
---
# IF.Trace External Review Packet (Public)
This packet exists because many “AI browser / fetch” tools cannot load a live site reliably, even when it is static HTML.
If you cannot fetch `https://infrafabric.io/` in your environment, use this packet instead. It contains the live URLs, the current plain-language intent, and screenshots.
## 1) What You Are Reviewing (plain description)
IF.Trace is a small public website for a verification protocol.
Goal: **let a third party verify the integrity of confidential work without getting logins**.
The promise is intentionally narrow:
- If the bytes someone downloads match the hashes on the receipt, it is verified.
- IF.Trace does **not** claim “correctness” or “truth” of the content.
## 2) Who The Buyer Is (working assumption)
Primary buyers we are optimizing for:
- people responsible for external review outcomes (procurement / audit / legal / security / research review)
- people who get blamed when proof is missing later
People we are not optimizing for:
- casual readers
- “cool protocol vibes” audiences
## 3) Languages
Live language options:
- English (default)
- French (`/fr/`)
Request to reviewers:
- evaluate whether the language feels like “buyer language” in both EN and FR
- flag any phrases that sound technical, salesy, or “inside baseball”
## 4) Site Map (what exists)
Main routes (public):
- Home: `https://infrafabric.io/`
- Sector: `https://infrafabric.io/verticals/`
- Pricing: `https://infrafabric.io/pricing/`
- API / developer surface: `https://infrafabric.io/api/`
- Whitepaper: `https://infrafabric.io/whitepaper/`
- About: `https://infrafabric.io/about/`
- Governance: `https://infrafabric.io/governance/`
- Review packet (this): `https://infrafabric.io/review/`
- FR: `https://infrafabric.io/fr/`
Header nav is intentionally minimal:
- `Sector | Pricing | API`
## 5) Current “Home Page” Intent (the core promise)
What we want the user to understand quickly:
- This is a way to share proof with outsiders (no login).
- The verification is a simple yes/no integrity check (hashes match).
- It supports offline bundles for review environments.
If any of that reads unclear, untrustworthy, or “too clever”, call it out.
## 6) Screenshots (desktop + mobile)
Desktop:
- Home: `https://infrafabric.io/review/screens/desktop/home.png`
- Sector: `https://infrafabric.io/review/screens/desktop/verticals.png`
- Pricing: `https://infrafabric.io/review/screens/desktop/pricing.png`
- API: `https://infrafabric.io/review/screens/desktop/api.png`
Mobile:
- Home: `https://infrafabric.io/review/screens/mobile/home.png`
- Sector: `https://infrafabric.io/review/screens/mobile/verticals.png`
- Pricing: `https://infrafabric.io/review/screens/mobile/pricing.png`
- API: `https://infrafabric.io/review/screens/mobile/api.png`
Navigation flow (useful for “first 20 seconds” critique):
- Desktop: `https://infrafabric.io/review/screens/desktop/flow/01-home.png``02-sector.png``03-pricing.png``04-api.png`
- Mobile: `https://infrafabric.io/review/screens/mobile/flow/01-home.png``02-sector.png``03-pricing.png``04-api.png`
## 7) What We Want From You (constructive, objective critique)
Please answer in a structured way.
### A) Your model and your limits
- Model name and version (if you know it)
- Knowledge cutoff (if you know it)
- Can you fetch live sites / run JavaScript, or only read text?
### B) “10-second test”
After 10 seconds on the home page, can you answer:
1) What is this?
2) Who is it for?
3) What can I do with it right now?
If not, say what blocked you.
### C) Trust signals (what makes you believe it)
From the page alone:
- What feels credible?
- What feels vague?
- What feels like marketing theatre?
### D) Cognitive load (mental effort)
- What words / sections require re-reading?
- What could be removed without losing meaning?
- What would you add **only if it reduces confusion**?
### E) Buyer psychology (the “sold” moment)
Assume a cautious buyer who has been burned before:
- What makes them say “yes, this is the right shape of solution”?
- What makes them say “no, this is risky / unclear / too early”?
### F) Layout and structure
Compare to other “serious verification / trust infrastructure” sites:
- Is the layout lean enough?
- Is it missing any “minimum viable” credibility elements?
- Is the ordering of sections right?
### G) Language quality (EN + FR)
- Any phrases that sound like a bot, like a pitch, or like an academic paper?
- Any phrases that sound culturally off in French?
### H) Concrete patches
Provide 310 actionable edits (copy or layout). No vague advice.
## 8) Bias Control (important)
Please do not be polite. Assume we prefer accuracy over encouragement.
If you find yourself agreeing with everything, pause and look for weaknesses:
- who would *not* trust this, and why?
- what could be misunderstood and cause harm?

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 474 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 473 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Some files were not shown because too many files have changed in this diff Show more