foxguard 0.3.2

Security scanner as fast as a linter. 118 built-in rules, 10 languages, sub-second scans.
Documentation
---
import TerminalDemo from '../ui/TerminalDemo.astro';
import { totalRules, ruleGroups } from '../../data/rules';

// JS+TS share rules, C# and Swift are new
const langCount = 10;


---

<section class="relative pt-10 pb-16 sm:pt-14 sm:pb-24">
  <div class="max-w-6xl mx-auto px-6">

    <!-- Top bar -->
    <div class="fade-up flex items-center justify-between pb-10">
      <div class="editorial-kicker">linter speed, scanner depth</div>
      <nav class="hidden md:flex items-center gap-6 font-mono text-[10px] uppercase tracking-[0.12em] text-noir-600">
        <a href="#speed" class="hover:text-noir-100 transition-colors no-underline">speed</a>
        <a href="#coverage" class="hover:text-noir-100 transition-colors no-underline">coverage</a>
        <a href="#rules" class="hover:text-noir-100 transition-colors no-underline">rules</a>
        <a href="#install" class="hover:text-noir-100 transition-colors no-underline">install</a>
      </nav>
    </div>

    <!-- Main hero grid -->
    <div class="grid gap-10 lg:grid-cols-[1fr_1fr] lg:items-start">

      <!-- Left -->
      <div class="fade-up fade-up-delay-1">
        <div class="flex items-center gap-4 mb-6">
          <svg class="w-12 h-12 sm:w-14 sm:h-14 shrink-0" viewBox="0 0 64 64" fill="none">
            <path d="M8 8L20 28L32 20L44 28L56 8L52 32L44 44L36 52H28L20 44L12 32L8 8Z" fill="#F59E0B" fill-opacity="0.15" stroke="#F59E0B" stroke-width="2" stroke-linejoin="round"/>
            <circle cx="24" cy="32" r="2.5" fill="#F59E0B"/>
            <circle cx="40" cy="32" r="2.5" fill="#F59E0B"/>
          </svg>
          <h1 class="font-heading text-noir-50 leading-[0.92] tracking-[-0.03em]" style="font-size: clamp(3.2rem, 7.5vw, 5.5rem);">
            fox<span class="text-fox-light">guard</span>
          </h1>
        </div>

        <p class="max-w-md text-lg text-noir-300 mb-2">
          A security scanner as fast as a linter.
        </p>
        <p class="max-w-md text-sm text-noir-500 leading-relaxed mb-8">
          {totalRules} built-in rules across {langCount} languages. Fast enough to run on every save. Single Rust binary, no network calls.
        </p>

        <!-- CTA -->
        <div class="flex flex-col sm:flex-row items-start sm:items-center gap-3 mb-8">
          <button
            id="npx-btn"
            class="group flex items-center gap-3 rounded-md border border-noir-800 bg-noir-950 px-5 py-3 font-mono text-sm text-fox-light transition-all duration-200 hover:border-noir-700 cursor-pointer"
          >
            <span class="text-noir-600">$</span>
            <span>npx foxguard .</span>
            <svg class="w-3.5 h-3.5 text-noir-600 group-hover:text-fox-light transition-colors" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
          </button>

          <a
            href="https://github.com/peaktwilight/foxguard"
            target="_blank"
            rel="noopener"
            class="btn-ghost no-underline hover:no-underline"
          >
            <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
            GitHub
          </a>
        </div>

        <!-- Stats -->
        <div class="flex flex-wrap items-center gap-6 font-mono text-xs mb-8">
          <div>
            <span class="text-noir-100 text-lg font-heading">{totalRules}</span>
            <span class="text-noir-600 ml-1.5">rules</span>
          </div>
          <div class="w-px h-4 bg-noir-800"></div>
          <div>
            <span class="text-noir-100 text-lg font-heading">{langCount}</span>
            <span class="text-noir-600 ml-1.5">languages</span>
          </div>
          <div class="w-px h-4 bg-noir-800"></div>
          <div>
            <span class="text-noir-100 text-lg font-heading">&lt;1s</span>
            <span class="text-noir-600 ml-1.5">typical scan</span>
          </div>
        </div>

        <!-- Language logos (Simple Icons, 24x24 viewBox) -->
        <div class="flex flex-wrap items-center gap-2.5 opacity-50 hover:opacity-80 transition-opacity">
          <!-- JavaScript -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#F7DF1E"><path d="M0 0h24v24H0V0zm22.034 18.276c-.175-1.095-.888-2.015-3.003-2.873-.736-.345-1.554-.585-1.797-1.14-.091-.33-.105-.51-.046-.705.15-.646.915-.84 1.515-.66.39.12.75.42.976.9 1.034-.676 1.034-.676 1.755-1.125-.27-.42-.404-.601-.586-.78-.63-.705-1.469-1.065-2.834-1.034l-.705.089c-.676.165-1.32.525-1.71 1.005-1.14 1.291-.811 3.541.569 4.471 1.365 1.02 3.361 1.244 3.616 2.205.24 1.17-.87 1.545-1.966 1.41-.811-.18-1.26-.586-1.755-1.336l-1.83 1.051c.21.48.45.689.81 1.109 1.74 1.756 6.09 1.666 6.871-1.004.029-.09.24-.705.074-1.65l.046.067zm-8.983-7.245h-2.248c0 1.938-.009 3.864-.009 5.805 0 1.232.063 2.363-.138 2.711-.33.689-1.18.601-1.566.48-.396-.196-.597-.466-.83-.855-.063-.105-.11-.196-.127-.196l-1.825 1.125c.305.63.75 1.172 1.324 1.517.855.51 2.004.675 3.207.405.783-.226 1.458-.691 1.811-1.411.51-.93.402-2.07.397-3.346.012-2.054 0-4.109 0-6.179l.004-.056z"/></svg>
          <!-- TypeScript -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#3178C6"><path d="M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 0 1 1.306.34v2.458a3.95 3.95 0 0 0-.643-.361 5.093 5.093 0 0 0-.717-.26 5.453 5.453 0 0 0-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 0 0-.623.242c-.17.104-.3.229-.393.374a.888.888 0 0 0-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 0 1-1.012 1.085 4.38 4.38 0 0 1-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 0 1-1.84-.164 5.544 5.544 0 0 1-1.512-.493v-2.63a5.033 5.033 0 0 0 3.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 0 0-.074-1.089 2.12 2.12 0 0 0-.537-.5 5.597 5.597 0 0 0-.807-.444 27.72 27.72 0 0 0-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 0 1 1.47-.629 7.536 7.536 0 0 1 1.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z"/></svg>
          <!-- Python -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#3776AB"><path d="M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z"/></svg>
          <!-- Go -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#00ADD8"><path d="M1.811 10.231c-.047 0-.058-.023-.035-.059l.246-.315c.023-.035.081-.058.128-.058h4.172c.046 0 .058.035.035.07l-.199.303c-.023.036-.082.07-.117.07zM.047 11.306c-.047 0-.059-.023-.035-.058l.245-.316c.023-.035.082-.058.129-.058h5.328c.047 0 .07.035.058.07l-.093.28c-.012.047-.058.07-.105.07zm2.828 1.075c-.047 0-.059-.035-.035-.07l.163-.292c.023-.035.07-.07.117-.07h2.337c.047 0 .07.035.07.082l-.023.28c0 .047-.047.082-.082.082zm12.129-2.36c-.736.187-1.239.327-1.963.514-.176.046-.187.058-.34-.117-.174-.199-.303-.327-.548-.444-.737-.362-1.45-.257-2.115.175-.795.514-1.204 1.274-1.192 2.22.011.935.654 1.706 1.577 1.835.795.105 1.46-.175 1.987-.77.105-.13.198-.27.315-.434H10.47c-.245 0-.304-.152-.222-.35.152-.362.432-.97.596-1.274a.315.315 0 01.292-.187h4.253c-.023.316-.023.631-.07.947a4.983 4.983 0 01-.958 2.29c-.841 1.11-1.94 1.8-3.33 1.986-1.145.152-2.209-.07-3.143-.77-.865-.655-1.356-1.52-1.484-2.595-.152-1.274.222-2.419.993-3.424.83-1.086 1.928-1.776 3.272-2.02 1.098-.2 2.15-.07 3.096.571.62.41 1.063.97 1.356 1.648.07.105.023.164-.117.2"/></svg>
          <!-- Ruby -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#CC342D"><path d="M20.156.083c3.033.525 3.893 2.598 3.829 4.77L24 4.822 22.635 22.71 4.89 23.926h.016C3.433 23.864.15 23.729 0 19.139l1.645-3 2.819 6.586.503 1.172 2.805-9.144-.03.007.016-.03 9.255 2.956-1.396-5.431-.99-3.9 8.82-.569-.615-.51L16.5 2.114 20.159.073l-.003.01zM0 19.089zM5.13 5.073c3.561-3.533 8.157-5.621 9.922-3.84 1.762 1.777-.105 6.105-3.673 9.636-3.563 3.532-8.103 5.734-9.864 3.957-1.766-1.777.045-6.217 3.612-9.75l.003-.003z"/></svg>
          <!-- Java -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#ED8B00"><path d="M8.851 18.56s-.917.534.653.714c1.902.218 2.874.187 4.969-.211 0 0 .552.346 1.321.646-4.699 2.013-10.633-.118-6.943-1.149M8.276 15.933s-1.028.761.542.924c2.032.209 3.636.227 6.413-.308 0 0 .384.389.987.602-5.679 1.661-12.007.13-7.942-1.218M13.116 11.475c1.158 1.333-.304 2.533-.304 2.533s2.939-1.518 1.589-3.418c-1.261-1.772-2.228-2.652 3.007-5.688 0-.001-8.216 2.051-4.292 6.573M19.33 20.504s.679.559-.747.991c-2.712.822-11.288 1.069-13.669.033-.856-.373.75-.89 1.254-.998.527-.114.828-.093.828-.093-.953-.671-6.156 1.317-2.643 1.887 9.58 1.553 17.462-.7 14.977-1.82M9.292 13.21s-4.362 1.036-1.544 1.412c1.189.159 3.561.123 5.77-.062 1.806-.152 3.618-.477 3.618-.477s-.637.272-1.098.587c-4.429 1.165-12.986.623-10.522-.568 2.082-1.006 3.776-.892 3.776-.892M17.116 17.584c4.503-2.34 2.421-4.589.968-4.285-.355.074-.515.138-.515.138s.132-.207.385-.297c2.875-1.011 5.086 2.981-.928 4.562 0 0 .07-.062.09-.118M14.401 0s2.494 2.494-2.365 6.33c-3.896 3.077-.889 4.832 0 6.836-2.274-2.053-3.943-3.858-2.824-5.539 1.644-2.469 6.197-3.665 5.189-7.627M9.734 23.924c4.322.277 10.959-.153 11.116-2.198 0 0-.302.775-3.572 1.391-3.688.694-8.239.613-10.937.168 0 0 .553.457 3.393.639"/></svg>
          <!-- PHP -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#777BB4"><path d="M7.01 10.207h-.944l-.515 2.648h.838c.556 0 .97-.105 1.242-.314.272-.21.455-.559.55-1.049.092-.47.05-.802-.124-.995-.175-.193-.523-.29-1.047-.29zM12 5.688C5.373 5.688 0 8.514 0 12s5.373 6.313 12 6.313S24 15.486 24 12c0-3.486-5.373-6.312-12-6.312zm-3.26 7.451c-.261.25-.575.438-.917.551-.336.108-.765.164-1.285.164H5.357l-.327 1.681H3.652l1.23-6.326h2.65c.797 0 1.378.209 1.744.628.366.418.476 1.002.33 1.752a2.836 2.836 0 0 1-.305.847c-.143.255-.33.49-.561.703zm4.024.715l.543-2.799c.063-.318.039-.536-.068-.651-.107-.116-.336-.174-.687-.174H11.46l-.704 3.625H9.388l1.23-6.327h1.367l-.327 1.682h1.218c.767 0 1.295.134 1.586.401s.378.7.263 1.299l-.572 2.944h-1.389zm7.597-2.265a2.782 2.782 0 0 1-.305.847c-.143.255-.33.49-.561.703a2.44 2.44 0 0 1-.917.551c-.336.108-.765.164-1.286.164h-1.18l-.327 1.682h-1.378l1.23-6.326h2.649c.797 0 1.378.209 1.744.628.366.417.477 1.001.331 1.751zM17.766 10.207h-.943l-.516 2.648h.838c.557 0 .971-.105 1.242-.314.272-.21.455-.559.551-1.049.092-.47.049-.802-.125-.995s-.524-.29-1.047-.29z"/></svg>
          <!-- Rust -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#DEA584"><path d="M23.835 11.703l-1.008-.623a13.7 13.7 0 00-.028-.294l.866-.807a.348.348 0 00-.116-.578l-1.106-.414a8.5 8.5 0 00-.087-.286l.69-.959a.346.346 0 00-.226-.544l-1.166-.19a9.4 9.4 0 00-.14-.262l.49-1.076a.344.344 0 00-.328-.49l-1.184.042a6.7 6.7 0 00-.188-.227l.272-1.153a.347.347 0 00-.417-.417l-1.153.272a14 14 0 00-.228-.187l.042-1.185a.344.344 0 00-.49-.328l-1.076.491c-.087-.048-.174-.095-.262-.14l-.19-1.167a.348.348 0 00-.545-.226l-.96.69a8.5 8.5 0 00-.285-.086l-.414-1.107a.348.348 0 00-.578-.115l-.807.866a9.3 9.3 0 00-.294-.028L12.295.168a.346.346 0 00-.59 0l-.623 1.007a13.7 13.7 0 00-.294.029l-.807-.867a.346.346 0 00-.578.116l-.414 1.106c-.096.028-.19.057-.286.087l-.958-.691a.348.348 0 00-.545.226l-.19 1.167a9.4 9.4 0 00-.262.14l-1.076-.49a.346.346 0 00-.49.327l.042 1.185a8 8 0 00-.228.187l-1.153-.272a.347.347 0 00-.417.417l.272 1.153c-.063.075-.126.15-.187.227l-1.184-.042a.346.346 0 00-.328.49l.49 1.076a9.2 9.2 0 00-.14.262l-1.166.19a.348.348 0 00-.226.544l.69.96a13.3 13.3 0 00-.087.285l-1.106.414a.348.348 0 00-.116.578l.866.807a9.3 9.3 0 00-.028.294l-1.008.623a.344.344 0 000 .59l1.008.623c.008.098.018.196.028.294l-.866.808a.346.346 0 00.116.578l1.106.414c.028.096.057.191.087.286l-.69.958a.345.345 0 00.227.545l1.166.189c.046.088.092.175.14.262l-.49 1.076a.346.346 0 00.327.49l1.184-.041c.062.077.124.152.187.227l-.272 1.154a.346.346 0 00.417.416l1.153-.271c.075.064.15.126.228.186l-.042 1.185a.344.344 0 00.49.327l1.076-.49c.087.049.174.095.262.14l.19 1.167a.348.348 0 00.545.227l.959-.69c.095.03.19.06.285.087l.414 1.106a.345.345 0 00.578.116l.807-.866c.098.01.196.02.294.029l.623 1.007a.347.347 0 00.59 0l.623-1.007c.098-.009.196-.019.294-.029l.807.866a.348.348 0 00.578-.116l.414-1.106c.096-.028.19-.057.285-.087l.959.69a.345.345 0 00.545-.226l.19-1.167c.088-.046.175-.092.262-.141l1.076.49a.347.347 0 00.49-.327l-.042-1.184a6.7 6.7 0 00.227-.187l1.153.272a.347.347 0 00.417-.417l-.272-1.153c.063-.075.126-.15.187-.228l1.184.042a.344.344 0 00.328-.49l-.49-1.076c.048-.087.095-.174.14-.262l1.167-.19a.348.348 0 00.226-.544l-.69-.959.087-.286 1.106-.414a.346.346 0 00.116-.578l-.866-.808c.01-.098.02-.196.028-.294l1.008-.623a.344.344 0 000-.59z"/></svg>
          <!-- C# (.NET) -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#512BD4"><path d="M24 8.77h-2.468v7.565h-1.425V8.77h-2.462V7.53H24zm-6.852 7.565h-4.821V7.53h4.63v1.24h-3.205v2.494h2.953v1.234h-2.953v2.604h3.396zm-6.708 0H8.882L4.78 9.863a2.896 2.896 0 0 1-.258-.51h-.036c.032.189.048.592.048 1.21v5.772H3.157V7.53h1.659l3.965 6.32c.167.261.275.442.323.54h.024c-.04-.233-.06-.629-.06-1.185V7.529h1.372zm-8.703-.693a.868.829 0 0 1-.869.829.868.829 0 0 1-.868-.83.868.829 0 0 1 .868-.828.868.829 0 0 1 .869.829Z"/></svg>
          <!-- Swift -->
          <svg class="w-5 h-5" viewBox="0 0 24 24" fill="#F05138"><path d="M7.508 0c-.287 0-.573 0-.86.002-.241.002-.483.003-.724.01-.132.003-.263.009-.395.015A9.154 9.154 0 0 0 4.348.15 5.492 5.492 0 0 0 2.85.645 5.04 5.04 0 0 0 .645 2.848c-.245.48-.4.972-.495 1.5-.093.52-.122 1.05-.136 1.576a35.2 35.2 0 0 0-.012.724C0 6.935 0 7.221 0 7.508v8.984c0 .287 0 .575.002.862.002.24.005.481.012.722.014.526.043 1.057.136 1.576.095.528.25 1.02.495 1.5a5.03 5.03 0 0 0 2.205 2.203c.48.244.97.4 1.498.495.52.093 1.05.124 1.576.138.241.007.483.009.724.01.287.002.573.002.86.002h8.984c.287 0 .573 0 .86-.002.241-.001.483-.003.724-.01a10.523 10.523 0 0 0 1.578-.138 5.322 5.322 0 0 0 1.498-.495 5.035 5.035 0 0 0 2.203-2.203c.245-.48.4-.972.495-1.5.093-.52.124-1.05.138-1.576.007-.241.009-.481.01-.722.002-.287.002-.575.002-.862V7.508c0-.287 0-.573-.002-.86a33.662 33.662 0 0 0-.01-.724 10.5 10.5 0 0 0-.138-1.576 5.328 5.328 0 0 0-.495-1.5A5.039 5.039 0 0 0 21.152.645 5.32 5.32 0 0 0 19.654.15a10.493 10.493 0 0 0-1.578-.138 34.98 34.98 0 0 0-.722-.01C17.067 0 16.779 0 16.492 0H7.508zm6.035 3.41c4.114 2.47 6.545 7.162 5.549 11.131-.024.093-.05.181-.076.272l.002.001c2.062 2.538 1.5 5.258 1.236 4.745-1.072-2.086-3.066-1.568-4.088-1.043a6.803 6.803 0 0 1-.281.158l-.02.012-.002.002c-2.115 1.123-4.957 1.205-7.812-.022a12.568 12.568 0 0 1-5.64-4.838c.649.48 1.35.902 2.097 1.252 3.019 1.414 6.051 1.311 8.197-.002C9.651 12.73 7.101 9.67 5.146 7.191a10.628 10.628 0 0 1-1.005-1.384c2.34 2.142 6.038 4.83 7.365 5.576C8.69 8.408 6.208 4.743 6.324 4.86c4.436 4.47 8.528 6.996 8.528 6.996.154.085.27.154.36.213.085-.215.16-.437.224-.668.708-2.588-.09-5.548-1.893-7.992z"/></svg>
        </div>
      </div>

      <!-- Right: terminal demo -->
      <div class="fade-up fade-up-delay-2">
        <TerminalDemo />
      </div>
    </div>
  </div>
</section>