diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..6db8a04 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,37 @@ +name: Publish marketing site + +on: + push: + branches: [master] + paths: + - "site/**" + - ".github/workflows/pages.yml" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: github-pages + cancel-in-progress: true + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Check out source + uses: actions/checkout@v4 + - name: Configure GitHub Pages + uses: actions/configure-pages@v5 + - name: Upload site artifact + uses: actions/upload-pages-artifact@v3 + with: + path: site + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/AGENTS.md b/AGENTS.md index 6084bef..33f9ad0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -37,9 +37,11 @@ versioned with the analyzed project in .risk-gate.yaml. 10. Before declaring an integration complete, prove the real path: PR event, configuration loading, diff, analysis, gate execution, comment, and Action exit code. -11. All documentation, comments, CLI messages, reports, examples, and other - user-facing project text must be written in English. Preserve exact - identifiers, YAML keys, API fields, exit codes, and code literals. +11. Write documentation, comments, CLI messages, reports, examples, and other + user-facing project text in English, except for the marketing site in site/, + which must support English, Portuguese, Spanish, Japanese, and Chinese. + Preserve exact identifiers, YAML keys, API fields, exit codes, and code + literals. ## AST and language model diff --git a/site/.nojekyll b/site/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000..a23bbd4 --- /dev/null +++ b/site/README.md @@ -0,0 +1,19 @@ +# Risk Gate marketing site + +This static, responsive landing page lives in `site/` and supports English, +Portuguese, Spanish, Japanese, and Chinese. The language selector follows the +browser language on first visit and remembers the visitor's choice. + +## GitHub Pages deployment + +The `Publish marketing site` workflow uploads `site/` and deploys it to GitHub +Pages when site files change on `master`, or when manually dispatched. + +In the repository's **Settings → Pages**, set **Build and deployment → Source** +to **GitHub Actions**. Merge the site and workflow to `master`; the workflow +publishes the landing page and exposes its URL in the `github-pages` +environment. + +The hero video is a locally bundled, silent MP4 with a poster image. It loops +muted, provides native playback controls, and is not downloaded from a third +party. diff --git a/site/assets/app.js b/site/assets/app.js new file mode 100644 index 0000000..87d7fda --- /dev/null +++ b/site/assets/app.js @@ -0,0 +1,54 @@ +const copy = { + en: { + navHow:"How it works",navTeams:"For your team",navQuick:"Quick start",languageLabel:"Choose language",navGithub:"View on GitHub",eyebrow:"OPEN SOURCE · GITHUB ACTION",headline:"Ship with
impact in view.",subhead:"Risk Gate maps what changed to what matters. Then it runs the checks that change deserves, before it reaches production.",ctaStart:"Add to your workflow",ctaHow:"See how it works",metaRust:"Built in Rust",metaOpen:"Open source",metaRepo:"Runs in your GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Your browser does not support embedded video.",live:"LIVE FLOW",prTitle:"Checkout service update",prFiles:"8 files changed",pipeDiff:"Map changed files",pipeDiffSub:"PR diff · dependency graph",pipeRisk:"Impact detected",pipeRiskSub:"Payments → checkout → API",pipeChecks:"Run risk-matched checks",pipeChecksSub:"E2E + mutation suite",done:"DONE",highRisk:"HIGH RISK",running:"RUNNING",teamReview:"Product + Support in the loop",teamReviewSub:"One clear report, shared context",riskLevel:"CHANGE RISK",riskHigh:"HIGH",lowRisk:"LOW",dangerRisk:"DANGER",visualFoot:"Checks scale with impact. Every decision has a reason.",chipAst:"Full-project AST",chipEvidence:"Auditable evidence",scroll:"SCROLL TO EXPLORE",trustLabel:"BUILT FOR THE WAY TEAMS SHIP",trustOne:"PR-aware",trustTwo:"Risk-proportional",trustThree:"Explainable by design",trustFour:"Runs where you work",howEyebrow:"FROM DIFF TO DECISION",howTitle:"Every change has
a different blast radius.",howIntro:"A typo and a payment-flow rewrite should not face the same gate. Risk Gate traces impact through your project, then makes the next step clear.",stepOneTag:"UNDERSTAND",stepOneTitle:"Trace the change",stepOneText:"Connect changed files to modules and dependencies across the full supported project AST.",stepTwoTag:"ASSESS",stepTwoTitle:"Make risk legible",stepTwoText:"See the affected paths, risk level, and dependency chain behind every recommendation.",stepThreeTag:"RESPOND",stepThreeTitle:"Gate what matters",stepThreeText:"Run configured validations and require approvals in proportion to the risk.",gateChecks:"CHECKS",gateReview:"REVIEW",gatePassed:"POLICY MATCHED",flowCaption:"ANALYZE → EXPLAIN → VALIDATE → REPORT",teamsEyebrow:"ONE DECISION, SHARED CONTEXT",teamsTitle:"Engineering sees
the graph.
Teams see the why.",teamsText:"A pull request report gives Engineering evidence to act on, Product a clear view of customer-facing impact, and Support the context to prepare. No one has to decode a green checkmark.",teamsLink:"Explore the analysis",boardTitle:"SHARED RELEASE CONTEXT",changeLabel:"CHANGE",changeTitle:"Checkout retry logic",changeHigh:"HIGH",impactLabel:"IMPACT PATH",roleEng:"Engineering",roleEngSub:"E2E + mutation checks required",statusRunning:"Validating",roleProduct:"Product",roleProductSub:"Customer impact is visible",roleSupport:"Support",roleSupportSub:"Release context is ready",statusReady:"Informed",boardFoot:"Evidence stays attached to the pull request.",startEyebrow:"A SMALL STEP IN YOUR WORKFLOW",startTitle:"Bring risk into
the pull request.",startText:"Add a workflow, define your repository's risk map, and let your team tune the gates to fit how you ship.",startGithub:"Get started on GitHub",startNote:"Open source · Runs in your workflow · Your rules, your repository",copy:"COPY",copied:"Copied",codeReady:"Ready for your next pull request",closing:"Make the risk visible.
Make the next step clear.",footer:"Open source, built for teams that ship." + }, + pt: { + navHow:"Como funciona",navTeams:"Para seu time",navQuick:"Comece rápido",languageLabel:"Escolha o idioma",navGithub:"Ver no GitHub",eyebrow:"CÓDIGO ABERTO · GITHUB ACTION",headline:"Publique com
impacto à vista.",subhead:"O Risk Gate relaciona o que mudou ao que importa. Depois executa as verificações adequadas antes de chegar à produção.",ctaStart:"Adicione ao workflow",ctaHow:"Veja como funciona",metaRust:"Feito em Rust",metaOpen:"Código aberto",metaRepo:"Executa no seu GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Seu navegador não suporta vídeo incorporado.",live:"FLUXO AO VIVO",prTitle:"Atualização do checkout",prFiles:"8 arquivos alterados",pipeDiff:"Mapear arquivos alterados",pipeDiffSub:"Diff do PR · grafo de dependências",pipeRisk:"Impacto identificado",pipeRiskSub:"Pagamentos → checkout → API",pipeChecks:"Executar verificações por risco",pipeChecksSub:"E2E + mutação",done:"OK",highRisk:"RISCO ALTO",running:"EXECUTANDO",teamReview:"Produto + Suporte no contexto",teamReviewSub:"Um relatório claro, contexto compartilhado",riskLevel:"RISCO DA MUDANÇA",riskHigh:"ALTO",lowRisk:"BAIXO",dangerRisk:"CRÍTICO",visualFoot:"As verificações acompanham o impacto. Toda decisão tem um motivo.",chipAst:"AST do projeto completo",chipEvidence:"Evidências auditáveis",scroll:"ROLE PARA EXPLORAR",trustLabel:"FEITO PARA O JEITO QUE OS TIMES ENTREGAM",trustOne:"Entende PRs",trustTwo:"Proporcional ao risco",trustThree:"Explicável por design",trustFour:"Roda onde você trabalha",howEyebrow:"DO DIFF À DECISÃO",howTitle:"Cada mudança tem
um raio de impacto.",howIntro:"Um ajuste de texto e uma mudança no fluxo de pagamentos não deveriam passar pela mesma barreira. O Risk Gate rastreia o impacto e deixa claro o próximo passo.",stepOneTag:"ENTENDA",stepOneTitle:"Rastreie a mudança",stepOneText:"Conecte arquivos alterados a módulos e dependências em toda a AST suportada do projeto.",stepTwoTag:"AVALIE",stepTwoTitle:"Deixe o risco claro",stepTwoText:"Veja os caminhos afetados, o nível de risco e a cadeia de dependências por trás da recomendação.",stepThreeTag:"AJA",stepThreeTitle:"Valide o que importa",stepThreeText:"Execute validações configuradas e exija aprovações proporcionais ao risco.",gateChecks:"TESTES",gateReview:"REVISÃO",gatePassed:"POLÍTICA APLICADA",flowCaption:"ANALISAR → EXPLICAR → VALIDAR → RELATAR",teamsEyebrow:"UMA DECISÃO, CONTEXTO COMPARTILHADO",teamsTitle:"Engenharia vê
o grafo.
O time entende o motivo.",teamsText:"O relatório do pull request dá evidências para Engenharia agir, visibilidade do impacto no cliente para Produto e contexto para Suporte se preparar. Ninguém precisa decifrar um sinal verde.",teamsLink:"Explore a análise",boardTitle:"CONTEXTO DE LANÇAMENTO COMPARTILHADO",changeLabel:"MUDANÇA",changeTitle:"Nova tentativa no checkout",changeHigh:"ALTO",impactLabel:"CAMINHO DO IMPACTO",roleEng:"Engenharia",roleEngSub:"Testes E2E + mutação necessários",statusRunning:"Validando",roleProduct:"Produto",roleProductSub:"Impacto no cliente visível",roleSupport:"Suporte",roleSupportSub:"Contexto da versão disponível",statusReady:"Informado",boardFoot:"As evidências ficam no pull request.",startEyebrow:"UM PEQUENO PASSO NO SEU WORKFLOW",startTitle:"Traga o risco para
o pull request.",startText:"Adicione um workflow, defina o mapa de risco do repositório e ajuste as barreiras ao jeito que seu time entrega.",startGithub:"Comece pelo GitHub",startNote:"Código aberto · No seu workflow · Suas regras, seu repositório",copy:"COPIAR",copied:"Copiado",codeReady:"Pronto para o próximo pull request",closing:"Deixe o risco visível.
Deixe claro o próximo passo.",footer:"Código aberto para times que entregam." + }, + es: { + navHow:"Cómo funciona",navTeams:"Para tu equipo",navQuick:"Inicio rápido",languageLabel:"Elegir idioma",navGithub:"Ver en GitHub",eyebrow:"CÓDIGO ABIERTO · GITHUB ACTION",headline:"Publica con
el impacto a la vista.",subhead:"Risk Gate conecta lo que cambió con lo que importa. Después ejecuta las comprobaciones adecuadas antes de llegar a producción.",ctaStart:"Añadir al workflow",ctaHow:"Ver cómo funciona",metaRust:"Hecho en Rust",metaOpen:"Código abierto",metaRepo:"Se ejecuta en tu GitHub Actions",visualTitle:"PULL REQUEST · #284",videoFallback:"Tu navegador no admite vídeo integrado.",live:"FLUJO EN VIVO",prTitle:"Actualización del checkout",prFiles:"8 archivos modificados",pipeDiff:"Mapear archivos modificados",pipeDiffSub:"Diff del PR · grafo de dependencias",pipeRisk:"Impacto detectado",pipeRiskSub:"Pagos → checkout → API",pipeChecks:"Ejecutar pruebas según el riesgo",pipeChecksSub:"E2E + mutación",done:"LISTO",highRisk:"RIESGO ALTO",running:"EJECUTANDO",teamReview:"Producto + Soporte al tanto",teamReviewSub:"Un informe claro, contexto compartido",riskLevel:"RIESGO DEL CAMBIO",riskHigh:"ALTO",lowRisk:"BAJO",dangerRisk:"CRÍTICO",visualFoot:"Las comprobaciones escalan con el impacto. Cada decisión tiene un motivo.",chipAst:"AST del proyecto completo",chipEvidence:"Evidencia auditable",scroll:"DESPLAZA PARA EXPLORAR",trustLabel:"DISEÑADO PARA LA FORMA EN QUE LOS EQUIPOS PUBLICAN",trustOne:"Entiende PRs",trustTwo:"Proporcional al riesgo",trustThree:"Explicable por diseño",trustFour:"Se ejecuta donde trabajas",howEyebrow:"DEL DIFF A LA DECISIÓN",howTitle:"Cada cambio tiene
un radio de impacto distinto.",howIntro:"Un cambio de texto y una reescritura del flujo de pagos no deberían pasar por la misma barrera. Risk Gate rastrea el impacto y aclara el siguiente paso.",stepOneTag:"ENTENDER",stepOneTitle:"Rastrea el cambio",stepOneText:"Conecta los archivos modificados con módulos y dependencias en todo el AST compatible del proyecto.",stepTwoTag:"EVALUAR",stepTwoTitle:"Haz visible el riesgo",stepTwoText:"Consulta las rutas afectadas, el nivel de riesgo y la cadena de dependencias que fundamentan cada recomendación.",stepThreeTag:"ACTUAR",stepThreeTitle:"Valida lo importante",stepThreeText:"Ejecuta validaciones configuradas y exige aprobaciones proporcionales al riesgo.",gateChecks:"PRUEBAS",gateReview:"REVISIÓN",gatePassed:"POLÍTICA APLICADA",flowCaption:"ANALIZAR → EXPLICAR → VALIDAR → INFORMAR",teamsEyebrow:"UNA DECISIÓN, CONTEXTO COMPARTIDO",teamsTitle:"Ingeniería ve
el grafo.
El equipo entiende por qué.",teamsText:"El informe del pull request da a Ingeniería pruebas para actuar, a Producto una visión clara del impacto en los clientes y a Soporte el contexto para prepararse. Nadie tiene que descifrar una marca verde.",teamsLink:"Explorar el análisis",boardTitle:"CONTEXTO COMPARTIDO DEL LANZAMIENTO",changeLabel:"CAMBIO",changeTitle:"Reintentos en checkout",changeHigh:"ALTO",impactLabel:"RUTA DEL IMPACTO",roleEng:"Ingeniería",roleEngSub:"Se requieren pruebas E2E + mutación",statusRunning:"Validando",roleProduct:"Producto",roleProductSub:"Impacto en clientes visible",roleSupport:"Soporte",roleSupportSub:"Contexto de lanzamiento listo",statusReady:"Informado",boardFoot:"Las pruebas quedan en el pull request.",startEyebrow:"UN PEQUEÑO PASO EN TU WORKFLOW",startTitle:"Lleva el riesgo
al pull request.",startText:"Añade un workflow, define el mapa de riesgo del repositorio y ajusta las barreras a la forma de publicar de tu equipo.",startGithub:"Empieza en GitHub",startNote:"Código abierto · En tu workflow · Tus reglas, tu repositorio",copy:"COPIAR",copied:"Copiado",codeReady:"Listo para tu próximo pull request",closing:"Haz visible el riesgo.
Deja claro el siguiente paso.",footer:"Código abierto para equipos que publican." + }, + ja: { + navHow:"仕組み",navTeams:"チームで活用",navQuick:"クイックスタート",languageLabel:"言語を選択",navGithub:"GitHubで見る",eyebrow:"オープンソース · GITHUB ACTION",headline:"影響を見据えて
安全にリリース。",subhead:"Risk Gate は変更内容と重要な領域を結び付けます。変更の影響に応じたチェックを本番反映前に実行します。",ctaStart:"ワークフローに追加",ctaHow:"仕組みを見る",metaRust:"Rust製",metaOpen:"オープンソース",metaRepo:"GitHub Actions 上で実行",visualTitle:"PULL REQUEST · #284",videoFallback:"お使いのブラウザーは埋め込み動画に対応していません。",live:"ライブフロー",prTitle:"チェックアウト機能の更新",prFiles:"8ファイルを変更",pipeDiff:"変更ファイルをマッピング",pipeDiffSub:"PR差分 · 依存関係グラフ",pipeRisk:"影響を検出",pipeRiskSub:"決済 → チェックアウト → API",pipeChecks:"リスクに応じたチェックを実行",pipeChecksSub:"E2E + ミューテーション",done:"完了",highRisk:"高リスク",running:"実行中",teamReview:"プロダクトとサポートも共有",teamReviewSub:"明確なレポートで状況を共有",riskLevel:"変更のリスク",riskHigh:"高",lowRisk:"低",dangerRisk:"重大",visualFoot:"影響に応じてチェックを調整。すべての判断に根拠があります。",chipAst:"プロジェクト全体のAST",chipEvidence:"監査可能な根拠",scroll:"スクロールして詳細を見る",trustLabel:"チームのリリース運用に合わせて設計",trustOne:"PRを解析",trustTwo:"リスクに比例",trustThree:"根拠を説明",trustFour:"GitHub内で実行",howEyebrow:"差分から判断へ",howTitle:"変更ごとに
影響範囲は異なります。",howIntro:"文言修正と決済フローの変更に同じゲートは不要です。Risk Gate がプロジェクト内の影響をたどり、次の対応を明確にします。",stepOneTag:"把握",stepOneTitle:"変更を追跡",stepOneText:"変更ファイルをモジュールや依存関係に結び付け、対応言語のプロジェクト全体のASTを解析します。",stepTwoTag:"評価",stepTwoTitle:"リスクを可視化",stepTwoText:"影響するパス、リスクレベル、判断の根拠となる依存関係を確認できます。",stepThreeTag:"対応",stepThreeTitle:"重要な変更をゲート",stepThreeText:"設定済みの検証を実行し、リスクに応じて承認を求めます。",gateChecks:"検証",gateReview:"レビュー",gatePassed:"ポリシー適用済み",flowCaption:"解析 → 説明 → 検証 → レポート",teamsEyebrow:"判断と状況をチームで共有",teamsTitle:"エンジニアには
依存グラフを。
チームには理由を。",teamsText:"PRレポートは、エンジニアに対応の根拠を、プロダクトに顧客影響を、サポートに準備のための状況を共有します。緑のチェックマークを読み解く必要はありません。",teamsLink:"解析の詳細を見る",boardTitle:"リリース状況を共有",changeLabel:"変更",changeTitle:"チェックアウトの再試行",changeHigh:"高",impactLabel:"影響経路",roleEng:"エンジニアリング",roleEngSub:"E2Eとミューテーション検証が必要",statusRunning:"検証中",roleProduct:"プロダクト",roleProductSub:"顧客への影響を確認",roleSupport:"サポート",roleSupportSub:"リリース情報を共有",statusReady:"共有済み",boardFoot:"根拠はPRに記録されます。",startEyebrow:"ワークフローに加える小さな一歩",startTitle:"リスクを
Pull Requestへ。",startText:"ワークフローを追加してリポジトリのリスクマップを定義し、チームの運用に合わせてゲートを調整します。",startGithub:"GitHubで始める",startNote:"オープンソース · ワークフローで実行 · 自分のルールとリポジトリ",copy:"コピー",copied:"コピーしました",codeReady:"次のPull Requestから利用できます",closing:"リスクを見える化。
次の対応を明確に。",footer:"リリースを続けるチームのためのオープンソース。" + }, + zh: { + navHow:"工作原理",navTeams:"团队协作",navQuick:"快速开始",languageLabel:"选择语言",navGithub:"在 GitHub 查看",eyebrow:"开源项目 · GITHUB ACTION",headline:"看清影响,
稳妥发布。",subhead:"Risk Gate 将代码变更与关键模块关联,并在上线前执行与变更风险相匹配的检查。",ctaStart:"添加到工作流",ctaHow:"了解工作原理",metaRust:"使用 Rust 构建",metaOpen:"开源",metaRepo:"在你的 GitHub Actions 中运行",visualTitle:"PULL REQUEST · #284",videoFallback:"你的浏览器不支持嵌入式视频。",live:"实时流程",prTitle:"结账服务更新",prFiles:"修改了 8 个文件",pipeDiff:"映射变更文件",pipeDiffSub:"PR 差异 · 依赖关系图",pipeRisk:"检测到影响",pipeRiskSub:"支付 → 结账 → API",pipeChecks:"执行匹配风险的检查",pipeChecksSub:"E2E + 变异测试",done:"完成",highRisk:"高风险",running:"运行中",teamReview:"产品与支持团队同步了解",teamReviewSub:"清晰报告,共享上下文",riskLevel:"变更风险",riskHigh:"高",lowRisk:"低",dangerRisk:"严重",visualFoot:"检查随影响程度调整。每项判断都有依据。",chipAst:"完整项目 AST",chipEvidence:"可审计证据",scroll:"向下探索",trustLabel:"为团队的交付流程而设计",trustOne:"理解 PR",trustTwo:"风险匹配",trustThree:"解释清晰",trustFour:"在现有工作流中运行",howEyebrow:"从差异到决策",howTitle:"每项变更都有
不同的影响范围。",howIntro:"文案调整和支付流程重构不应经过相同的关卡。Risk Gate 会追踪项目中的影响路径,并明确下一步操作。",stepOneTag:"理解",stepOneTitle:"追踪变更",stepOneText:"在完整的受支持项目 AST 中,将变更文件与模块和依赖项关联起来。",stepTwoTag:"评估",stepTwoTitle:"让风险一目了然",stepTwoText:"查看受影响路径、风险级别,以及每项建议背后的依赖链。",stepThreeTag:"响应",stepThreeTitle:"把关关键变更",stepThreeText:"运行已配置的验证,并根据风险要求相应审批。",gateChecks:"检查",gateReview:"评审",gatePassed:"策略已匹配",flowCaption:"分析 → 解释 → 验证 → 报告",teamsEyebrow:"共享决策与上下文",teamsTitle:"工程团队看到
依赖图。
团队理解原因。",teamsText:"Pull Request 报告为工程团队提供行动依据,让产品团队看清客户影响,也帮助支持团队提前准备。无需猜测绿色勾号代表什么。",teamsLink:"了解分析过程",boardTitle:"共享发布上下文",changeLabel:"变更",changeTitle:"结账重试逻辑",changeHigh:"高",impactLabel:"影响路径",roleEng:"工程",roleEngSub:"需要 E2E + 变异检查",statusRunning:"验证中",roleProduct:"产品",roleProductSub:"客户影响清晰可见",roleSupport:"支持",roleSupportSub:"发布信息已准备",statusReady:"已同步",boardFoot:"证据会保留在 Pull Request 中。",startEyebrow:"为工作流迈出一小步",startTitle:"让风险进入
Pull Request。",startText:"添加工作流,定义仓库风险映射,并根据团队的交付方式调整关卡。",startGithub:"在 GitHub 开始使用",startNote:"开源 · 在你的工作流中运行 · 你的规则与仓库",copy:"复制",copied:"已复制",codeReady:"准备好处理下一个 Pull Request",closing:"让风险清晰可见。
让下一步明确可行。",footer:"为持续交付的团队打造的开源项目。" + } +}; +const select = document.querySelector("#language"); +const supported = Object.keys(copy); +function setLanguage(language) { + const lang = supported.includes(language) ? language : "en"; + document.documentElement.lang = ({en:"en",pt:"pt-BR",es:"es",ja:"ja",zh:"zh-CN"})[lang]; + document.querySelectorAll("[data-i18n]").forEach((node) => { + const key = node.dataset.i18n; + if (copy[lang][key]) node.innerHTML = copy[lang][key]; + }); + select.value = lang; + try { localStorage.setItem("risk-gate-language", lang); } catch (_) {} +} +select.addEventListener("change", () => setLanguage(select.value)); +let saved = null; +try { saved = localStorage.getItem("risk-gate-language"); } catch (_) {} +const browser = (navigator.language || "en").toLowerCase(); +const initial = saved && supported.includes(saved) ? saved : browser.startsWith("pt") ? "pt" : browser.startsWith("es") ? "es" : browser.startsWith("ja") ? "ja" : browser.startsWith("zh") ? "zh" : "en"; +setLanguage(initial); +const copyButton = document.querySelector("#copy-code"); +const toast = document.querySelector("#copy-toast"); +const code = document.querySelector(".code-window code"); +async function copyWorkflow() { + try { + await navigator.clipboard.writeText(code.innerText); + toast.classList.add("show"); + window.setTimeout(() => toast.classList.remove("show"), 1500); + } catch (_) { + copyButton.textContent = "⌘C"; + window.setTimeout(() => copyButton.textContent = copy[select.value].copy, 1200); + } +} +copyButton.addEventListener("click", copyWorkflow); +copyButton.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); copyWorkflow(); } }); +if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) document.querySelector(".hero-video").pause(); + +const observer = new IntersectionObserver((entries) => entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("in-view"); observer.unobserve(entry.target); } }), { threshold: 0.15 }); +document.querySelectorAll(".step-card, .team-board, .code-window, .section-heading").forEach((element) => observer.observe(element)); diff --git a/site/assets/risk-gate-hero-poster.jpg b/site/assets/risk-gate-hero-poster.jpg new file mode 100644 index 0000000..50e817d Binary files /dev/null and b/site/assets/risk-gate-hero-poster.jpg differ diff --git a/site/assets/risk-gate-hero.mp4 b/site/assets/risk-gate-hero.mp4 new file mode 100644 index 0000000..30e5638 Binary files /dev/null and b/site/assets/risk-gate-hero.mp4 differ diff --git a/site/assets/styles.css b/site/assets/styles.css new file mode 100644 index 0000000..6ed1bb9 --- /dev/null +++ b/site/assets/styles.css @@ -0,0 +1,9 @@ +:root{color-scheme:dark;--bg:#101716;--panel:#151e1b;--panel2:#19231f;--line:#26322d;--muted:#94a49c;--white:#f0f2e9;--mint:#c8f07a;--mint2:#91c854;--orange:#f3a26d;--mono:'DM Mono',monospace;--sans:'DM Sans',sans-serif;--display:Manrope,'DM Sans',sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:90px}body{margin:0;background:var(--bg);color:var(--white);font-family:var(--sans);font-size:15px;line-height:1.6;overflow-x:hidden}body:before{content:"";position:absolute;inset:0 0 auto;height:890px;pointer-events:none;background:radial-gradient(ellipse 50% 62% at 80% 14%,rgba(76,113,71,.2),transparent 72%),radial-gradient(ellipse 33% 42% at 14% 44%,rgba(79,120,80,.08),transparent 70%)}.grain{position:fixed;inset:0;z-index:5;pointer-events:none;opacity:.08;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.22'/%3E%3C/svg%3E")}.wrap{width:min(1160px,calc(100% - 56px));margin-inline:auto}.topbar{height:84px;display:flex;align-items:center;justify-content:space-between;position:relative;z-index:10;border-bottom:1px solid rgba(190,212,194,.09)}.brand{display:flex;align-items:center;gap:10px;color:var(--white);font:800 18px var(--display);letter-spacing:-1.1px;text-decoration:none}.brand-light{color:#91a399;font-weight:500}.brand-mark{width:22px;height:22px;display:flex;align-items:flex-end;gap:3px}.brand-mark i{display:block;width:5px;border-radius:4px;background:var(--mint);box-shadow:0 0 12px #c8f07745}.brand-mark i:nth-child(1){height:10px}.brand-mark i:nth-child(2){height:16px}.brand-mark i:nth-child(3){height:21px}.nav-links{display:flex;gap:35px;margin-left:120px}.nav-links a,.nav-actions a{font-size:12px;color:#acb7b1;text-decoration:none;transition:color .2s}.nav-links a:hover,.nav-actions a:hover{color:var(--mint)}.nav-actions{display:flex;align-items:center;gap:19px}#language{background:transparent;border:1px solid #304038;border-radius:5px;color:var(--white);padding:7px 8px;font:11px var(--mono);cursor:pointer}#language option{background:#15201b}.nav-cta{display:flex;align-items:center;gap:8px!important;color:var(--white)!important;padding:10px 13px;border:1px solid #36443b;border-radius:5px}.nav-cta span:last-child{color:var(--mint);font-size:15px}.hero{min-height:680px;padding:115px 0 78px;display:grid;grid-template-columns:.88fr 1.12fr;align-items:center;gap:45px;position:relative}.hero-copy{padding-bottom:18px}.eyebrow{display:flex;align-items:center;gap:10px;color:var(--mint);font:10px var(--mono);letter-spacing:1.35px}.pulse{width:7px;height:7px;background:var(--mint);border-radius:50%;box-shadow:0 0 0 4px #c8f07717;animation:pulse 2.2s infinite}.hero h1,.section h2,.team-copy h2,.quickstart-copy h2{margin:25px 0 21px;font:600 clamp(47px,5.4vw,68px)/1.04 var(--display);letter-spacing:-4.5px}.hero h1 em,.section h2 em,.team-copy h2 em,.quickstart-copy h2 em{font-style:normal;color:var(--mint)}.hero-sub{max-width:438px;color:#a9b5ad;font-size:15px;line-height:1.8}.hero-actions{display:flex;align-items:center;gap:21px;margin-top:31px}.button{display:inline-flex;align-items:center;gap:13px;text-decoration:none;font-size:12px;font-weight:700;transition:transform .2s,background .2s}.button:hover{transform:translateY(-2px)}.button-primary{padding:14px 17px;border-radius:5px;background:var(--mint);color:#101711}.button-primary span:last-child{font-size:15px}.button-quiet{color:#e3e8df}.play-icon{display:grid;place-items:center;width:28px;height:28px;border:1px solid #536058;border-radius:50%;font-size:8px;color:var(--mint);padding-left:2px}.hero-meta{display:flex;gap:20px;margin-top:35px;color:#829188;font:9px var(--mono)}.hero-meta span{display:flex;align-items:center;gap:6px}.meta-dot{width:4px;height:4px;border-radius:50%;background:#6a8570}.hero-visual{position:relative;border:1px solid #35443a;background:linear-gradient(140deg,#1b2620,#111916 71%);border-radius:9px;box-shadow:0 30px 90px #0007,0 0 70px #b5ee6810;transform:perspective(1200px) rotateY(-3deg) rotateX(1deg);animation:float 7s ease-in-out infinite}.visual-top{height:45px;padding:0 16px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #2c3931}.window-dots{display:flex;gap:5px}.window-dots i{width:6px;height:6px;border-radius:50%;background:#536157}.window-dots i:first-child{background:#db8075}.window-dots i:nth-child(2){background:#dcb968}.window-dots i:last-child{background:#79b879}.visual-label{font:9px var(--mono);letter-spacing:1px;color:#839087}.live-tag{font:8px var(--mono);letter-spacing:.8px;color:#9faea3;display:flex;align-items:center;gap:6px}.live-tag b,.code-status i{width:5px;height:5px;border-radius:50%;background:var(--mint);box-shadow:0 0 7px #c8f077}.visual-body{padding:18px 19px 14px}.pr-card{display:flex;align-items:center;gap:10px;padding:11px 12px;border:1px solid #303d34;background:#18221d;border-radius:5px}.pr-icon{display:grid;place-items:center;width:28px;height:28px;border-radius:5px;background:#29392c;color:var(--mint);font-size:18px}.pr-title{font-size:11px;font-weight:700}.pr-caption{display:flex;gap:6px;align-items:center;color:#84928a;font-size:8px;margin-top:2px}.mono{font:8px var(--mono);color:#9eb1a2}.pr-check{margin-left:auto;display:grid;place-items:center;width:20px;height:20px;border-radius:50%;background:#c8f0771e;color:var(--mint);font-size:11px}.flow-line{height:21px;width:1px;background:#475b49;margin-left:26px;position:relative}.flow-line span{position:absolute;top:0;width:4px;height:4px;left:-1.5px;border-radius:50%;background:var(--mint);animation:flow 2.2s ease-in-out infinite}.pipeline{border:1px solid #303d34;border-radius:5px;overflow:hidden}.pipe-step{height:52px;display:flex;align-items:center;gap:9px;padding:0 11px;border-bottom:1px solid #2a352e;position:relative}.pipe-step:last-child{border:0}.step-icon{width:19px;height:19px;display:grid;place-items:center;border-radius:50%;font-size:10px}.done .step-icon{background:#c8f07718;color:var(--mint)}.active .step-icon{background:#f3a26d1c;color:var(--orange)}.spin{animation:spin 2.4s linear infinite;font-size:14px}.pipe-step strong{display:block;font-size:10px;font-weight:600}.pipe-step small{display:block;color:#829087;font-size:8px;margin-top:1px}.step-state,.running,.risk-pill{margin-left:auto;font:8px var(--mono);letter-spacing:.5px}.step-state{color:#91c67b}.running{color:var(--orange)}.risk-pill{color:#ffb685;background:#f3a26d16;border:1px solid #f3a26d38;border-radius:3px;padding:3px 5px}.review-row{margin-top:10px;display:flex;align-items:center;gap:9px;padding:9px 10px;background:#202b24;border-radius:4px}.review-avatars{display:flex;padding-left:3px}.avatar{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;font-size:8px;font-weight:700;border:2px solid #202b24;margin-left:-3px}.avatar-product{background:#8196df;color:white}.avatar-support{background:#c48361;color:white}.review-copy strong{display:block;font-size:9px}.review-copy small{display:block;color:#89978e;font-size:8px}.review-arrow{margin-left:auto;color:#9ab684}.risk-meter{padding:11px 2px 0}.meter-label,.meter-foot{display:flex;justify-content:space-between;font:8px var(--mono);color:#84948b;letter-spacing:.7px}.meter-value{color:var(--orange)}.meter-bars{display:flex;gap:3px;margin:6px 0 3px}.meter-bars i{height:4px;flex:1;border-radius:2px;background:#344238}.meter-bars i:first-child{background:#75ba70}.meter-bars i:nth-child(2){background:#a8c96d}.meter-bars i:nth-child(3){background:#e2c36d}.meter-bars i:nth-child(4){background:#e5a365}.meter-bars i:nth-child(5){background:#f39b6c;box-shadow:0 0 10px #f39b6c70}.meter-foot{font-size:7px;color:#6f7e74}.visual-foot{padding:10px 18px;display:flex;gap:8px;align-items:center;border-top:1px solid #2a352e;color:#aab5ad;font-size:9px}.foot-check{color:var(--mint)}.float-chip{position:absolute;padding:8px 10px;border:1px solid #3c4c40;background:#19231f;border-radius:4px;box-shadow:0 8px 20px #0006;color:#b9c8ba;font:8px var(--mono);letter-spacing:.2px;white-space:nowrap}.float-chip span:first-child{color:var(--mint);padding-right:3px}.chip-one{top:69px;right:-31px;animation:float 5s ease-in-out infinite}.chip-two{bottom:76px;left:-32px;animation:float 5s ease-in-out -2.2s infinite}.hero-scroll{position:absolute;left:0;bottom:28px;display:flex;align-items:center;gap:9px;color:#6e7d74;font:8px var(--mono);letter-spacing:1.2px}.hero-scroll span:first-child{width:1px;height:27px;background:linear-gradient(var(--mint),transparent)}.trust-strip{border-block:1px solid #26322d;background:#131a17}.trust-inner{min-height:77px;display:flex;align-items:center;justify-content:space-between;gap:30px}.trust-inner>span{font:9px var(--mono);letter-spacing:1px;color:#829087;white-space:nowrap}.trust-items{display:flex;gap:37px}.trust-items span{font-size:10px;color:#9eaaa2}.trust-items b{font:9px var(--mono);color:var(--mint);margin-right:5px}.section{padding-top:126px;padding-bottom:110px}.section-heading{display:grid;grid-template-columns:1fr .62fr;align-items:end;gap:30px;margin-bottom:53px}.eyebrow-num{color:#79916e}.section h2,.team-copy h2,.quickstart-copy h2{font-size:47px;letter-spacing:-2.8px;line-height:1.08;margin:20px 0 0}.section-heading>p{max-width:390px;color:#99a69d;font-size:13px;line-height:1.8;margin-bottom:4px}.steps-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.step-card{padding:17px 17px 22px;background:linear-gradient(145deg,#19221d,#141b18);border:1px solid #2c3931;border-radius:6px;min-width:0;opacity:0;transform:translateY(18px);transition:opacity .7s,transform .7s}.step-card.in-view{opacity:1;transform:none}.step-card:nth-child(2){transition-delay:.13s}.step-card:nth-child(3){transition-delay:.26s}.card-index{font:9px var(--mono);color:#6e7d73;letter-spacing:.9px}.card-index span:first-child{color:#435047;margin:0 5px}.card-art{height:160px;margin:14px 0 20px;border:1px solid #2b382f;border-radius:4px;background:radial-gradient(ellipse at 50% 55%,#28372b,#161e1a 66%);position:relative;overflow:hidden}.step-card h3{font:600 16px var(--display);margin:0 0 7px;letter-spacing:-.4px}.step-card>p{font-size:11px;line-height:1.7;color:#92a097;margin:0}.graph-node{position:absolute;z-index:2;display:grid;place-items:center;width:31px;height:31px;border-radius:50%;background:#203025;border:1px solid #63854f;color:var(--mint);font:9px var(--mono);box-shadow:0 0 18px #b9f07518}.node-a{left:16%;top:44%}.node-b{left:44%;top:25%}.node-c{right:18%;top:43%;background:#302721;border-color:#a4704c;color:#ffb785}.node-d{left:44%;bottom:10%;background:#242c3a;border-color:#5c7095;color:#a8b9f5}.graph-link{position:absolute;height:1px;background:#647a57;transform-origin:left}.link-a{width:66px;left:27%;top:48%;transform:rotate(-24deg)}.link-b{width:72px;left:56%;top:36%;transform:rotate(23deg);background:#a6774a}.link-c{width:67px;left:50%;top:48%;transform:rotate(90deg);background:#637597}.graph-orbit{position:absolute;inset:22% 20%;border:1px dashed #57704d46;border-radius:50%;animation:spin 22s linear infinite}.bars-art{padding:23px 16px}.bar-row{height:24px;display:flex;align-items:center;gap:8px;color:#91a097;font:8px var(--mono)}.bar-row>span{width:28px}.bar-row i{height:5px;width:var(--w);max-width:calc(100% - 78px);border-radius:5px;background:#748f68;animation:grow 1.2s ease-out both}.bar-row b{margin-left:auto;font-size:7px;color:#8b9a8e;font-weight:400}.bar-highlight{color:#d8e3ce}.bar-highlight i{background:var(--mint);box-shadow:0 0 11px #c8f07740}.bar-highlight b{color:var(--mint)}.bar-axis{position:absolute;bottom:12px;left:16px;right:16px;display:flex;justify-content:space-between;padding-top:6px;border-top:1px solid #344138;color:#627067;font:7px var(--mono);letter-spacing:.7px}.gate-track{position:absolute;left:21px;right:21px;top:68px;height:1px;background:#536a4f}.gate-track i{position:absolute;top:-3px;width:7px;height:7px;border-radius:50%;background:var(--mint);box-shadow:0 0 12px #c8f07775}.gate-track i:nth-child(1){left:4%}.gate-track i:nth-child(2){left:50%}.gate-track i:nth-child(3){right:4%}.gate-track span{position:absolute;left:4%;top:-1px;height:3px;width:0;background:var(--mint);animation:travel 3s ease-in-out infinite}.gate-core{position:absolute;top:48px;left:calc(50% - 21px);width:42px;height:42px;display:grid;place-items:center;border:1px solid #91bb6a;border-radius:50%;background:#243322;color:var(--mint);font-size:16px;box-shadow:0 0 27px #c8f07729}.gate-label{position:absolute;top:86px;font:7px var(--mono);letter-spacing:1px;color:#819086}.gate-left{left:16px}.gate-right{right:16px}.gate-caption{position:absolute;bottom:15px;left:0;right:0;text-align:center;color:#9cba81;font:8px var(--mono);letter-spacing:.9px}.flow-caption{margin-top:27px;display:flex;align-items:center;justify-content:center;gap:15px;color:#78867c;font:8px var(--mono);letter-spacing:1.1px}.flow-rule{width:60px;height:1px;background:#334038}.team-section{padding:105px 0 112px;border-block:1px solid #26322d;background:radial-gradient(ellipse 38% 88% at 79% 54%,#263527 0%,transparent 73%),#131a17;overflow:hidden}.team-layout{display:grid;grid-template-columns:.79fr 1.21fr;gap:76px;align-items:center}.team-copy h2{margin-top:20px;font-size:43px}.team-copy>p{max-width:410px;color:#9ba8a0;font-size:12px;line-height:1.85;margin:21px 0}.text-link{display:inline-flex;align-items:center;gap:12px;padding-bottom:5px;border-bottom:1px solid #768b68;color:var(--mint);font-size:11px;text-decoration:none}.team-board{position:relative;padding:18px 20px 0;border:1px solid #3b4b3e;border-radius:7px;background:linear-gradient(140deg,#202b23,#151d19 75%);box-shadow:0 25px 65px #0005;overflow:hidden;opacity:0;transform:translateY(20px);transition:opacity .7s,transform .7s}.team-board.in-view{opacity:1;transform:none}.board-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:14px;border-bottom:1px solid #344038}.board-tag{display:flex;align-items:center;gap:7px;color:#9ca89f;font:8px var(--mono);letter-spacing:.9px}.board-tag i{width:5px;height:5px;border-radius:50%;background:var(--mint)}.board-id{font:8px var(--mono);color:#627168}.board-change{display:flex;align-items:center;gap:12px;padding:19px 1px 16px}.change-icon{display:grid;place-items:center;width:35px;height:35px;border-radius:5px;background:#2b392c;color:var(--mint);font-size:18px}.board-change>div:nth-child(2){display:grid;gap:2px}.board-change small,.impact-path>span{font:7px var(--mono);letter-spacing:1px;color:#738177}.board-change strong{font-size:12px}.change-path{font:8px var(--mono);color:#8e9c91}.change-risk{margin-left:auto;color:#ffc08e;background:#ed996c16;border:1px solid #ed996c3c;border-radius:3px;padding:4px 7px;font:8px var(--mono)}.impact-path{padding:12px 0 17px;border-top:1px solid #2e3a32}.path-chips{display:flex;align-items:center;gap:7px;margin-top:9px}.path-chips span{background:#29342b;color:#bac7bb;padding:5px 7px;border-radius:3px;font:8px var(--mono)}.path-chips b{color:#77877b;font:9px var(--mono)}.path-chips .path-warn{background:#3b3027;color:#ffbb87}.board-divider{height:1px;background:#2d3931}.team-rows{padding:5px 0}.team-row{display:flex;align-items:center;gap:10px;padding:9px 0}.team-avatar{width:25px;height:25px;border-radius:50%;display:grid;place-items:center;font-size:9px;font-weight:700}.av-eng{background:#c4ea7c;color:#1c281c}.av-prod{background:#7386c4;color:white}.av-sup{background:#ca9068;color:white}.team-row>div:nth-child(2){display:grid;gap:0}.team-row strong{font-size:9px}.team-row small{color:#85948a;font-size:8px}.team-status{margin-left:auto;display:flex;align-items:center;gap:6px;font:8px var(--mono)}.status-running{color:#e6aa7d}.status-running i{width:5px;height:5px;border-radius:50%;background:var(--orange);animation:pulse 1.8s infinite}.status-ready{color:#9ac87c}.board-footer{margin:0 -20px;padding:11px 20px;border-top:1px solid #2e3a32;background:#19221d;color:#819087;font-size:8px;display:flex;gap:7px;align-items:center}.foot-lock{color:#b3c98b}.board-orbit{position:absolute;border:1px solid #c8f07708;border-radius:50%;pointer-events:none}.orbit-a{width:370px;height:370px;right:-300px;top:20px}.orbit-b{width:270px;height:270px;right:-250px;top:70px}.quickstart-section{padding-top:125px;padding-bottom:117px;display:grid;grid-template-columns:.82fr 1.18fr;gap:75px;align-items:center}.quickstart-copy h2{font-size:45px}.quickstart-copy>p{max-width:355px;color:#9ba8a0;font-size:12px;line-height:1.8;margin:18px 0 24px}.start-note{margin-top:17px;color:#7e8d83;font-size:9px;display:flex;gap:7px;align-items:center}.start-note span:first-child{color:var(--mint)}.code-window{position:relative;border:1px solid #38463c;background:#131a17;border-radius:6px;box-shadow:0 22px 55px #0005;opacity:0;transform:translateY(18px);transition:opacity .7s,transform .7s}.code-window.in-view{opacity:1;transform:none}.code-top{height:43px;padding:0 13px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #2c3830;color:#839087;font:8px var(--mono)}.code-top .window-dots{margin-right:auto}.code-top>span:nth-child(2){margin-left:12px}.code-copy{padding:5px 7px;color:var(--mint);border:1px solid #39483b;border-radius:3px;cursor:pointer}.code-copy:hover{background:#26352a}.code-window pre{margin:0;padding:19px 20px 21px;overflow:auto;color:#c2cec4;font:9px/1.95 var(--mono)}.code-muted{color:#65766b}.code-key{color:#a7cb83}.code-val{color:#e2b785}.code-num{color:#b1a1dc}.code-expr{color:#84bcc2}.code-bottom{height:35px;display:flex;align-items:center;justify-content:space-between;padding:0 14px;border-top:1px solid #2d3931;color:#839087;font:8px var(--mono)}.code-status{display:flex;align-items:center;gap:7px}.code-status i{display:block}.code-lang{color:#718075}.code-toast{position:absolute;right:12px;top:50px;padding:5px 9px;border-radius:3px;background:var(--mint);color:#172017;font-size:9px;opacity:0;transform:translateY(-3px);transition:all .2s;pointer-events:none}.code-toast.show{opacity:1;transform:none}.closing{padding:31px 0 37px;border-top:1px solid #2a362f;border-bottom:1px solid #2a362f;display:flex;align-items:center;gap:19px}.closing-mark{display:flex;gap:3px;align-items:flex-end;height:22px}.closing-mark i{width:4px;border-radius:2px;background:var(--mint)}.closing-mark i:first-child{height:9px}.closing-mark i:nth-child(2){height:15px}.closing-mark i:last-child{height:21px}.closing p{font:600 15px/1.4 var(--display);margin:0;letter-spacing:-.2px}.closing a{margin-left:auto;display:grid;place-items:center;width:34px;height:34px;border:1px solid #445345;border-radius:50%;color:var(--mint);text-decoration:none}.footer{min-height:74px;display:flex;align-items:center;gap:24px;color:#76857b;font-size:9px}.brand-small{font-size:13px}.brand-small .brand-mark{transform:scale(.75);transform-origin:left center;width:18px}.footer>a:nth-of-type(2){color:#a6b1a9;text-decoration:none}.footer-copy{margin-left:auto;font:8px var(--mono)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes pulse{0%,100%{opacity:1;box-shadow:0 0 0 3px #c8f07715}50%{opacity:.55;box-shadow:0 0 0 7px #c8f07700}}@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes flow{0%{transform:translateY(0);opacity:0}25%{opacity:1}100%{transform:translateY(18px);opacity:0}}@keyframes grow{from{width:0}to{width:var(--w)}}@keyframes travel{0%{width:0;left:4%}50%{width:46%;left:4%}100%{width:0;left:96%}}@media(max-width:960px){.nav-links{margin-left:0;gap:19px}.hero{grid-template-columns:.9fr 1.1fr;gap:23px;padding-top:95px}.hero h1{font-size:57px}.hero-meta{gap:10px;font-size:8px}.trust-items{gap:18px}.team-layout{gap:40px}.quickstart-section{gap:42px}}@media(max-width:720px){.wrap{width:min(100% - 36px,530px)}.topbar{height:68px}.nav-links{display:none}.nav-actions{gap:10px}.nav-cta{padding:8px 10px}.hero{padding:77px 0 85px;grid-template-columns:1fr;gap:47px}.hero h1{font-size:58px;letter-spacing:-3.4px}.hero-sub{font-size:14px;max-width:500px}.hero-visual{margin-inline:9px;transform:none}.float-chip{font-size:7px}.chip-one{right:-12px}.chip-two{left:-13px}.hero-scroll{bottom:25px}.trust-inner{padding:20px 0;align-items:flex-start;flex-direction:column;gap:17px}.trust-items{display:grid;grid-template-columns:1fr 1fr;gap:12px 18px}.section{padding:82px 0}.section-heading{grid-template-columns:1fr;gap:17px;margin-bottom:32px}.section h2,.team-copy h2,.quickstart-copy h2{font-size:39px;letter-spacing:-2px}.section-heading>p{font-size:12px}.steps-grid{grid-template-columns:1fr;gap:11px}.step-card{padding:16px}.card-art{height:150px}.flow-caption{font-size:7px;gap:8px}.flow-rule{width:21px}.team-section{padding:76px 0}.team-layout{grid-template-columns:1fr;gap:34px}.team-copy>p{font-size:12px}.team-board{padding-inline:14px}.board-footer{margin-inline:-14px;padding-inline:14px}.path-chips{gap:4px}.path-chips span{font-size:7px;padding:5px 4px}.quickstart-section{padding-top:78px;padding-bottom:75px;grid-template-columns:1fr;gap:29px}.quickstart-copy h2{font-size:40px}.code-window pre{padding:16px 12px;font-size:7.1px}.footer{flex-wrap:wrap;gap:13px;padding:17px 0}.footer-copy{width:100%;margin:0}.closing p{font-size:13px}}@media(max-width:390px){.hero h1{font-size:50px}.hero-actions{gap:14px}.button{font-size:10px}.hero-meta{flex-wrap:wrap}.visual-body{padding:14px 12px 11px}.pipe-step{padding-inline:8px;gap:7px}.pipe-step strong{font-size:9px}.pipe-step small{font-size:7px}.risk-pill,.step-state,.running{font-size:7px}.review-copy strong{font-size:8px}.review-copy small{font-size:7px}.board-change strong{font-size:10px}.path-chips{gap:3px}.path-chips span{font-size:6px}.path-chips b{font-size:7px}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}} + +/* Hero film: the artwork is a real, locally bundled MP4 with native playback controls. */ +.hero-visual{aspect-ratio:16/9;min-height:0;overflow:visible;background:#111916;transform:none;isolation:isolate} +.hero-video{position:absolute;inset:0;width:100%;height:100%;border:1px solid #35443a;border-radius:9px;object-fit:cover;background:#101716;box-shadow:0 30px 90px #0007,0 0 70px #b5ee6810} +.video-top{position:absolute;z-index:2;top:1px;left:1px;right:1px;height:44px;padding:0 15px;display:flex;align-items:center;justify-content:space-between;border-radius:8px 8px 0 0;background:linear-gradient(#111916e8,#11191600);pointer-events:none} +.video-caption{position:absolute;z-index:2;bottom:1px;left:1px;right:1px;padding:27px 16px 35px;display:flex;align-items:center;gap:8px;border-radius:0 0 8px 8px;background:linear-gradient(#11191600,#111916ed);color:#c3cec5;font-size:9px;pointer-events:none} +.hero-visual .chip-one{top:18%;right:-23px}.hero-visual .chip-two{bottom:19%;left:-23px} +@media(max-width:720px){.hero-visual{margin-inline:10px}.hero-visual .chip-one{right:-15px}.hero-visual .chip-two{left:-15px}.video-caption{padding:20px 10px 27px;font-size:8px}} diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..4ec1977 --- /dev/null +++ b/site/index.html @@ -0,0 +1,82 @@ + + + + + + + + Risk Gate — ship with impact in view + + + + + + + + +
+ riskgate + + +
+ +
+
+
+
OPEN SOURCE · GITHUB ACTION
+

Ship with
impact in view.

+

Risk Gate maps what changed to what matters. Then it runs the checks that change deserves, before it reaches production.

+ +
Built in RustOpen sourceRuns in your GitHub Actions
+
+
+ +
PULL REQUEST · #284LIVE FLOW
+ ✳ Full-project AST⌁ Auditable evidence +
✓Checks scale with impact. Every decision has a reason.
+
+
SCROLL TO EXPLORE
+
+ +
BUILT FOR THE WAY TEAMS SHIP
01 PR-aware02 Risk-proportional03 Explainable by design04 Runs where you work
+ +
+
01FROM DIFF TO DECISION

Every change has
a different blast radius.

A typo and a payment-flow rewrite should not face the same gate. Risk Gate traces impact through your project, then makes the next step clear.

+
+
01 — UNDERSTAND
PR
API
PAY
DB

Trace the change

Connect changed files to modules and dependencies across the full supported project AST.

+
02 — ASSESS
ui/LOW
api/NORMAL
pay/HIGH
db/DANGER
PATH → IMPACTMAX

Make risk legible

See the affected paths, risk level, and dependency chain behind every recommendation.

+
03 — RESPOND
CHECKS
REVIEW
✓
POLICY MATCHED

Gate what matters

Run configured validations and require approvals in proportion to the risk.

+
+
ANALYZE → EXPLAIN → VALIDATE → REPORT
+
+ +
02ONE DECISION, SHARED CONTEXT

Engineering sees
the graph.
Teams see the why.

A pull request report gives Engineering evidence to act on, Product a clear view of customer-facing impact, and Support the context to prepare. No one has to decode a green checkmark.

Explore the analysis↗
SHARED RELEASE CONTEXTRG / 284
⌘
CHANGECheckout retry logicsrc/checkout/retry.rs
HIGH
IMPACT PATH
checkout→payment API→customer billing
E
EngineeringE2E + mutation checks required
Validating
P
ProductCustomer impact is visible
✓ Informed
S
SupportRelease context is ready
✓ Informed
+ +
03A SMALL STEP IN YOUR WORKFLOW

Bring risk into
the pull request.

Add a workflow, define your repository's risk map, and let your team tune the gates to fit how you ship.

Get started on GitHub↗
⌁Open source · Runs in your workflow · Your rules, your repository
risk-gate.ymlCOPY
# .github/workflows/risk-gate.yml
+name: Risk Gate
+on:
+  pull_request:
+    types: [opened, synchronize, reopened]
+permissions:
+  contents: read
+  pull-requests: read
+  issues: write
+jobs:
+  risk-gate:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - uses: CodeArq-tech/software-risk-gate@v0.1.9
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
Ready for your next pull requestYAML
Copied
+ +

Make the risk visible.
Make the next step clear.

↗
+
+ + +