From f8036641809a41f13519241c678ff909b213f27a Mon Sep 17 00:00:00 2001 From: Richard Abrich Date: Mon, 6 Jul 2026 16:03:11 -0400 Subject: [PATCH 01/13] feat(hero): reposition around demonstration compiler - New headline: 'Show it once. It runs forever. On your premises.' - Subhead names the mechanism (compiled demonstration) and the deployment promise (runs entirely on your own machines) - Carousel lines updated to deterministic replay / self-healing / local-first messaging - Dual CTA: primary 'Book a demo' (#book), secondary 'See how it works' (#how-it-works) - Hero video now hero.mp4 (8.7MB) with preload=metadata instead of demo.mp4 (85.6MB); removed the poster-capture effect that forced a full second download of the large video - Discord invite unified to discord.gg/yF527cQbDG Co-Authored-By: Claude Fable 5 --- components/MastHead.js | 77 ++++++++++++------------------------------ 1 file changed, 21 insertions(+), 56 deletions(-) diff --git a/components/MastHead.js b/components/MastHead.js index 03227de..9f7efce 100644 --- a/components/MastHead.js +++ b/components/MastHead.js @@ -28,9 +28,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(() => { @@ -70,34 +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 +83,45 @@ export default function Home() { OpenAdapt .AI -

- Teach AI to use any software. +

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

+

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

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

- - 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 +160,7 @@ export default function Home() { {/* Discord Icon */}
- + Date: Mon, 6 Jul 2026 16:03:51 -0400 Subject: [PATCH 02/13] feat(how-it-works): add numbered five-step compiler section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New HowItWorks component (id=how-it-works) placed right after the hero: 1.0 Record, 2.0 Compile, 3.0 Run, 4.0 Self-heal, 5.0 Audit in spec-doc style with mono-accent step numbers. No new dependencies, no canvas animation — plain markup matching the dark visual system. Co-Authored-By: Claude Fable 5 --- components/HowItWorks.js | 61 ++++++++++++++++++++ components/HowItWorks.module.css | 95 ++++++++++++++++++++++++++++++++ pages/index.js | 2 + 3 files changed, 158 insertions(+) create mode 100644 components/HowItWorks.js create mode 100644 components/HowItWorks.module.css diff --git a/components/HowItWorks.js b/components/HowItWorks.js new file mode 100644 index 0000000..f83ad54 --- /dev/null +++ b/components/HowItWorks.js @@ -0,0 +1,61 @@ +import styles from './HowItWorks.module.css' + +const steps = [ + { + number: '1.0', + name: 'Record', + description: + 'Do the task once while OpenAdapt captures screens and inputs.', + }, + { + number: '2.0', + name: 'Compile', + description: + 'The demonstration becomes an editable script: visual anchors, per-step assertions, parameters.', + }, + { + number: '3.0', + name: 'Run', + description: + 'Deterministic replay in milliseconds, locally, no per-run model calls.', + }, + { + number: '4.0', + name: 'Self-heal', + description: + 'When the UI drifts, a fallback ladder finds the target and proposes the fix as a diff.', + }, + { + number: '5.0', + name: 'Audit', + description: + 'Every run produces an illustrated report: what ran, what it saw, what changed.', + }, +] + +export default function HowItWorks() { + return ( +
+
+

How it works

+

+ A demonstration compiler: one recording in, a deterministic + automation out. +

+
    + {steps.map((step) => ( +
  1. + {step.number} +
    +

    {step.name}

    +

    + {step.description} +

    +
    +
  2. + ))} +
+
+
+ ) +} diff --git a/components/HowItWorks.module.css b/components/HowItWorks.module.css new file mode 100644 index 0000000..6990d8e --- /dev/null +++ b/components/HowItWorks.module.css @@ -0,0 +1,95 @@ +.section { + background: rgba(0, 0, 30, 1); + padding: 72px 20px 80px; + scroll-margin-top: 24px; +} + +.inner { + max-width: 760px; + margin: 0 auto; +} + +.heading { + color: rgba(255, 255, 255, 0.95); + font-size: 24px; + font-weight: 500; + letter-spacing: -0.01em; + text-align: center; + margin: 0 0 8px; +} + +.subheading { + color: rgba(255, 255, 255, 0.6); + font-size: 15px; + font-weight: 300; + text-align: center; + margin: 0 0 44px; +} + +.steps { + list-style: none; + margin: 0; + padding: 0; + border-top: 1px solid rgba(86, 13, 248, 0.25); +} + +.step { + display: flex; + align-items: baseline; + gap: 22px; + padding: 22px 8px; + border-bottom: 1px solid rgba(86, 13, 248, 0.25); +} + +.number { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 15px; + color: #60a5fa; + min-width: 42px; + text-align: right; + flex-shrink: 0; +} + +.body { + flex: 1; +} + +.name { + display: inline; + color: rgba(255, 255, 255, 0.95); + font-size: 16px; + font-weight: 600; + letter-spacing: 0.01em; + margin: 0; +} + +.name::after { + content: ' — '; + color: rgba(255, 255, 255, 0.4); + font-weight: 300; +} + +.description { + display: inline; + color: rgba(255, 255, 255, 0.7); + font-size: 15px; + font-weight: 300; + line-height: 1.6; + margin: 0; +} + +@media (max-width: 640px) { + .section { + padding: 52px 16px 60px; + } + + .step { + gap: 14px; + padding: 18px 4px; + } + + .number { + min-width: 34px; + font-size: 14px; + } +} diff --git a/pages/index.js b/pages/index.js index f8b4d4d..068d40d 100644 --- a/pages/index.js +++ b/pages/index.js @@ -7,6 +7,7 @@ import Developers from '@components/Developers' import DevToolsSection from '@components/DevToolsSection' import EcosystemSection from '@components/EcosystemSection' 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 @@ -127,6 +128,7 @@ export default function Home() { /> +
Date: Mon, 6 Jul 2026 16:04:43 -0400 Subject: [PATCH 03/13] feat(industries): focus grid on three regulated verticals Replace the nine-industry card grid with three cards: Healthcare clinics, Mortgage & lending ops, and Other regulated back-offices. Card titles link to the new /solutions/ pages (third card to #book), Get Started prefill messages match the new titles, and the section intro is rewritten to the compiled-automation positioning. Card component, CTA mechanics, and canvas animation untouched. Co-Authored-By: Claude Fable 5 --- components/IndustriesGrid.js | 83 ++++++++++++++---------------------- 1 file changed, 32 insertions(+), 51 deletions(-) diff --git a/components/IndustriesGrid.js b/components/IndustriesGrid.js index 3086316..5365368 100644 --- a/components/IndustriesGrid.js +++ b/components/IndustriesGrid.js @@ -621,68 +621,41 @@ export default function IndustriesGrid({ }) { const gridData = [ { - title: 'HR', + title: 'Healthcare clinics', + href: '/solutions/healthcare', descriptions: - 'Boost team productivity in HR operations. Automate candidate sourcing using LinkedIn Recruiter, LinkedIn Talent Solutions, GetProspect, Reply.io, outreach.io, Gmail/Outlook, and more.', - logo: '/images/noun-human-resources.svg', - }, - { - title: 'Law', - descriptions: - 'Streamline legal procedures and case management. Automate tasks like generating legal documents, managing contracts, tracking cases, and conducting legal research with LexisNexis, Westlaw, Adobe Acrobat, Microsoft Excel, and more.', - logo: '/images/noun-law.svg', - }, - { - title: 'Insurance', - descriptions: - 'Optimize productivity in insurance. Automate policy management, claims processing, data analysis, and document collaboration with PolicyCenter, Xactimate, Excel, SharePoint, PowerBI, and more.', - logo: '/images/noun-insurance.svg', - }, - { - title: 'Healthcare', - descriptions: - 'Advance patient care and streamline operations. Automate revenue cycle management, clinical documentation, and scheduling in Cerner, Epic, and more.', + 'Referral and fax intake, EMR data entry and extraction — desktop and VDI EMRs included. PHI handling stays fully local.', logo: '/images/noun-healthcare.svg', }, { - title: 'Finance', + title: 'Mortgage & lending ops', + href: '/solutions/lending', descriptions: - 'Enhance efficiency and compliance in financial services. Automate tasks like data entry, reporting, and portfolio management using tools like Excel, Bloomberg, QuickBooks, and more.', + 'Loan-file data extraction and entry in desktop LOS software like Encompass. Borrower data stays in your environment.', logo: '/images/noun-finance.svg', }, { - title: 'Logistics', - descriptions: - 'Automate tasks with Transportation Management Systems (TMS), Freight Management Systems (FMS), Load Tracking Systems, and Document Management Systems for efficient tracking, scheduling, and financial record-keeping.', - logo: '/images/noun-freight.svg', - }, - { - title: 'Pharmacy', - descriptions: - 'Enhance accuracy and inventory management. Automate prescription management, inventory control, medication dispensing, and patient records with Krol (Telus), Filware, Healthwatch, and more.', - logo: '/images/noun-pharmacy.svg', - }, - { - title: 'Customer Support', + title: 'Other regulated back-offices', + href: '#book', descriptions: - 'Automate customer inquiries, ticket management, collaboration, data analysis, and communication using OracleHCM, Workday, SAP, Excel, SharePoint, Outlook, LinkedIn, Teams, PowerBI, and more.', - logo: '/images/noun-customer-support.svg', - }, - { - title: 'Sales Development', - descriptions: - 'Automate repetitive tasks in OracleHCM, LinkedIn, SalesForce, and Gmail for lead generation, prospecting, and communication to optimize revenue growth.', - logo: '/images/noun-sales-development.svg', + 'Document-heavy, compliance-bound workflows — tell us yours.', + logo: '/images/noun-law.svg', }, ] + const industryMessages = { + 'Healthcare clinics': + "I'm interested in automating referral intake and EMR data entry at our clinic.", + 'Mortgage & lending ops': + "I'm interested in automating loan-file data entry and extraction in our LOS.", + 'Other regulated back-offices': + "I'm interested in automating a document-heavy workflow in a regulated back-office.", + } + const getDataFromTitle = (title) => { return { email: '', - message: - title === 'Let us build for you' - ? '' - : `I'm interested in how OpenAdapt can help me make ${title} better.`, + message: industryMessages[title] || '', } } @@ -705,11 +678,13 @@ export default function IndustriesGrid({

- Transform Your Industry with OpenAdapt + Built for regulated back-offices

- From demonstration to automation in minutes. Just do the task once and OpenAdapt learns from watching. - No prompt engineering. No scripting. No brittle selectors. + Record the workflow once and OpenAdapt compiles it into an + automation your team can review, run, and audit — entirely + on your own machines. No brittle selectors to hand-author. + No per-run model costs.
Built-in PII/PHI scrubbing @@ -730,7 +705,13 @@ export default function IndustriesGrid({ alt={grid.title} />

-

{grid.title}

+

+ {grid.href ? ( + {grid.title} + ) : ( + grid.title + )} +

    {grid.descriptions .split('\n') From d0dc00c7c6f99f1b2c774d6b7ed473686e1b8541 Mon Sep 17 00:00:00 2001 From: Richard Abrich Date: Mon, 6 Jul 2026 16:05:34 -0400 Subject: [PATCH 04/13] feat(faq): add FAQ section with FAQPage JSON-LD Six self-contained Q&As (what is it, vs RPA, vs computer-use agents, data locality, licensing/pilots, software coverage) rendered before the booking section. The same data drives a FAQPage schema block in pages/index.js. Co-Authored-By: Claude Fable 5 --- components/Faq.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++ pages/index.js | 21 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 components/Faq.js diff --git a/components/Faq.js b/components/Faq.js new file mode 100644 index 0000000..4175f90 --- /dev/null +++ b/components/Faq.js @@ -0,0 +1,51 @@ +export const faqItems = [ + { + question: 'What is OpenAdapt?', + answer: 'OpenAdapt is an open-source demonstration compiler for desktop automation. You record yourself doing a task once, and OpenAdapt compiles that recording into a deterministic, self-healing script that runs on your own machines. Healthy runs make no cloud model calls, so each run costs nothing.', + }, + { + question: 'How is OpenAdapt different from RPA tools like UiPath?', + answer: 'Traditional RPA makes you hand-author brittle selectors and flowcharts, and the bot breaks when the UI changes. OpenAdapt compiles the automation from a demonstration instead — no selector authoring — and when the UI drifts it heals itself, proposing the fix as a reviewable diff. It also runs entirely on your machines.', + }, + { + question: 'How is OpenAdapt different from AI computer-use agents?', + answer: "Computer-use agents re-reason through your task with a large model on every run, so they are slow, non-deterministic, and bill you per run. OpenAdapt compiles the task once and replays it deterministically for free. A model is only invoked to heal the script when the UI drifts.", + }, + { + question: 'Does my data leave my machines?', + answer: 'No. OpenAdapt is local-first by architecture: recordings, compiled scripts, and replays all stay on your own infrastructure. Nothing is uploaded to run an automation. PII/PHI scrubbing tooling is included for teams that need to sanitize captured data before anyone — human or model — sees it.', + }, + { + question: 'Is OpenAdapt free?', + answer: 'Yes — OpenAdapt is MIT-licensed open source, free to use and modify. For regulated deployments in healthcare and lending we run commercial pilots with hands-on support: we help compile your first workflows, set up review, and keep the automations healthy. Book a demo to talk about a pilot.', + }, + { + question: 'What software does OpenAdapt work with?', + answer: "Anything with a screen. Because OpenAdapt watches pixels and inputs rather than APIs or browser internals, it works with desktop applications, web apps, and software delivered over VDI or RDP — including EMRs and loan origination systems that cloud automation tools can't reach.", + }, +] + +export default function Faq() { + return ( +
    +

    + Frequently asked questions +

    +
    + {faqItems.map((item) => ( +
    +
    + {item.question} +
    +
    + {item.answer} +
    +
    + ))} +
    +
    + ) +} diff --git a/pages/index.js b/pages/index.js index 068d40d..96a95d3 100644 --- a/pages/index.js +++ b/pages/index.js @@ -6,6 +6,7 @@ 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' @@ -96,6 +97,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: '', @@ -126,6 +140,12 @@ export default function Home() { __html: JSON.stringify(websiteSchema), }} /> +