diff --git a/ifttt/app.js b/ifttt/app.js index ae7806a..ab831aa 100644 --- a/ifttt/app.js +++ b/ifttt/app.js @@ -1,6 +1,10 @@ (() => { const typewordEl = document.getElementById("typeword"); - if (typewordEl) startTypewriter(typewordEl); + const stepperEl = document.getElementById("stepper"); + const revealStepper = createStepperRevealer(stepperEl); + if (stepperEl) window.setTimeout(revealStepper, 5200); + + if (typewordEl) startTypewriter(typewordEl, { onFirstCycleDone: revealStepper }); const quoteTextEl = document.getElementById("quoteText"); const quoteMetaEl = document.getElementById("quoteMeta"); @@ -8,17 +12,29 @@ if (quoteTextEl && quoteMetaEl && quoteWrapEl) startQuoteTicker({ quoteWrapEl, quoteTextEl, quoteMetaEl }); })(); -function startTypewriter(typewordEl) { - const words = ["Transparent", "Traceable", "Trustworthy", "TTT"]; +function createStepperRevealer(stepperEl) { + let shown = false; + return () => { + if (shown || !stepperEl) return; + shown = true; + stepperEl.hidden = false; + window.requestAnimationFrame(() => stepperEl.classList.add("homeStepper--show")); + }; +} + +function startTypewriter(typewordEl, opts = {}) { + const words = ["Transparent", "Traceable", "Trust", "TTT"]; const typeMs = 42; const deleteMs = 26; const holdMs = 780; const finalHoldMs = 1100; const betweenMs = 180; + const onFirstCycleDone = typeof opts.onFirstCycleDone === "function" ? opts.onFirstCycleDone : null; let wordIndex = 0; let charIndex = 0; let isDeleting = false; + let cycleCount = 0; const tick = () => { const word = words[wordIndex] || ""; @@ -43,6 +59,10 @@ function startTypewriter(typewordEl) { if (atStart) { isDeleting = false; wordIndex = (wordIndex + 1) % words.length; + if (wordIndex === 0) { + cycleCount += 1; + if (cycleCount === 1 && onFirstCycleDone) onFirstCycleDone(); + } window.setTimeout(tick, betweenMs); return; } diff --git a/ifttt/assets/ifttt-quotes.json b/ifttt/assets/ifttt-quotes.json index 6ca1e19..e0210ca 100644 --- a/ifttt/assets/ifttt-quotes.json +++ b/ifttt/assets/ifttt-quotes.json @@ -19,6 +19,21 @@ "source": "IF.TTT 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.TTT 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.TTT public receipts", + "href": "https://infrafabric.io/static/hosted/ifttt/" + }, + { + "text": "Third parties verify. We just publish the math.", + "source": "IF.TTT posture", + "href": "https://infrafabric.io/static/hosted/ifttt/" + }, { "text": "Receipts must be readable and verifiable without credentials.", "source": "IF.TTT public receipt surface", diff --git a/ifttt/index.html b/ifttt/index.html index 25d2cd2..697a12c 100644 --- a/ifttt/index.html +++ b/ifttt/index.html @@ -22,10 +22,10 @@ - -
+ +
-
-
-
-
-

Open governance, readable by outsiders

-

Receipts, not vibes.

-
- if.> -
-
-
-
-
-

- IF.TTT is a receipt‑first governance layer. It binds a source artifact to an output with a - trace page, stable no‑login links, and optional offline bundles anyone can verify. -

+
+
+
+ -
-
- No‑login - Public proof surface -
-
- Offline - Triage bundles -
-
- Black/white - What’s verified vs what isn’t -
-
+
+ if.> +
-
- Try a live trace - See vertical fit +
+
+
+
+ +

+ Open verification for governance: third parties can verify receipts without your credentials. + Artifacts > adjectives. +

+ + + +
+ Danny Stocker · ds@infrafabric.io
- - -
-
- -
-
-

How It Works (receipt‑first)

-

- This is the sequence third‑party reviewers actually care about. Every step either produces a receipt, or it doesn’t ship. -

- -
    -
  1. -
    1
    -
    -
    Capture the source bytes
    -
    We hash the exact artifact (PDF/MD/etc) to produce source_sha256.
    -
    -
  2. -
  3. -
    2
    -
    -
    Produce the output bytes
    -
    We hash the final output to produce output_sha256 (what the reader sees).
    -
    -
  4. -
  5. -
    3
    -
    -
    Bind source ↔ output in a trace
    -
    We create trace_id and publish a trace receipt that links hashes, time, and versioning.
    -
    -
  6. -
  7. -
    4
    -
    -
    Publish a no‑login proof surface
    -
    Stable URLs keyed by an unguessable shareId (trace, dossier, pack, source).
    -
    -
  8. -
  9. -
    5
    -
    -
    Optional: publish offline bundles
    -
    - For constrained environments, export triage bundles (lightweight/standard/full) verifiable without network access. -
    -
    -
  10. -
-
-
- -
-
-

Third‑Party Trust Requirements (what outsiders demand)

-

This is the “procurement/audit” checklist, stated plainly.

- -
-
-

Typical third‑party questions

-
    -
  • “Can I verify the output came from this source?”
  • -
  • “Can I verify without your login, VPN, or internal tools?”
  • -
  • “Can I verify later, offline, after a dispute?”
  • -
  • “What does the receipt prove, and what does it not prove?”
  • -
  • “If the evidence is missing, is that visible?”
  • -
-
- -
-

IF.TTT answers (black/white)

-
-
-
Proves
-
Integrity binding (hashes), publication receipts, optional signatures, offline verification artifacts.
-
-
-
Does not prove
-
- Intent, interpretation, or “compliance”. It gives evidence; your process decides what that evidence means. -
-
-
-
Default stance
-
If it’s not verifiable, label it as a gap (do not endorse it).
-
-
-
-
-
-
- -
-
-

Open Verification (try it yourself)

-

Use the same path your auditors and external reviewers will use.

- -
-
-

Live example (trace + bundles)

- - -
- Public receipt URLs (no-login) -

- Every published output gets a stable share surface keyed by a single shareId. -

-
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
-

- HTML views exist for sandboxes that load text/html but reject downloads: - /static/pack/<shareId>, /static/review/<shareId>, /static/marketing/<shareId>. -

-
- -

- Note: some constrained “web fetchers” reject downloadable binaries (e.g., .tar.gz) while still loading HTML. That’s why - HTML views exist for packs and indexes. -

-
- -
-

CLI verification (2 minutes)

-

Download a bundle from the selector, then:

-
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>
-

- VERIFIED means the hashes match what the receipt declares. QUANTUM READY may be shown when a - post‑quantum signature receipt exists (PQ verification is additive; hash verification still stands). -

-
-
-
-
- -
-
-

Vertical Fit (what each buyer is actually looking for)

-

Same mechanism, different third‑party pressure.

- -
-
- -

B2B SaaS (SOC 2 / ISO)

-

Third party

-

Auditors + enterprise procurement

-

They want

-

Evidence that controls existed at the right time, in the right scope, with receipts.

-

IF.TTT helps by

-

Publishing no‑login receipts and offline bundles for disputes and audits.

- B2B SaaS → -
- -
- -

Fintech / Regulated Finance

-

Third party

-

Regulators + model risk + internal audit

-

They want

-

Non‑repudiation, dispute workflows, and “show your work” provenance.

-

IF.TTT helps by

-

Binding outputs to sources and creating a defensible, replayable receipt trail.

- Finance → -
- -
- -

Healthcare

-

Third party

-

Compliance + vendors + incident reviewers

-

They want

-

Clear boundaries: what’s verified, what’s inferred, and what must be reviewed by humans.

-

IF.TTT helps by

-

Making evidence legible to outsiders while preserving strict, machine‑verifiable receipts.

- Healthcare → -
- -
- -

Gov / Defense Contractors

-

Third party

-

Assessors + customers + supply‑chain review

-

They want

-

Offline‑verifiable bundles and unambiguous chain‑of‑custody.

-

IF.TTT helps by

-

Providing triage bundles that can be verified without trusted network access.

- Government → -
- -
- -

AI Product Companies

-

Third party

-

Enterprise buyers + incident responders

-

They want

-

Provable provenance for outputs (“why did it say that?”) without internal access.

-

IF.TTT helps by

-

Making trace receipts shareable, replayable, and dispute‑friendly.

- AI products → -
- -
- -

SecOps / SOC

-

Third party

-

Executives + auditors after an incident

-

They want

-

To verify AI summaries against raw evidence and keep chain‑of‑custody intact.

-

IF.TTT helps by

-

Binding “what the system said” to “what the system saw” via receipts and bundles.

- SecOps → -
- -
- -

Industrial / Supply Chain

-

Third party

-

Customers + auditors + insurers

-

They want

-

Proof of change control and traceability that survives contractor handoffs.

-

IF.TTT helps by

-

Standardizing receipts so handoffs remain verifiable across organizational boundaries.

- Supply chain → -
-
-
-
- -
-
-

FAQ

- -
-
- What is “VERIFIED”? -

- “VERIFIED” means the hashes on the trace page match the output/source that can be downloaded and hashed independently. It is an - integrity receipt: the bytes match what the trace declares. -

-
- -
- What is “QUANTUM READY”? -

- “QUANTUM READY” is shown when a post‑quantum signature receipt exists for the trace. It means PQ receipts are present now (for future - audit requirements). PQ verification is additive; the hash receipt remains valid either way. -

-
- -
- Do you guarantee compliance? -

- No. IF.TTT produces verifiable artifacts that can support audits and disputes. Compliance is a broader program: scope, policy, human - review, and governance decisions are still required. -

-
- -
- What’s the difference between shareId and trace_id? -

- shareId is the public handle used in URLs. trace_id is the chain‑of‑custody UUID recorded in receipts and - bundles. -

-
-
- -
- -
-
Contact
-
- ds@infrafabric.io · Danny Stocker - · trace@infrafabric.io -
-
-
-
-
-
- - +
diff --git a/ifttt/style.css b/ifttt/style.css index f774bd2..1940c23 100644 --- a/ifttt/style.css +++ b/ifttt/style.css @@ -853,3 +853,187 @@ details p { padding-bottom: 74px; } } + +/* Home (minimal landing; “OK Computer” empty-space bias) */ +body.home { + background: + radial-gradient(900px 420px at 15% 0%, rgba(29, 78, 216, 0.06), transparent 60%), + radial-gradient(900px 420px at 85% 15%, rgba(139, 0, 0, 0.06), transparent 60%), + linear-gradient(#fffdf7, #ffffff); +} + +body.home .top { + position: fixed; + left: 0; + right: 0; + background: transparent; + border-bottom: none; + backdrop-filter: none; +} + +body.home .top__inner { + padding: 18px 0; +} + +.homeNav { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + justify-content: flex-end; + font-size: 12px; +} + +.homeNav a { + color: var(--muted); + padding: 6px 8px; + border-radius: 10px; +} + +.homeNav a:hover { + color: var(--text); + background: #ffffff; + border: 1px solid var(--border); + text-decoration: none; +} + +.homeNav__sep { + color: rgba(107, 114, 128, 0.7); +} + +.homeMain { + min-height: 100vh; + display: flex; + align-items: center; + padding: 120px 0 90px; +} + +.homeMain__inner { + width: 100%; +} + +.homeCenter { + text-align: center; + max-width: 920px; + margin: 0 auto; +} + +.homeBadges { + display: flex; + justify-content: center; + align-items: center; + gap: 10px; + flex-wrap: wrap; + margin: 0 0 14px; +} + +.badge--big { + font-size: 12px; + padding: 7px 12px; + border-radius: 999px; + letter-spacing: 0.08em; +} + +.type--home { + font-size: clamp(44px, 7vw, 74px); + line-height: 1.05; + margin: 0 0 14px; + color: #111827; +} + +.type--home .type__prefix, +.type--home .type__suffix { + font-weight: 800; +} + +.type--home .type__caret { + width: 0.18em; + height: 1.05em; + margin-left: 0.12em; + border-radius: 0.14em; + background: rgba(17, 24, 39, 0.65); +} + +.quote--home { + margin: 0 auto 14px; +} + +.quote--home .quote__text { + font-size: 14px; +} + +.homeLede { + margin: 0 auto 0; + max-width: 78ch; + color: #374151; + font-size: 13px; +} + +.homeStepper { + margin: 18px auto 0; + max-width: 920px; + text-align: left; + opacity: 0; + transform: translateY(6px); + transition: + opacity 420ms ease, + transform 420ms ease; +} + +.homeStepper.homeStepper--show { + opacity: 1; + transform: translateY(0); +} + +.homeLinks { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin: 14px 0 0; +} + +.homeLink { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 9px 10px; + border-radius: 12px; + border: 1px solid var(--border); + background: #ffffff; + color: var(--text); + font-weight: 650; + font-size: 12px; + box-shadow: var(--shadow); + text-decoration: none; +} + +.homeLink:hover { + text-decoration: none; + border-color: rgba(29, 78, 216, 0.35); + box-shadow: + var(--shadow), + 0 0 0 4px rgba(29, 78, 216, 0.10); +} + +.homeMeta { + margin-top: 14px; + font-size: 12px; + color: var(--muted); +} + +@media (max-width: 980px) { + body.home .top { + position: sticky; + background: rgba(255, 253, 247, 0.92); + border-bottom: 1px solid var(--border); + backdrop-filter: blur(10px); + } + + .homeMain { + padding-top: 86px; + } + + .type--home { + font-size: clamp(38px, 10vw, 54px); + } +}