Files
greywall-landing-page/components/faq.tsx
2026-04-13 13:09:46 -04:00

115 lines
5.2 KiB
TypeScript

'use client'
import { useState } from 'react'
import { ChevronDown } from 'lucide-react'
const faqs = [
{
question: 'What is Greywall?',
answer:
'Greywall is a command-line tool for running AI agents inside a contained local boundary. Prefix the agent command with <code>greywall --</code> and Greywall applies deny-by-default controls for filesystem access, network access, and blocked commands at the OS layer. It works on Linux and macOS and is open source under Apache 2.0.',
},
{
question: 'How do I sandbox my AI coding agent?',
answer:
'Install Greywall, then prefix the command you already use: <code>greywall -- claude</code>, <code>greywall -- opencode</code>, or another local CLI agent. Greywall operates below the agent, so it does not need plugins or agent-specific configuration. If you want to inspect what the agent attempted, open the GreyProxy dashboard.',
},
{
question: 'How is Greywall different from running agents in Docker?',
answer:
'Containers isolate software well, but they often separate the agent from the local toolchain and working copy you actually need. Greywall keeps the agent in the normal local environment while enforcing boundaries around what it can read, write, execute, or reach on the network. It also records denied operations and live requests, which a basic container setup does not provide by itself.',
},
{
question: 'Does Greywall work on macOS?',
answer:
'Yes. On macOS, Greywall uses Seatbelt, Apple&apos;s built-in sandbox facility. It generates a deny-by-default profile per session for filesystem access, network connections, and IPC. Linux has more available layers, but the macOS path still provides strong local containment using built-in OS capabilities.',
},
{
question: 'Is Greywall open source?',
answer:
'Yes. Greywall is released under Apache 2.0 and the source is available on <a href="https://github.com/GreyhavenHQ/greywall" target="_blank" rel="noopener noreferrer">GitHub</a>. For a control layer, being able to inspect the implementation is a practical requirement. Greywall is built by <a href="https://greyhaven.co" target="_blank" rel="noopener noreferrer">Greyhaven</a> and used in production deployments.',
},
{
question: 'What kernel version does Linux require?',
answer:
'Namespace isolation via Bubblewrap needs Linux 3.8. Landlock filesystem controls need 5.13. Seccomp BPF needs 3.5. eBPF monitoring needs 4.15. The network proxy works on any kernel. Greywall detects the features present on the host and enables the layers it can support. Run <code>greywall --linux-features</code> to inspect the result.',
},
{
question: 'Which AI agents does Greywall support?',
answer:
'Greywall works with local CLI agents that run as normal processes on your machine: Claude Code, Codex, Cursor, Aider, Goose, Amp, Gemini CLI, Cline, OpenCode, Copilot, and similar tools. Because Greywall operates below the agent, support does not depend on vendor-specific integrations.',
},
]
const faqJsonLd = {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: faqs.map((faq) => ({
'@type': 'Question',
name: faq.question,
acceptedAnswer: {
'@type': 'Answer',
text: faq.answer.replace(/<[^>]*>/g, ''),
},
})),
}
function FAQItem({ question, answer }: { question: string; answer: string }) {
const [open, setOpen] = useState(false)
return (
<div className="border-b border-border/30">
<button
onClick={() => setOpen(!open)}
className="w-full flex items-center justify-between gap-4 py-5 text-left cursor-pointer"
>
<h3 className="font-serif text-base sm:text-lg font-semibold text-foreground">
{question}
</h3>
<ChevronDown
className={`h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200 ${
open ? 'rotate-180' : ''
}`}
/>
</button>
<div
className={`grid transition-[grid-template-rows] duration-200 ${
open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'
}`}
>
<div className="overflow-hidden">
<p
className="pb-5 text-muted-foreground font-serif text-base leading-relaxed [&_code]:font-mono [&_code]:text-xs [&_code]:text-foreground [&_code]:bg-card/50 [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_a]:text-primary [&_a]:hover:text-primary/80 [&_a]:transition-colors"
dangerouslySetInnerHTML={{ __html: answer }}
/>
</div>
</div>
</div>
)
}
export function FAQ() {
return (
<section className="py-24 px-4 sm:px-6 border-t border-border/30">
<div className="mx-auto max-w-5xl">
<div className="max-w-2xl mb-12">
<h2 className="title-serif text-[36px] md:text-[48px] leading-none">
Frequently asked.
</h2>
</div>
<div className="max-w-3xl">
{faqs.map((faq) => (
<FAQItem key={faq.question} question={faq.question} answer={faq.answer} />
))}
</div>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqJsonLd) }}
/>
</div>
</section>
)
}