foxguard 0.7.1

A security scanner as fast as a linter, written in Rust. 170+ built-in rules across 10 languages.
Documentation
---
import TerminalDemo from '../ui/TerminalDemo.astro';
import SiteNav from '../ui/SiteNav.astro';
import { totalRules } from '../../data/rules';
---

<section class="pt-0 pb-24">
  <div class="max-w-5xl mx-auto px-6">

    <div class="h-20"></div>

    <!-- Headline -->
    <div class="max-w-3xl mx-auto text-center mb-16">
      <h1 class="font-heading text-noir-50 text-3xl sm:text-5xl lg:text-6xl leading-[1.1] tracking-tight mb-6">
        Security scanner<br/>as fast as a linter
      </h1>
      <p class="text-noir-400 text-sm sm:text-lg leading-relaxed mb-8 max-w-xl mx-auto">
        {totalRules} built-in rules across 10 languages. Cross-file taint tracking for Python, JavaScript, and Go. Single Rust binary, sub-second scans.
      </p>
      <!-- Tabbed install -->
      <div data-install-box class="rounded-xl border border-noir-800 overflow-hidden mb-8 mx-auto transition-all duration-300" style="width: 300px; max-width: 100%;">
        <div class="flex border-b border-noir-800">
          <button data-tab="npx" class="install-tab active flex-1 px-4 py-2 text-sm text-noir-100 border-b-2 border-fox cursor-pointer">npx</button>
          <button data-tab="cargo" class="install-tab flex-1 px-4 py-2 text-sm text-noir-600 border-b-2 border-transparent hover:text-noir-400 transition-colors cursor-pointer">cargo</button>
        </div>
        <button id="install-area" class="w-full px-5 py-3 font-mono text-sm flex items-center justify-center cursor-pointer hover:bg-noir-900/30 active:scale-95 transition-all">
          <code id="install-cmd" class="text-fox-light">npx foxguard .</code>
        </button>
      </div>
    </div>

    <script>
      // Install tabs + copy
      const cmds: Record<string, string> = {
        npx: 'npx foxguard .',
        cargo: 'cargo install foxguard',
      };

      let currentCmd = 'npx foxguard .';

      function showCopied() {
        const cmdEl = document.getElementById('install-cmd')!;
        const box = document.getElementById('install-area')!.parentElement!;
        navigator.clipboard.writeText(currentCmd);

        // Flash the border green + scale bounce
        box.classList.remove('copy-flash');
        void box.offsetWidth; // force reflow
        box.classList.add('copy-flash');

        // Brief green text
        cmdEl.classList.add('text-green-400');
        cmdEl.classList.remove('text-fox-light');
        setTimeout(() => {
          cmdEl.classList.remove('text-green-400');
          cmdEl.classList.add('text-fox-light');
        }, 400);
      }

      // Click command area to copy
      document.getElementById('install-area')?.addEventListener('click', showCopied);

      // Tab switching also copies
      document.querySelectorAll('.install-tab').forEach(tab => {
        tab.addEventListener('click', () => {
          const key = (tab as HTMLElement).dataset.tab!;
          currentCmd = cmds[key];
          document.getElementById('install-cmd')!.textContent = currentCmd;
          document.querySelectorAll('.install-tab').forEach(t => {
            t.classList.remove('active', 'text-noir-100', 'border-fox');
            t.classList.add('text-noir-600', 'border-transparent');
          });
          tab.classList.add('active', 'text-noir-100', 'border-fox');
          tab.classList.remove('text-noir-600', 'border-transparent');
          showCopied();
        });
      });
    </script>

    <!-- Terminal -->
    <TerminalDemo />

  </div>
</section>