site: version-control the landing page + FAQ#35
Conversation
- add site/ — the production landing page (index.html), FAQ (faq.html), and share card (og.png + og.svg source). Live at https://blindfold-rho.vercel.app - add vercel.json + .vercelignore so a deploy serves site/ statically and uploads only the landing page — never the rest of the monorepo Co-authored-by: algsoch <algsoch@gmail.com>
PR Summary by QodoVersion-control static landing page + FAQ for Vercel deployment
AI Description
Diagram
High-Level Assessment
Files changed (4)
|
Code Review by Qodo
1. Duplicate arch IDs
|
| <section id="arch"> | ||
| <div class="wrap"> | ||
| <div class="center reveal"> | ||
| <span class="eyebrow">Architecture</span> | ||
| <h2>The real stack — nested, not flat</h2> | ||
| <p class="lead">Your machine is untrusted. The key lives inside an enclave, inside an Intel TDX trust domain, inside the Terminal 3 network. Each boundary is real hardware/crypto isolation.</p> | ||
| </div> | ||
| <div class="arch reveal" id="arch"> |
There was a problem hiding this comment.
1. Duplicate arch ids 🐞 Bug ≡ Correctness
site/index.html defines id="arch" on both the <section> and the inner diagram <div>, so
document.getElementById('arch') used by the wire/packet animation can select the wrong element. This
can misplace the SVG overlay (appended to the <section> instead of the positioned .arch container)
and break the animation layout.
Agent Prompt
### Issue description
`site/index.html` uses `id="arch"` twice: on the `<section>` and on the inner `.arch` diagram container. The animation code calls `document.getElementById('arch')` and appends an absolutely-positioned SVG (`svg.wires`) to that element; if it resolves to the `<section>`, the SVG is appended outside the intended positioned container and can render misaligned.
### Issue Context
The packet/wire animation expects the selected `arch` element to be the positioned diagram container (`.arch{position:relative}`), since it appends an absolutely positioned SVG and computes coordinates relative to that container.
### Fix Focus Areas
- site/index.html[553-561]
- site/index.html[1195-1202]
### Suggested fix
1. Keep `id="arch"` only on the `<section>` (so `href="#arch"` continues to work).
2. Rename the inner diagram container to something unique (e.g. `id="archDiagram"`).
3. Update the animation code to select that inner container (e.g. `document.getElementById('archDiagram')`).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}}),{threshold:.1}); | ||
| document.querySelectorAll('.reveal').forEach(el=>io.observe(el)); |
There was a problem hiding this comment.
2. Observer apis unguarded 🐞 Bug ☼ Reliability
site/index.html constructs IntersectionObserver and ResizeObserver without feature detection, which will throw ReferenceError in older browsers/webviews and prevent animations (and any later script initialization) from running. The file already uses a ResizeObserver guard elsewhere, but not consistently.
Agent Prompt
### Issue description
`site/index.html` uses `new IntersectionObserver(...)` and later `new ResizeObserver(...)` without checking for API availability. In environments lacking these APIs, the script throws and stops subsequent initialization.
### Issue Context
There is already a guarded use of `ResizeObserver` for the system-design diagram, but the packet animation uses an unguarded `ResizeObserver`, and `IntersectionObserver` is also unguarded.
### Fix Focus Areas
- site/index.html[1087-1089]
- site/index.html[1114-1116]
- site/index.html[1269-1273]
### Suggested fix
- Wrap `IntersectionObserver` usage:
- `if ('IntersectionObserver' in window) { ... } else { /* fall back: add .in immediately / start animations */ }`
- Wrap `ResizeObserver` usage similarly:
- `if ('ResizeObserver' in window) { ... }` else rely on existing `resize` event listeners.
- Ensure fallbacks still render the page correctly (even if animations are disabled).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| let running=false; | ||
| async function play(){ | ||
| running=true; | ||
| for(;;){ | ||
| b1.innerHTML=''; b2.innerHTML=''; w2.classList.add('idle'); | ||
| await runScript(b1, s1); | ||
| await wait(450); w2.classList.remove('idle'); await wait(350); | ||
| await runScript(b2, s2); | ||
| await wait(3400); | ||
| } | ||
| } | ||
| const vo=new IntersectionObserver(es=>es.forEach(e=>{ if(e.isIntersecting && !running){ play(); } }),{threshold:.15}); | ||
| vo.observe(document.getElementById('term1')); | ||
| })(); |
There was a problem hiding this comment.
3. Animations never pause 🐞 Bug ➹ Performance
The hero terminal demo starts an infinite async loop (for(;;)) the first time it becomes visible and never stops when the element scrolls out of view. This keeps doing timed DOM work in the background, increasing CPU/battery usage on long-lived tabs (especially on mobile).
Agent Prompt
### Issue description
The hero terminal animation runs forever once started (`for(;;)`), and the IntersectionObserver only starts it—there is no mechanism to pause/cancel when the hero is no longer visible.
### Issue Context
This is a marketing page; background CPU/battery drain is avoidable and can be noticeable on mobile.
### Fix Focus Areas
- site/index.html[1179-1192]
### Suggested fix
- Track `active` state from IntersectionObserver (`active = entry.isIntersecting`).
- In `play()`:
- Replace `for(;;)` with `while (active)` and/or periodically check `active` between steps.
- When `active` becomes false, exit the loop and allow restart when visible again.
- Optionally honor `prefers-reduced-motion` by skipping the animation entirely when users request reduced motion.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Adds the production website to the repo so it's version-controlled alongside Blindfold (it was previously untracked — living only on a local machine + the Vercel deployment).
What's added
site/index.html— the production landing page (hero, nested architecture + wire animation, responsive system-design flow diagram, three-paths, providers, live proof, 8-dimension comparison table with heatmap + copy, interactive command reference, pricing with testnet overlay, FAQ)site/faq.html— the full FAQ page (25 Q&A, live search, comparison table)site/og.png+site/og.svg— the share card (1200×630) + its sourcevercel.json+.vercelignore— servesite/statically; upload only the landing page, never the rest of the monorepoLive at https://blindfold-rho.vercel.app. No secrets in
site/(verified).Summary by cubic
Version-controls the production marketing site and serves it statically from
site/on Vercel. Only the site is deployed; the rest of the monorepo stays out of uploads.site/index.html— production landing page (hero, architecture, diagrams, providers, comparison table, commands, pricing, FAQ link).site/faq.html— full FAQ (25 Q&A) with live search and comparison table.site/og.pngandsite/og.svg— share card and source.vercel.json— static deploy ofsite/, clean URLs, cache header forog.png..vercelignore— upload onlysite/andvercel.json.Written for commit 8593730. Summary will update on new commits.