diff --git a/components/ContactBookingSection.js b/components/ContactBookingSection.js index cfdccec..2d9af39 100644 --- a/components/ContactBookingSection.js +++ b/components/ContactBookingSection.js @@ -199,6 +199,10 @@ export default function ContactBookingSection({

)} +

+ You'll hear back from a founder within one + business day. +

); diff --git a/components/MastHead.js b/components/MastHead.js index 03227de..b1b8a91 100644 --- a/components/MastHead.js +++ b/components/MastHead.js @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import { useEffect, useState } from 'react' import dynamic from 'next/dynamic' import React from 'react' import Link from 'next/link' @@ -15,6 +15,7 @@ import Image from 'next/image' import AnimatedBackground from '@components/AnimatedBackground' import AnimatedLogo from '@components/AnimatedLogo' +import ReplayHero from '@components/ReplayHero' import EmailForm from '@components/EmailForm' import ParticleField from '@components/ParticleField' @@ -28,9 +29,10 @@ const SketchNoSSR = dynamic(() => import('./Sketch'), { const CarouselSection = () => { const [currentIndex, setCurrentIndex] = useState(0); const carouselItems = [ - "Show it once. Let it handle the rest.", - "Perform, don't prompt.", - "Works with Claude, GPT-4V, Gemini, and more.", + "Show it once. It runs forever. On your premises.", + "Deterministic replay. Zero per-run model cost.", + "Self-healing: UI drift becomes a reviewable diff.", + "Your data never leaves the building.", ]; useEffect(() => { @@ -69,36 +71,6 @@ const CarouselSection = () => { }; export default function Home() { - const videoRef = useRef(null) - const [poster, setPoster] = useState('') - - useEffect(() => { - const videoElement = videoRef.current - - if (videoElement) { - // Create a separate video element just for poster generation - const posterVideo = document.createElement('video') - posterVideo.src = './demo.mp4' - - // When poster video loads, seek to desired timestamp and capture frame - posterVideo.addEventListener('loadeddata', () => { - posterVideo.currentTime = 80 // Keep poster timestamp at 80 seconds - posterVideo.addEventListener('seeked', () => { - const canvas = document.createElement('canvas') - canvas.width = posterVideo.videoWidth - canvas.height = posterVideo.videoHeight - const ctx = canvas.getContext('2d') - ctx.drawImage(posterVideo, 0, 0, canvas.width, canvas.height) - const dataURI = canvas.toDataURL('image/jpeg') - setPoster(dataURI) - - // Clean up the poster video element - posterVideo.remove() - }) - }) - } - }, []) - return (
@@ -110,53 +82,34 @@ export default function Home() { OpenAdapt .AI -

- Teach AI to use any software. +

+ Show it once. It runs forever. On your premises.

-
-
- {/* */} - {/* Set poster image dynamically */} - -
+

+ OpenAdapt compiles a recorded demonstration into + a deterministic, self-healing automation — open + source, auditable, and running entirely on your + own machines. +

+
+
-

- - Record demonstrations. Train models. Deploy agents. - -
+
- - Open source. Model agnostic. Run anywhere. - -

+
- - Learn How - - Book a Call + Book a demo - Contact + See how it works
@@ -195,7 +148,7 @@ export default function Home() {
{/* Discord Icon */}
- + { + if ( + typeof window !== 'undefined' && + window.matchMedia('(prefers-reduced-motion: reduce)').matches + ) { + return undefined + } + const timer = setInterval(() => setCycle((c) => c + 1), LOOP_MS) + return () => clearInterval(timer) + }, []) + + return ( +
+
+ + + + referral-intake · compiled replay + local +
+
+ {ROWS.map((row, i) => ( +
+ {row.status === 'heal' ? ( + + {'└'} {row.target} + + ) : row.status === 'done' ? ( + {row.target} + ) : ( + <> + {row.n} + {row.action} + {row.target} + + {row.status === 'drift' + ? '⚠ UI drift detected' + : row.rung} + + {row.ms} + + {row.status === 'drift' ? '' : '✓'} + + + )} +
+ ))} +
+ total 2.4s  ·  model calls: 0  ·  cost + per run: $0.00 +
+
+
+ ) +} diff --git a/components/ReplayHero.module.css b/components/ReplayHero.module.css new file mode 100644 index 0000000..647d10e --- /dev/null +++ b/components/ReplayHero.module.css @@ -0,0 +1,168 @@ +.frame { + width: 100%; + max-width: 640px; + min-width: 0; + margin: 0 auto; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 12px; + background: rgba(8, 6, 24, 0.85); + box-shadow: 0 8px 40px rgba(86, 13, 248, 0.15); + overflow: hidden; + text-align: left; +} + +.titlebar { + display: flex; + align-items: center; + gap: 6px; + padding: 10px 14px; + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(255, 255, 255, 0.04); +} + +.dot { + width: 10px; + height: 10px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.18); +} + +.title { + margin-left: 10px; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.78rem; + color: rgba(255, 255, 255, 0.65); +} + +.badge { + margin-left: auto; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.68rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #6ee7b7; + border: 1px solid rgba(110, 231, 183, 0.35); + border-radius: 999px; + padding: 2px 8px; +} + +.body { + padding: 14px 16px 16px; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.8rem; + line-height: 1.9; +} + +.row { + display: flex; + gap: 0.9em; + align-items: baseline; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + /* contain:inline-size keeps these nowrap rows from propagating their + min-content width up the grid and pushing the page past the viewport + on mobile. */ + contain: inline-size; + opacity: 0; + animation: rowIn 0.35s ease forwards; + color: rgba(255, 255, 255, 0.85); +} + +.num { + color: rgba(255, 255, 255, 0.4); + min-width: 2.2em; +} + +.action { + color: #a78bfa; + min-width: 3.2em; +} + +.target { + color: rgba(255, 255, 255, 0.9); + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; +} + +.rung { + color: rgba(255, 255, 255, 0.45); +} + +.ms { + color: rgba(255, 255, 255, 0.45); + min-width: 3em; + text-align: right; +} + +.check { + color: #6ee7b7; + min-width: 1em; +} + +.drift .rung { + color: #fbbf24; +} + +.healText { + color: #6ee7b7; + padding-left: 2.2em; +} + +.doneText { + color: rgba(255, 255, 255, 0.6); + padding-left: 2.2em; +} + +.summary { + margin-top: 6px; + padding-top: 8px; + border-top: 1px dashed rgba(255, 255, 255, 0.12); + color: rgba(255, 255, 255, 0.55); +} + +@keyframes rowIn { + from { + opacity: 0; + transform: translateY(4px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@media (max-width: 640px) { + .body { + font-size: 0.68rem; + padding: 10px 10px 12px; + } + + .row { + gap: 0.45em; + } + + .rung { + display: none; + } + + .drift .rung { + display: inline; + } + + .healText, + .doneText { + white-space: normal; + padding-left: 1.2em; + } +} + +@media (prefers-reduced-motion: reduce) { + .row { + animation: none; + opacity: 1; + transform: none; + } +} diff --git a/pages/_app.js b/pages/_app.js index 399c622..6a74f22 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -16,10 +16,10 @@ export default function MyApp({ Component, pageProps }) { {/* New pages must add their own with unique title, description, canonical, and og:* tags */} - OpenAdapt.AI — AI-Powered Desktop Automation Platform + OpenAdapt — Record once. Compiled, self-healing desktop automation that runs on your premises. - - + + @@ -61,8 +61,8 @@ export default function MyApp({ Component, pageProps }) { {/* Twitter Card */} - - + + {/* Google tag (gtag.js) */} diff --git a/pages/index.js b/pages/index.js index f8b4d4d..80216ab 100644 --- a/pages/index.js +++ b/pages/index.js @@ -6,7 +6,9 @@ import ContactBookingSection from '@components/ContactBookingSection' import Developers from '@components/Developers' import DevToolsSection from '@components/DevToolsSection' import EcosystemSection from '@components/EcosystemSection' +import Faq, { faqItems } from '@components/Faq' import Footer from '@components/Footer' +import HowItWorks from '@components/HowItWorks' import IndustriesGrid from '@components/IndustriesGrid' import MastHead from '@components/MastHead' // import SocialSection from '@components/SocialSection' // Temporarily disabled - feeds not working @@ -24,7 +26,7 @@ const organizationSchema = { height: 512, }, description: - 'Open-source platform for GUI automation with AI. Record human demonstrations, train models, and deploy agents that can operate any software.', + 'Open-source demonstration compiler for desktop automation. Record a workflow once and OpenAdapt compiles it into a deterministic, self-healing automation that runs entirely on your own machines.', foundingDate: '2023', sameAs: [ 'https://github.com/OpenAdaptAI/OpenAdapt', @@ -41,7 +43,7 @@ const organizationSchema = { 'Machine Learning', 'Large Language Models', ], - slogan: 'Teach AI to use any software', + slogan: 'Show it once. It runs forever.', } const softwareSchema = { @@ -52,7 +54,7 @@ const softwareSchema = { applicationCategory: 'DeveloperApplication', operatingSystem: 'Windows, macOS, Linux', description: - 'Open-source AI-powered desktop automation platform. Record human demonstrations of GUI workflows, train models, and deploy AI agents that replicate those workflows autonomously. Compatible with Claude, GPT-4V, and Gemini.', + 'Open-source demonstration compiler for desktop automation. Record a workflow once and OpenAdapt compiles it into a deterministic, self-healing script that replays locally with no per-run model calls. A model is only used to heal the script when the UI drifts, and the fix is proposed as a reviewable diff.', url: 'https://openadapt.ai', downloadUrl: 'https://pypi.org/project/openadapt/', author: { @@ -69,12 +71,13 @@ const softwareSchema = { priceCurrency: 'USD', }, featureList: [ - 'Record human demonstrations of desktop workflows', - 'Train AI models on recorded task data', - 'Deploy autonomous AI agents for GUI automation', - 'PII/PHI data scrubbing for privacy compliance', - 'Model agnostic — works with Claude, GPT-4V, Gemini', - 'Benchmark evaluation with Windows Agent Arena', + 'Record a desktop workflow once as a demonstration', + 'Compile demonstrations into deterministic, editable automation scripts', + 'Deterministic local replay with zero per-run model cost', + 'Self-healing: UI drift is repaired via a fallback ladder and proposed as a reviewable diff', + 'Local-first: recordings, scripts, and replays stay on your infrastructure', + 'PII/PHI data scrubbing for sensitive workflows', + 'Illustrated audit report for every run', ], isAccessibleForFree: true, } @@ -86,7 +89,7 @@ const websiteSchema = { alternateName: 'OpenAdapt', url: 'https://openadapt.ai', description: - 'Open-source AI-powered GUI automation platform. Teach AI to use any software.', + 'Open-source demonstration compiler: record a desktop workflow once and it compiles into a deterministic, self-healing automation that runs on your premises.', publisher: { '@type': 'Organization', name: 'OpenAdapt.AI', @@ -95,6 +98,19 @@ const websiteSchema = { inLanguage: 'en', } +const faqSchema = { + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: faqItems.map((item) => ({ + '@type': 'Question', + name: item.question, + acceptedAnswer: { + '@type': 'Answer', + text: item.answer, + }, + })), +} + export default function Home() { const [feedbackData, setFeedbackData] = useState({ email: '', @@ -125,8 +141,15 @@ export default function Home() { __html: JSON.stringify(websiteSchema), }} /> +