Replace IF.Trace marketing site
BIN
ifttt-src/public/review/screens/desktop/about.png
Normal file
|
After Width: | Height: | Size: 545 KiB |
|
Before Width: | Height: | Size: 672 KiB After Width: | Height: | Size: 696 KiB |
|
Before Width: | Height: | Size: 661 KiB After Width: | Height: | Size: 689 KiB |
|
Before Width: | Height: | Size: 474 KiB After Width: | Height: | Size: 485 KiB |
|
Before Width: | Height: | Size: 356 KiB After Width: | Height: | Size: 369 KiB |
|
Before Width: | Height: | Size: 672 KiB After Width: | Height: | Size: 696 KiB |
BIN
ifttt-src/public/review/screens/desktop/fr.png
Normal file
|
After Width: | Height: | Size: 670 KiB |
BIN
ifttt-src/public/review/screens/desktop/governance.png
Normal file
|
After Width: | Height: | Size: 662 KiB |
|
Before Width: | Height: | Size: 661 KiB After Width: | Height: | Size: 689 KiB |
|
Before Width: | Height: | Size: 356 KiB After Width: | Height: | Size: 368 KiB |
|
After Width: | Height: | Size: 461 KiB |
|
Before Width: | Height: | Size: 473 KiB After Width: | Height: | Size: 484 KiB |
BIN
ifttt-src/public/review/screens/desktop/whitepaper.png
Normal file
|
After Width: | Height: | Size: 532 KiB |
BIN
ifttt-src/public/review/screens/mobile/about.png
Normal file
|
After Width: | Height: | Size: 438 KiB |
|
Before Width: | Height: | Size: 490 KiB After Width: | Height: | Size: 515 KiB |
|
Before Width: | Height: | Size: 363 KiB After Width: | Height: | Size: 387 KiB |
|
Before Width: | Height: | Size: 374 KiB After Width: | Height: | Size: 384 KiB |
|
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 490 KiB After Width: | Height: | Size: 515 KiB |
BIN
ifttt-src/public/review/screens/mobile/fr.png
Normal file
|
After Width: | Height: | Size: 358 KiB |
BIN
ifttt-src/public/review/screens/mobile/governance.png
Normal file
|
After Width: | Height: | Size: 531 KiB |
|
Before Width: | Height: | Size: 363 KiB After Width: | Height: | Size: 387 KiB |
|
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 236 KiB |
|
After Width: | Height: | Size: 298 KiB |
|
Before Width: | Height: | Size: 374 KiB After Width: | Height: | Size: 383 KiB |
BIN
ifttt-src/public/review/screens/mobile/whitepaper.png
Normal file
|
After Width: | Height: | Size: 394 KiB |
|
|
@ -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.
|
||||
|
||||
## 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)
|
||||
|
||||
IF.Trace is a small public website for a verification protocol.
|
||||
|
|
@ -56,7 +63,7 @@ Main routes (public):
|
|||
- FR: `https://infrafabric.io/fr/`
|
||||
|
||||
Header nav is intentionally minimal:
|
||||
- `Sector | Pricing | API`
|
||||
- `Sector | Pricing | API | Whitepaper`
|
||||
|
||||
## 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:
|
||||
- who would *not* trust this, and why?
|
||||
- what could be misunderstood and cause harm?
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ const langSwitch =
|
|||
<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="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 />
|
||||
</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
|
||||
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"
|
||||
|
|
|
|||
|
|
@ -8,169 +8,245 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
|||
---
|
||||
|
||||
<BaseLayout
|
||||
title="IF.Trace — Developers / API"
|
||||
description="Developer-facing overview of the IF.Trace public receipt surface: stable no-login URLs, HTML fallbacks for sandboxes, and offline verification bundles."
|
||||
title="IF.Trace — API"
|
||||
description="Upload a file, get a SHA‑256, and receive a public receipt URL. Includes code examples and a live test page."
|
||||
>
|
||||
<Hero
|
||||
link={{ text: "Public receipt surface (no login)", href: "/", icon: "arrow-left" }}
|
||||
link={{ text: "Back to home", href: "/", icon: "arrow-left" }}
|
||||
links={[
|
||||
{ text: "See a live receipt", href: "https://infrafabric.io/static/trace/6qRgcR01kw_qNo63Dbs_ob9n", target: "_blank", icon: "sparkles" },
|
||||
{ text: "Browse sectors", href: "/verticals/", icon: "layers" },
|
||||
{ text: "Open console", href: "/console/login", icon: "lock" },
|
||||
{ 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>
|
||||
<h1>Stable URLs, predictable verification.</h1>
|
||||
<p>API</p>
|
||||
<h1>Upload a file. Get a receipt.</h1>
|
||||
<p>
|
||||
IF.Trace is intentionally boring from a developer perspective: compute
|
||||
hashes, publish receipts, and keep the proof surface stable. The system is
|
||||
designed for third parties who are not inside your network.
|
||||
This is the practical page. Copy/paste the examples, run a real request, and share the receipt URL with a reviewer.
|
||||
</p>
|
||||
</Hero>
|
||||
|
||||
<Section aria-label="Verification meaning">
|
||||
<Section aria-label="Quickstart">
|
||||
<SectionContent class="items-center">
|
||||
<SectionProse class="text-center">
|
||||
<p>What “VERIFIED” means (black/white)</p>
|
||||
<h2>Integrity, not interpretation.</h2>
|
||||
<p>Quickstart</p>
|
||||
<h2>Three steps.</h2>
|
||||
<p>1) Login. 2) Create an API key. 3) Upload a file to <code>/api/v1/traces</code>.</p>
|
||||
</SectionProse>
|
||||
</SectionContent>
|
||||
|
||||
<SectionGrid class="@3xl:grid-cols-3">
|
||||
<Tile variant="floating">
|
||||
<TileContent>
|
||||
<TileTitle class="text-xl">Verified</TileTitle>
|
||||
<TileDescription>
|
||||
The bytes you can download hash to the same values shown on the trace receipt.
|
||||
</TileDescription>
|
||||
<TileTitle class="text-xl">1) Console</TileTitle>
|
||||
<TileDescription>Login and create an API key for your organization.</TileDescription>
|
||||
<div class="mt-4 flex flex-wrap gap-2">
|
||||
<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>
|
||||
</Tile>
|
||||
|
||||
<Tile variant="floating">
|
||||
<TileContent>
|
||||
<TileTitle class="text-xl">Quantum ready</TileTitle>
|
||||
<TileDescription>
|
||||
A post‑quantum signature receipt can be added (integrity hashes still stand).
|
||||
</TileDescription>
|
||||
<TileTitle class="text-xl">2) Upload</TileTitle>
|
||||
<TileDescription>POST a file to <code>/api/v1/traces</code>.</TileDescription>
|
||||
<pre class="mt-4 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">curl -fsS -X POST \\
|
||||
-H 'X-API-Key: <your_key>' \\
|
||||
-F 'file=@./document.pdf' \\
|
||||
-F 'expected_sha256=<optional_expected_sha256>' \\
|
||||
https://infrafabric.io/api/v1/traces</pre>
|
||||
</TileContent>
|
||||
</Tile>
|
||||
|
||||
<Tile variant="floating">
|
||||
<TileContent>
|
||||
<TileTitle class="text-xl">Not implied</TileTitle>
|
||||
<TileDescription>Compliance, intent, or correctness of interpretation.</TileDescription>
|
||||
<TileTitle class="text-xl">3) Share</TileTitle>
|
||||
<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/<public_id></pre>
|
||||
</TileContent>
|
||||
</Tile>
|
||||
</SectionGrid>
|
||||
</Section>
|
||||
|
||||
<Section variant="floating" aria-label="Share surface reference">
|
||||
<SectionContent class="gap-8 @5xl:grid @5xl:grid-cols-2 @5xl:items-start">
|
||||
<SectionProse>
|
||||
<p>Share surface</p>
|
||||
<h2>Copy/pasteable proof links.</h2>
|
||||
<p>These URLs are stable by design so review packs remain checkable later.</p>
|
||||
<Section variant="floating" aria-label="Live test">
|
||||
<SectionContent class="items-center">
|
||||
<SectionProse class="text-center">
|
||||
<p>Live test</p>
|
||||
<h2>Try an upload right now.</h2>
|
||||
<p>Paste your API key, pick a file, optionally provide an expected SHA‑256, and run the call.</p>
|
||||
</SectionProse>
|
||||
|
||||
<div class="rounded-xl border bg-card p-6 text-card-foreground">
|
||||
<div class="text-sm font-semibold">Paths</div>
|
||||
<pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">
|
||||
https://infrafabric.io/static/trace/<shareId>
|
||||
https://infrafabric.io/static/dossier/<shareId>
|
||||
https://infrafabric.io/static/dossier/<shareId>/download
|
||||
https://infrafabric.io/static/pack/<shareId>.md
|
||||
https://infrafabric.io/static/review/<shareId>.md
|
||||
https://infrafabric.io/static/marketing/<shareId>.md
|
||||
https://infrafabric.io/static/source/<source_sha256>.pdf
|
||||
</pre>
|
||||
<div class="mt-8 w-full max-w-4xl rounded-xl border bg-card p-6 text-card-foreground">
|
||||
<div class="@3xl:grid @3xl:grid-cols-2 @3xl:gap-6">
|
||||
<form id="iftrace-upload" class="space-y-4">
|
||||
<div>
|
||||
<div class="text-sm font-semibold">API key</div>
|
||||
<input
|
||||
id="apiKey"
|
||||
class="mt-2 w-full rounded-lg border bg-muted px-3 py-2 text-sm text-foreground"
|
||||
placeholder="iftr_...."
|
||||
autocomplete="off"
|
||||
/>
|
||||
</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 SHA‑256 (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>
|
||||
</Section>
|
||||
|
||||
<Section aria-label="HTML fallback">
|
||||
<Section aria-label="Code examples">
|
||||
<SectionContent class="items-center">
|
||||
<SectionProse class="text-center">
|
||||
<p>HTML fallback</p>
|
||||
<h2>For sandboxed reviewers.</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>
|
||||
<p>Examples</p>
|
||||
<h2>Copy/paste for common platforms.</h2>
|
||||
</SectionProse>
|
||||
</SectionContent>
|
||||
|
||||
<SectionGrid class="@3xl:grid-cols-2">
|
||||
<Tile variant="floating">
|
||||
<TileContent>
|
||||
<TileTitle class="text-xl">Raw</TileTitle>
|
||||
<pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">
|
||||
/static/pack/<shareId>.md
|
||||
/static/review/<shareId>.md
|
||||
/static/marketing/<shareId>.md
|
||||
</pre>
|
||||
<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">import requests
|
||||
|
||||
API_KEY = "iftr_..."
|
||||
with open("document.pdf", "rb") as f:
|
||||
res = requests.post(
|
||||
"https://infrafabric.io/api/v1/traces",
|
||||
headers={"X-API-Key": API_KEY},
|
||||
files={"file": ("document.pdf", f, "application/pdf")},
|
||||
data={"expected_sha256": ""}, # optional
|
||||
timeout=60,
|
||||
)
|
||||
print(res.status_code)
|
||||
print(res.json())</pre>
|
||||
</TileContent>
|
||||
</Tile>
|
||||
|
||||
<Tile variant="floating">
|
||||
<TileContent>
|
||||
<TileTitle class="text-xl">HTML view</TileTitle>
|
||||
<pre class="mt-3 overflow-auto rounded-lg bg-muted p-4 text-xs leading-relaxed text-foreground">
|
||||
/static/pack/<shareId>
|
||||
/static/review/<shareId>
|
||||
/static/marketing/<shareId>
|
||||
</pre>
|
||||
<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">import fs from "node:fs";
|
||||
|
||||
const apiKey = "iftr_...";
|
||||
const fd = new FormData();
|
||||
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", {
|
||||
method: "POST",
|
||||
headers: { "X-API-Key": apiKey },
|
||||
body: fd,
|
||||
});
|
||||
console.log(res.status);
|
||||
console.log(await res.json());</pre>
|
||||
</TileContent>
|
||||
</Tile>
|
||||
</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_<id>_standard.tar.gz --expected-sha256 <sha256>
|
||||
</pre>
|
||||
<p class="mt-3 text-xs text-white/60">If hashes match, the receipt’s integrity claim is satisfied.</p>
|
||||
</div>
|
||||
</div>
|
||||
</SectionContent>
|
||||
</Section>
|
||||
|
||||
<Section aria-label="Docs">
|
||||
<Section aria-label="Meaning of verified">
|
||||
<SectionContent class="items-center">
|
||||
<SectionProse class="text-center">
|
||||
<p>Docs</p>
|
||||
<h2>Review packs</h2>
|
||||
<p>Use the paper update as a reviewer-friendly packet.</p>
|
||||
<p>Meaning</p>
|
||||
<h2>Integrity, not interpretation.</h2>
|
||||
<p>
|
||||
“Verified” means the computed hash matched an expected hash you provided.
|
||||
It does not mean “true”, “compliant”, or “approved”.
|
||||
</p>
|
||||
</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>
|
||||
</Section>
|
||||
</BaseLayout>
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
|||
},
|
||||
{
|
||||
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",
|
||||
},
|
||||
{
|
||||
|
|
@ -102,4 +102,3 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
|||
</p>
|
||||
</Content>
|
||||
</BaseLayout>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,17 +18,20 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
|||
target: "_blank",
|
||||
icon: "sparkles",
|
||||
},
|
||||
{ text: "Read the paper", href: "/whitepaper/", icon: "file-text" },
|
||||
{ text: "Read the whitepaper", href: "/whitepaper/", icon: "file-text" },
|
||||
]}
|
||||
image={{
|
||||
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 > IF.Traceable > IF.Trustworthy</p>
|
||||
<h1>IF.Trace</h1>
|
||||
<p>Confidential work > open verification.</p>
|
||||
<p>Let a third party check integrity later, without joining your tools.</p>
|
||||
<p>Proof for outsiders, without giving access.</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>
|
||||
|
||||
<Features
|
||||
|
|
@ -38,21 +41,21 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
|||
]}
|
||||
items={[
|
||||
{
|
||||
title: "No‑login receipts",
|
||||
title: "One link to send",
|
||||
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",
|
||||
},
|
||||
{
|
||||
title: "Offline verification bundles",
|
||||
title: "Works in locked-down review rooms",
|
||||
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",
|
||||
},
|
||||
{
|
||||
title: "Black/white integrity claims",
|
||||
title: "Clear yes / no result",
|
||||
description:
|
||||
"Clear yes/no checks: if the hashes match, it’s verified.",
|
||||
"If the bytes match the hashes on the receipt, it is verified. No extra claims.",
|
||||
icon: "badge-check",
|
||||
},
|
||||
{
|
||||
|
|
@ -62,25 +65,24 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
|||
icon: "file-text",
|
||||
},
|
||||
{
|
||||
title: "Source → output binding",
|
||||
title: "Stops “what changed?” arguments",
|
||||
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",
|
||||
},
|
||||
{
|
||||
title: "Designed for audits",
|
||||
title: "Built for blame-heavy moments",
|
||||
description:
|
||||
"Proof that survives vendors, contractors, handoffs, and time.",
|
||||
icon: "scale",
|
||||
},
|
||||
]}
|
||||
>
|
||||
<p>What IF.Trace is</p>
|
||||
<h2>A verification layer for third‑party pressure.</h2>
|
||||
<p>What it is</p>
|
||||
<h2>A public receipt for a private workflow.</h2>
|
||||
<p>
|
||||
When someone needs proof, the bottleneck is almost always the same:
|
||||
they can’t be onboarded into your internal systems. IF.Trace keeps the proof
|
||||
outside: stable links they can verify without accounts.
|
||||
If you have ever lost days to “can you prove this existed then?” or “can you share access so we can check?”,
|
||||
IF.Trace is the simple alternative: keep the work private, publish a receipt for outsiders.
|
||||
</p>
|
||||
</Features>
|
||||
|
||||
|
|
@ -102,7 +104,7 @@ import BaseLayout from "@/layouts/BaseLayout.astro";
|
|||
]}
|
||||
image={{
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -1,68 +1,202 @@
|
|||
---
|
||||
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";
|
||||
---
|
||||
|
||||
<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 pay‑as‑you‑go.">
|
||||
<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={[
|
||||
{ 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" },
|
||||
]}
|
||||
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>
|
||||
<p>If you need audit‑ready verification, we price by risk and responsibility.</p>
|
||||
<p>Pick the plan that matches your monthly volume. No jargon.</p>
|
||||
</Hero>
|
||||
|
||||
<Pricings
|
||||
items={[
|
||||
{
|
||||
title: "Starter",
|
||||
description: "Proof surface for one workflow.",
|
||||
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>
|
||||
<Section aria-label="Pricing">
|
||||
<SectionContent>
|
||||
<SectionProse class="text-center">
|
||||
<p>Choose a plan</p>
|
||||
<h2>Free, monthly, or pay‑as‑you‑go.</h2>
|
||||
<p>
|
||||
Setup + governance configuration, integration support, and proof-surface
|
||||
hardening. Third-party checking should stay cheap.
|
||||
A “transaction” is one published receipt (a trace link) with a yes/no integrity result.
|
||||
</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 pay‑as‑you‑go 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">Pay‑as‑you‑go</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 pay‑as‑you‑go
|
||||
</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 fair‑use 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>
|
||||
|
|
|
|||
48
ifttt-src/src/pages/privacy/index.astro
Normal 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>
|
||||
60
ifttt-src/src/pages/terms/index.astro
Normal 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>Pay‑as‑you‑go: $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 rate‑limit 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 best‑effort 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
|
|
@ -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>
|
||||
|
|
@ -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 doesn’t) 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 doesn’t) 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] [&>svg]:pointer-events-none [&>svg]:size-3 bg-secondary text-secondary-foreground [a&]: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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-4xl text-lg [&_h1]:text-4xl @5xl:[&_h1]:text-5xl [&_h2]:text-4xl [&_h3]:text-3xl [&_h4]:text-2xl [&_h5]:text-xl [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 chain‑of‑custody. Don’t swap them.
|
||||
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 machine‑checkable signals.
|
||||
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_h6]:text-base text-center"> <p>Scope</p> <h2>What a receipt proves (and what it doesn’t).</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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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, no‑login receipts.
|
||||
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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>
|
||||
5
ifttt/assets/_astro/ApiTryForm.CSrrM9iB.js
Normal 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};
|
||||
1
ifttt/assets/_astro/PricingCalculator.AawJrak5.js
Normal 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};
|
||||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
24
ifttt/assets/_astro/client.nc8uITnr.js
Normal 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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
9
ifttt/assets/_astro/index.DK-fsZOb.js
Normal file
1
ifttt/assets/_astro/index.niIggI7A.css
Normal file
9
ifttt/assets/_astro/jsx-runtime.ClP7wGfN.js
Normal 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};
|
||||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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.
|
||||
|
|
@ -1,60 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="1024"
|
||||
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 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" fill="none">
|
||||
<rect width="120" height="120" rx="28" fill="#0b1020"/>
|
||||
<path d="M30 40h60v12H66v38H54V52H30V40Z" fill="#ffffff" opacity="0.92"/>
|
||||
<path d="M30 40h24v12H30V40Z" fill="#ff6a00" opacity="0.95"/>
|
||||
</svg>
|
||||
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 281 B |
|
|
@ -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 |
|
|
@ -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>
|
||||
<linearGradient id="bg" x1="0" y1="0" x2="1200" y2="630" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#0B1020" />
|
||||
<stop offset="0.55" stop-color="#07122A" />
|
||||
<stop offset="1" stop-color="#0B1020" />
|
||||
<stop stop-color="#071225"/>
|
||||
<stop offset="1" stop-color="#030712"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="g" x1="210" y1="110" x2="980" y2="520" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#60A5FA" />
|
||||
<stop offset="0.55" stop-color="#34D399" />
|
||||
<stop offset="1" stop-color="#F472B6" />
|
||||
</linearGradient>
|
||||
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="18" 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.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>
|
||||
<radialGradient id="glow" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(300 90) rotate(20) scale(700 420)">
|
||||
<stop stop-color="#10b981" stop-opacity="0.22"/>
|
||||
<stop offset="1" stop-color="#10b981" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="glow2" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(980 120) rotate(-8) scale(720 420)">
|
||||
<stop stop-color="#3b82f6" stop-opacity="0.18"/>
|
||||
<stop offset="1" stop-color="#3b82f6" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
|
||||
<rect x="0" y="0" width="1200" height="630" rx="44" fill="url(#bg)" />
|
||||
|
||||
<path
|
||||
d="M165 505 C 380 335, 520 360, 670 250 C 800 155, 930 160, 1040 105"
|
||||
stroke="url(#g)"
|
||||
stroke-width="12"
|
||||
stroke-linecap="round"
|
||||
stroke-opacity="0.45"
|
||||
filter="url(#glow)"
|
||||
/>
|
||||
|
||||
<text class="small" x="110" y="140">IF.Transparent > IF.Traceable > IF.Trustworthy</text>
|
||||
<text class="h1" x="110" y="260">IF.Trace</text>
|
||||
<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>
|
||||
<rect width="1200" height="630" fill="url(#bg)"/>
|
||||
<rect width="1200" height="630" fill="url(#glow)"/>
|
||||
<rect width="1200" height="630" fill="url(#glow2)"/>
|
||||
<g opacity="0.12">
|
||||
<path d="M0 400C160 320 340 500 520 420C720 330 860 300 1200 370" stroke="#ffffff" stroke-width="2"/>
|
||||
<path d="M0 460C200 380 320 520 540 450C760 380 900 360 1200 420" stroke="#ffffff" stroke-width="2"/>
|
||||
</g>
|
||||
<g>
|
||||
<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>
|
||||
<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 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>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.1 KiB |
|
|
@ -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 don’t 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 shouldn’t 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 it’s not verifiable, label it as a gap. Do not endorse it.",
|
||||
"source": "IF.Trace stance",
|
||||
"href": "https://infrafabric.io/static/hosted/ifttt/"
|
||||
}
|
||||
]
|
||||
|
|
@ -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 qu’un tiers peut vérifier ce qui s’est passé sans login. IF.Trace est l’ossature de reçus : trace, liens stables, bundles hors‑ligne."><meta property="og:title" content="IF.Trace — Gouvernance ouverte"><meta property="og:description" content="La gouvernance ouverte signifie qu’un tiers peut vérifier ce qui s’est passé sans login. IF.Trace est l’ossature de reçus : trace, liens stables, bundles hors‑ligne."><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] [&>svg]:pointer-events-none [&>svg]:size-3 bg-secondary text-secondary-foreground [a&]: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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-4xl text-lg [&_h1]:text-4xl @5xl:[&_h1]:text-5xl [&_h2]:text-4xl [&_h3]:text-3xl [&_h4]:text-2xl [&_h5]:text-xl [&_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 qu’en interne n’est pas une preuve.
|
||||
IF.Trace publie des reçus stables, accessibles sans login, pour que des
|
||||
tiers puissent vérifier l’inté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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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/stop‑conditions 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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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>
|
||||
|
|
@ -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 hors‑ligne 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 hors‑ligne 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] [&>svg]:pointer-events-none [&>svg]:size-3 bg-secondary text-secondary-foreground [a&]: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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-4xl text-lg [&_h1]:text-4xl @5xl:[&_h1]:text-5xl [&_h2]:text-4xl [&_h3]:text-3xl [&_h4]:text-2xl [&_h5]:text-xl [&_h6]:text-lg text-center text-balance"> <p>IF.Transparent > IF.Traceable > IF.Trustworthy</p> <h1>IF.Trace</h1> <p>Travail confidentiel > vérification ouverte.</p> <p>Permettre à un tiers de vérifier l’inté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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_h6]:text-base text-center"> <p>Ce que c’est</p> <h2>Une couche de vérification pour la pression externe.</h2> <p>
|
||||
Quand quelqu’un 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 à l’extérieur :
|
||||
des liens stables que l’on 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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none transition-opacity duration-100 [&:is(a:hover>&)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&_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 qu’un 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 [&_svg]:pointer-events-none transition-opacity duration-100 [&:is(a:hover>&)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&_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 hors‑ligne</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 [&_svg]:pointer-events-none transition-opacity duration-100 [&:is(a:hover>&)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&_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, c’est 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 [&_svg]:pointer-events-none transition-opacity duration-100 [&:is(a:hover>&)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&_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 [&_svg]:pointer-events-none transition-opacity duration-100 [&:is(a:hover>&)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&_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 [&_svg]:pointer-events-none transition-opacity duration-100 [&:is(a:hover>&)]:opacity-75 relative overflow-hidden bg-muted size-8 rounded-sm border [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_h6]:text-base"> <p>Comment ça marche</p> <h2>Une preuve sans permission.</h2> <p>
|
||||
L’output 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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 l’output que vous allez partager.</li><li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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>
|
||||
|
|
@ -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] [&>svg]:pointer-events-none [&>svg]:size-3 bg-secondary text-secondary-foreground [a&]: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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-4xl text-lg [&_h1]:text-4xl @5xl:[&_h1]:text-5xl [&_h2]:text-4xl [&_h3]:text-3xl [&_h4]:text-2xl [&_h5]:text-xl [&_h6]:text-lg text-center text-balance"> <p>Open governance</p> <h1>Legible to the governed.</h1> <p>
|
||||
“Governance” fails when it’s only legible inside your network. IF.Trace moves
|
||||
the proof outside: stable, no‑login 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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_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 third‑party 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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_h6]:text-base"> <p>The governance stack</p> <h2>Where IF.Trace sits.</h2> <p>Receipts don’t 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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 + chain‑of‑custody IDs + share surface.
|
||||
</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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/stop‑conditions 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/<shareId>
|
||||
/static/dossier/<shareId>
|
||||
/static/dossier/<shareId>/download
|
||||
/static/pack/<shareId>.md
|
||||
/static/review/<shareId>.md
|
||||
/static/marketing/<shareId>.md
|
||||
/static/source/<source_sha256>.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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 chain‑of‑custody.</li> <li class="flex shrink-0 items-start gap-3 text-start not-first:mt-2 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:shrink-0 [&_svg]:translate-y-[30%] [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-3xl text-base [&_h1]:text-4xl [&_h2]:text-3xl [&_h3]:text-2xl [&_h4]:text-xl [&_h5]:text-lg [&_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 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_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 post‑quantum 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>
|
||||
1
ifttt/privacy/index.html
Normal 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 [&_p]:leading-[1.8] [&_p]:not-first:mt-4 [&_ul]:ml-5 [&_ul]:list-disc [&_ul]:space-y-2 [&_ul]:not-first:mt-4 [&_ol]:ml-5 [&_ol]:list-decimal [&_ol]:space-y-2 [&_ol]:not-first:mt-4 [&_li_p]:inline [&_a]:text-primary [&_a]:hover:underline @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:break-words @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:wrap-break-word @max-sm:[&_:is(h1,h2,h3,h4,h5,h6)]:hyphens-auto [&_:is(h1,h2,h3,h4,h5,h6)]:scroll-mt-20 [&_:is(h1,h2,h3,h4,h5,h6)]:leading-[1.1] [&_:is(h1,h2,h3,h4,h5,h6)]:font-semibold [&_:is(h1,h2,h3,h4,h5,h6)]:not-first:mt-12 [&_img]:rounded-lg [&_img]:not-first:mt-12 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-accent-foreground [&_p:first-child+:is(h1,h2,h3,h4,h5,h6)]:mt-4 [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:text-sm [&_p:first-child:has(~:is(h1,h2,h3,h4,h5,h6))]:font-medium [&_pre]:bg-muted [&_pre]:mt-6 [&_pre]:rounded-md [&_pre]:border [&_pre]:p-4 [&_pre]:text-sm max-w-4xl text-lg [&_h1]:text-4xl @5xl:[&_h1]:text-5xl [&_h2]:text-4xl [&_h3]:text-3xl [&_h4]:text-2xl [&_h5]:text-xl [&_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 3–10 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>
|
||||
|
|
@ -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 3–10 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?
|
||||
|
||||
|
Before Width: | Height: | Size: 672 KiB |
|
Before Width: | Height: | Size: 661 KiB |
|
Before Width: | Height: | Size: 474 KiB |
|
Before Width: | Height: | Size: 356 KiB |
|
Before Width: | Height: | Size: 672 KiB |
|
Before Width: | Height: | Size: 661 KiB |
|
Before Width: | Height: | Size: 356 KiB |
|
Before Width: | Height: | Size: 473 KiB |
|
Before Width: | Height: | Size: 490 KiB |
|
Before Width: | Height: | Size: 363 KiB |
|
Before Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 490 KiB |
|
Before Width: | Height: | Size: 363 KiB |
|
Before Width: | Height: | Size: 222 KiB |