'use client' import { useState, useEffect, useRef } from 'react' import Image from 'next/image' 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.

GreyProxy records each outbound request as it happens. You can allow known domains, deny unknown ones, and keep the session running while you decide.

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) => ( ))}

Each outbound request stays visible. Policy changes apply while the agent keeps running.

) }