From 6c08c55d2910bdb243cd21513621698a26f0bef4 Mon Sep 17 00:00:00 2001 From: Nicholas Kissel Date: Wed, 11 Feb 2026 11:29:29 -0800 Subject: [PATCH] feat(website): add site styling updates and SEO improvements - Update component styling to match Rivet design (FAQ, FeatureGrid, etc.) - Add SEO improvements (sitemap, robots.txt, meta tags, Open Graph) - Remove CTASection component - Update footer tagline - Add Pi logo --- frontend/packages/website/astro.config.mjs | 5 +- frontend/packages/website/package.json | 1 + .../website/src/components/CTASection.tsx | 112 ---------- .../packages/website/src/components/FAQ.tsx | 44 ++-- .../website/src/components/FeatureGrid.tsx | 203 +++++++----------- .../website/src/components/Footer.tsx | 71 ++++-- .../website/src/components/GetStarted.tsx | 110 +++++----- .../website/src/components/Inspector.tsx | 42 +++- .../website/src/components/Navigation.tsx | 43 ++-- .../website/src/components/PainPoints.tsx | 148 +++++-------- .../packages/website/src/layouts/Layout.astro | 59 ++++- .../packages/website/src/pages/index.astro | 6 +- .../packages/website/src/styles/global.css | 170 ++++++++++++++- frontend/packages/website/tailwind.config.mjs | 46 +++- 14 files changed, 596 insertions(+), 464 deletions(-) delete mode 100644 frontend/packages/website/src/components/CTASection.tsx diff --git a/frontend/packages/website/astro.config.mjs b/frontend/packages/website/astro.config.mjs index 41e24e0..f11c53c 100644 --- a/frontend/packages/website/astro.config.mjs +++ b/frontend/packages/website/astro.config.mjs @@ -1,11 +1,14 @@ import { defineConfig } from 'astro/config'; import react from '@astrojs/react'; import tailwind from '@astrojs/tailwind'; +import sitemap from '@astrojs/sitemap'; export default defineConfig({ + site: 'https://sandbox-agent.dev', output: 'static', integrations: [ react(), - tailwind() + tailwind(), + sitemap() ] }); diff --git a/frontend/packages/website/package.json b/frontend/packages/website/package.json index aef9c0b..ced76f7 100644 --- a/frontend/packages/website/package.json +++ b/frontend/packages/website/package.json @@ -13,6 +13,7 @@ }, "dependencies": { "@astrojs/react": "^4.2.0", + "@astrojs/sitemap": "^3.2.0", "@astrojs/tailwind": "^6.0.0", "astro": "^5.1.0", "framer-motion": "^12.0.0", diff --git a/frontend/packages/website/src/components/CTASection.tsx b/frontend/packages/website/src/components/CTASection.tsx deleted file mode 100644 index f47f14e..0000000 --- a/frontend/packages/website/src/components/CTASection.tsx +++ /dev/null @@ -1,112 +0,0 @@ -'use client'; - -import { useState, useEffect } from 'react'; -import { motion, AnimatePresence } from 'framer-motion'; -import { ArrowRight, Terminal, Check } from 'lucide-react'; - -const CTA_TITLES = [ - 'Run coding agents in sandboxes. Control them over HTTP.', - 'A server inside your sandbox. An API for your app.', - 'Claude Code, Codex, OpenCode, Amp, Pi — one HTTP API.', - 'Your app connects remotely. The coding agent runs isolated.', - 'Streaming events. Handling permissions. Managing sessions.', - 'Install with curl. Connect over HTTP. Control any coding agent.', - 'The bridge between your app and sandboxed coding agents.', -]; - -function AnimatedCTATitle() { - const [currentIndex, setCurrentIndex] = useState(0); - - useEffect(() => { - const interval = setInterval(() => { - setCurrentIndex(prev => (prev + 1) % CTA_TITLES.length); - }, 3000); - - return () => clearInterval(interval); - }, []); - - return ( -

- - - {CTA_TITLES[currentIndex]} - - -

- ); -} - -const CopyInstallButton = () => { - const [copied, setCopied] = useState(false); - const installCommand = 'curl -sSL https://sandboxagent.dev/install | sh'; - - const handleCopy = async () => { - try { - await navigator.clipboard.writeText(installCommand); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - } catch (err) { - console.error('Failed to copy:', err); - } - }; - - return ( - - ); -}; - -export function CTASection() { - return ( -
- -
-
- -
- - A server that runs inside isolated environments.
- Your app connects remotely to control any coding agent. -
- - - Read the Docs - - - - -
-
- ); -} diff --git a/frontend/packages/website/src/components/FAQ.tsx b/frontend/packages/website/src/components/FAQ.tsx index 4000c22..fc80332 100644 --- a/frontend/packages/website/src/components/FAQ.tsx +++ b/frontend/packages/website/src/components/FAQ.tsx @@ -61,14 +61,14 @@ function FAQItem({ question, answer }: { question: string; answer: string }) { const [isOpen, setIsOpen] = useState(false); return ( -
+