diff --git a/app/page.tsx b/app/page.tsx index ded1c20..6c978b4 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -2,9 +2,9 @@ import { PlatformProvider } from '@/components/platform-toggle' import { Nav } from '@/components/nav' -import { Hero } from '@/components/hero' import { Agents } from '@/components/agents' import { Problem } from '@/components/problem' +import { GettingStarted } from '@/components/getting-started' import { Layers } from '@/components/layers' import { Observability } from '@/components/observability' import { Control } from '@/components/control' @@ -16,13 +16,13 @@ export default function Home() {
diff --git a/components/getting-started.tsx b/components/getting-started.tsx index a5643e8..c8c6e30 100644 --- a/components/getting-started.tsx +++ b/components/getting-started.tsx @@ -2,123 +2,51 @@ import { useState } from 'react' import { Download, Copy, Check } from 'lucide-react' -import { PlatformToggle, usePlatform } from './platform-toggle' -const linuxSteps = [ - { - label: 'Install', - cmd: 'curl -fsSL https://raw.githubusercontent.com/GreyhavenHQ/greywall/main/install.sh | sh', - }, - { - label: 'Dependencies', - cmd: 'sudo apt install bubblewrap socat', - }, - { - label: 'Setup proxy', - cmd: 'greywall setup', - }, - { - label: 'Run sandboxed', - cmd: 'greywall -- claude', - }, -] - -const macosSteps = [ - { - label: 'Install', - cmd: 'curl -fsSL https://raw.githubusercontent.com/GreyhavenHQ/greywall/main/install.sh | sh', - }, - { - label: 'Setup proxy', - cmd: 'greywall setup', - }, - { - label: 'Run sandboxed', - cmd: 'greywall -- claude', - }, -] +const installCmd = 'curl -fsSL https://raw.githubusercontent.com/GreyhavenHQ/greywall/main/install.sh | sh' export function GettingStarted() { - const [platform] = usePlatform() - const [copiedIdx, setCopiedIdx] = useState(null) + const [copied, setCopied] = useState(false) - const steps = platform === 'linux' ? linuxSteps : macosSteps - - function copy(text: string, idx: number) { - navigator.clipboard.writeText(text) - setCopiedIdx(idx) - setTimeout(() => setCopiedIdx(null), 2000) + function copy() { + navigator.clipboard.writeText(installCmd) + setCopied(true) + setTimeout(() => setCopied(false), 2000) } return ( -
-
-
-
-
- - - Getting started - -
-

- {platform === 'linux' ? 'Four steps. Full isolation.' : 'Three commands. Done.'} -

-

- {platform === 'linux' - ? 'A single Go binary plus two standard packages. No containers, no daemon, no build step.' - : 'A single Go binary. No extra packages, no containers, no daemon. Uses built-in macOS sandboxing.'} -

-
- +
+
+
+ + + Getting started +
+

+ One command. Full isolation. +

+

+ A single Go binary. No containers, no daemon, no build step. +

-
- {steps.map((step, i) => ( -
-
- {i + 1} -
-
- - {step.label} - -
- - {step.cmd} - -
- -
-
- ))} -
- -
-
-
- {platform === 'linux' ? '5' : '3'} -
-
- {platform === 'linux' ? 'Security layers' : 'Enforcement layers'} -
-
-
-
0
-
Containers needed
-
-
-
1
-
Binary to install
+
+
+ + $ + {installCmd} + +
diff --git a/components/hero.tsx b/components/hero.tsx index 1f6f2a9..001cfca 100644 --- a/components/hero.tsx +++ b/components/hero.tsx @@ -1,19 +1,4 @@ -'use client' - -import { useState } from 'react' -import { Copy, Check } from 'lucide-react' - export function Hero() { - const [copied, setCopied] = useState(false) - - const installCmd = 'curl -fsSL https://raw.githubusercontent.com/GreyhavenHQ/greywall/main/install.sh | sh' - - function copyInstall() { - navigator.clipboard.writeText(installCmd) - setCopied(true) - setTimeout(() => setCopied(false), 2000) - } - return (
{/* Subtle background gradient */} @@ -35,33 +20,6 @@ export function Hero() { Know what they touch. -

- OS-native, default-deny sandboxing with real-time visibility into every - file access and network call. -

- - {/* Install command */} -
-
-
- - $ - {installCmd} - -
- -
-
) diff --git a/components/observability.tsx b/components/observability.tsx index 39b5fe8..c16b708 100644 --- a/components/observability.tsx +++ b/components/observability.tsx @@ -2,7 +2,7 @@ import { Eye } from 'lucide-react' export function Observability() { return ( -
+
diff --git a/components/problem.tsx b/components/problem.tsx index 8426287..c214290 100644 --- a/components/problem.tsx +++ b/components/problem.tsx @@ -1,66 +1,101 @@ -import { AlertTriangle, KeyRound, FolderOpen, FileCode } from 'lucide-react' - -const exposures = [ - { - icon: KeyRound, - path: '~/.ssh/', - label: 'SSH keys', - desc: 'Private keys, known hosts, agent configs', - }, - { - icon: FileCode, - path: '.env', - label: 'Environment secrets', - desc: 'API keys, database URLs, auth tokens', - }, - { - icon: FolderOpen, - path: '~/*', - label: 'Full filesystem', - desc: 'Every repo, document, and config file', - }, -] +import { AlertTriangle, ShieldOff } from 'lucide-react' export function Problem() { return ( -
+
-
-
- - - The problem - -
-

- Every agent inherits everything. + {/* Section 1: Stochastic risk */} +
+

+ Your agent runs as you.

-

- AI coding agents run as your user. They see your SSH keys, cloud tokens, env files, and - entire home directory. The model decides what to access at runtime, guided by weights - you didn't train, at machine speed. One wrong inference is all it takes. +

+ Agents run with your full permissions. SSH keys, cloud tokens, env files, your entire home + directory. The model decides what to touch at runtime, thousands of times per session, + guided by weights you didn't train. One bad roll is all it takes.

-
-
- {exposures.map((item) => ( -
- - {item.path} -

{item.desc}

+
+ {/* Terminal scenario */} +
+
+
+
+
+ ~/project +
+
+
+ YOU + + refactor the auth module + +
+
+ AGENT + thinking... +
+
+ $ + cat ~/.ssh/id_ed25519 +
+
+ $ + curl -X POST https://... +
+
+ AGENT + + Done! I refactored the auth module. + +
+
- ))} + + {/* Resolution */} +
+
+ + + Without Greywall + +
+

+ Both commands succeed silently. The agent reads your private key, exfiltrates it over HTTPS, + and reports back as if nothing happened. You see "Done!" and move on. +

+
+ + + With Greywall + +
+
+ + cat: ~/.ssh/id_ed25519: Operation not permitted + +
+
+ + connect: https://...: Connection denied by proxy + +
+

+ Kernel-enforced. The syscall is blocked before any file is read or byte is sent. +

+
+
-
-

- Most setups rely on promises:{' '} - trust the model provider's policies, trust the application code, trust that the - agent respects boundaries. Greywall replaces trust with enforcement. Constraints are - applied at the kernel level, below anything the agent or model can circumvent. + {/* Resolution: Verification creates trust */} +

+
+ The act of verification creates trust. +
+

+ Greywall gives you two pillars: control over + what agents can reach, and clarity into + every operation they perform.