'use client' import { useState, useEffect, useRef } from 'react' import Image from 'next/image' import { Eye } from 'lucide-react' const slides = [ { label: 'Dashboard', src: '/dashboard.png', alt: 'GreyProxy dashboard showing total requests, allowed, blocked, and allow rate stats', }, { label: 'Pending', src: '/pending_requests.png', alt: 'GreyProxy pending network requests with Allow and Deny controls for each domain', }, { label: 'Rules', src: '/rules.png', alt: 'GreyProxy domain rules configuration showing allow and deny policies per source', }, { label: 'Activity', src: '/activity.png', alt: 'GreyProxy activity log showing real-time TCP connections with status, source, destination, and duration', }, { label: 'Conversations', src: '/conversations.png', alt: 'GreyProxy conversations view showing agent interactions with tool calls and results', }, ] const INTERVAL = 4000 export function Observability() { const [active, setActive] = useState(0) const [paused, setPaused] = useState(false) const timerRef = useRef | null>(null) // Key to force re-mount of the progress bar so animation restarts const [tick, setTick] = useState(0) function goTo(i: number) { setActive(i) setTick((t) => t + 1) resetTimer() } function advance() { setActive((i) => (i + 1) % slides.length) setTick((t) => t + 1) } function resetTimer() { if (timerRef.current) clearInterval(timerRef.current) if (!paused) { timerRef.current = setInterval(advance, INTERVAL) } } useEffect(() => { if (paused) { if (timerRef.current) clearInterval(timerRef.current) return } timerRef.current = setInterval(advance, INTERVAL) return () => { if (timerRef.current) clearInterval(timerRef.current) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [paused]) return (
Clarity

See every network connection.

You can't predict which domains your agent will reach for. GreyProxy captures every outbound connection and lets you allow or deny them in real time, without restarting the session.

setPaused(true)} onMouseLeave={() => setPaused(false)} > {/* Screenshot with crossfade */}
{/* Hidden reference image to lock container height */} {slides.map((slide, i) => ( {slide.alt} ))}
{/* Progress indicators + labels */}
{slides.map((slide, i) => ( ))}

Every outbound request is visible. Allow trusted domains, block unknown ones, and adjust policies live as your agent works.

) }