From 459fbd1f7b5cb85b442b34a3047bdb7140ec6d2a Mon Sep 17 00:00:00 2001 From: Richard Abrich Date: Mon, 25 May 2026 00:13:55 -0400 Subject: [PATCH 1/2] feat(geo): add structured data, meta tags, and AI crawler infrastructure Addresses critical GEO (Generative Engine Optimization) gaps identified in audit scoring 36/100. Adds robots.txt with AI crawler allowances, sitemap.xml, llms.txt, JSON-LD schema markup (Organization, SoftwareApplication, WebSite), unique per-page titles/descriptions/ canonical URLs, security headers, and fixes heading hierarchy. - Create public/robots.txt with explicit AI bot rules and sitemap ref - Create public/sitemap.xml covering all 5 indexable pages - Create public/llms.txt for LLM content guidance - Create pages/_document.js with lang="en" on html tag - Fix _app.js: single meta description, improved title, complete OG + Twitter Card tags - Add JSON-LD structured data to homepage (Organization + SoftwareApplication + WebSite schemas with sameAs to GitHub/X/LinkedIn/Discord/PyPI) - Add unique Head (title, description, canonical, OG) to all pages - Fix duplicate h1 in IndustriesGrid (h1 -> h2) - Add alt/height to TAAFT badge image (CLS fix) - Add security headers to netlify.toml (X-Frame-Options, Referrer-Policy, Permissions-Policy, HSTS w/ includeSubDomains) Co-Authored-By: Claude Opus 4.6 (1M context) --- components/IndustriesGrid.js | 6 +- netlify.toml | 9 +++ pages/_app.js | 22 +++++--- pages/_document.js | 13 +++++ pages/book.js | 12 ++++ pages/contact.js | 12 ++++ pages/index.js | 106 +++++++++++++++++++++++++++++++++++ pages/privacy-policy.js | 12 ++++ pages/terms-of-service.js | 12 ++++ public/llms.txt | 28 +++++++++ public/robots.txt | 34 +++++++++++ public/sitemap.xml | 28 +++++++++ 12 files changed, 282 insertions(+), 12 deletions(-) create mode 100644 pages/_document.js create mode 100644 public/llms.txt create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml diff --git a/components/IndustriesGrid.js b/components/IndustriesGrid.js index f0f5f18..166acc2 100644 --- a/components/IndustriesGrid.js +++ b/components/IndustriesGrid.js @@ -700,13 +700,13 @@ export default function IndustriesGrid({ rel="nofollow" className="opacity-70 hover:opacity-100 transition-opacity duration-200" > - + Featured on There's An AI For That
-

+

Transform Your Industry with OpenAdapt -

+

From demonstration to automation in minutes. Just do the task once and OpenAdapt learns from watching. No prompt engineering. No scripting. No brittle selectors. diff --git a/netlify.toml b/netlify.toml index 6c24b2f..ccbc64b 100644 --- a/netlify.toml +++ b/netlify.toml @@ -14,3 +14,12 @@ [[plugins]] package = "netlify-plugin-cypress" + +[[headers]] + for = "/*" + [headers.values] + X-Frame-Options = "SAMEORIGIN" + X-Content-Type-Options = "nosniff" + Referrer-Policy = "strict-origin-when-cross-origin" + Permissions-Policy = "camera=(), microphone=(), geolocation=()" + Strict-Transport-Security = "max-age=31536000; includeSubDomains" diff --git a/pages/_app.js b/pages/_app.js index 3c1f4a2..b3aeef5 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -15,14 +15,10 @@ export default function MyApp({ Component, pageProps }) { <> - OpenAdapt.AI + OpenAdapt.AI — AI-Powered Desktop Automation Platform - - {/* Social media preview images */} - - + {/* Open Graph */} + + + + + + + {/* Twitter Card */} + + + {/* Google tag (gtag.js) */} diff --git a/pages/_document.js b/pages/_document.js new file mode 100644 index 0000000..138cd8d --- /dev/null +++ b/pages/_document.js @@ -0,0 +1,13 @@ +import { Html, Head, Main, NextScript } from 'next/document' + +export default function Document() { + return ( + + + +

+ + + + ) +} diff --git a/pages/book.js b/pages/book.js index f1908b5..06ba3f8 100644 --- a/pages/book.js +++ b/pages/book.js @@ -1,4 +1,5 @@ import Link from 'next/link' +import Head from 'next/head' import { useRouter } from 'next/router' import BookingEmbed from '@components/BookingEmbed' @@ -11,6 +12,17 @@ export default function BookPage() { return (
+ + Book a Call | OpenAdapt.AI + + + + + +

Book a 15-minute automation fit call diff --git a/pages/contact.js b/pages/contact.js index cc10fac..38cad50 100644 --- a/pages/contact.js +++ b/pages/contact.js @@ -1,9 +1,21 @@ +import Head from 'next/head' import ContactBookingSection from '@components/ContactBookingSection' import Footer from '@components/Footer' export default function ContactPage() { return (
+ + Contact | OpenAdapt.AI + + + + + +
diff --git a/pages/index.js b/pages/index.js index 4a24974..a935e77 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,4 +1,5 @@ import { useRef, useState } from 'react' +import Head from 'next/head' import BenchmarkSection from '@components/BenchmarkSection' import ContactBookingSection from '@components/ContactBookingSection' @@ -10,6 +11,90 @@ import IndustriesGrid from '@components/IndustriesGrid' import MastHead from '@components/MastHead' // import SocialSection from '@components/SocialSection' // Temporarily disabled - feeds not working +const organizationSchema = { + '@context': 'https://schema.org', + '@type': 'Organization', + name: 'OpenAdapt.AI', + alternateName: ['OpenAdapt', 'MLDSAI Inc.'], + url: 'https://openadapt.ai', + logo: { + '@type': 'ImageObject', + url: 'https://openadapt.ai/android-chrome-512x512.png', + width: 512, + height: 512, + }, + description: + 'Open-source platform for GUI automation with AI. Record human demonstrations, train models, and deploy agents that can operate any software.', + foundingDate: '2023', + sameAs: [ + 'https://github.com/OpenAdaptAI/OpenAdapt', + 'https://x.com/OpenAdaptAI', + 'https://www.linkedin.com/company/openadapt-ai', + 'https://discord.gg/yF527cQbDG', + 'https://pypi.org/project/openadapt/', + ], + knowsAbout: [ + 'GUI Automation', + 'Robotic Process Automation', + 'AI Agents', + 'Desktop Automation', + 'Machine Learning', + 'Large Language Models', + ], + slogan: 'Teach AI to use any software', +} + +const softwareSchema = { + '@context': 'https://schema.org', + '@type': 'SoftwareApplication', + name: 'OpenAdapt', + alternateName: 'OpenAdapt.AI', + 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.', + url: 'https://openadapt.ai', + downloadUrl: 'https://pypi.org/project/openadapt/', + author: { + '@type': 'Organization', + name: 'OpenAdapt.AI', + url: 'https://openadapt.ai', + }, + license: 'https://opensource.org/licenses/MIT', + codeRepository: 'https://github.com/OpenAdaptAI/OpenAdapt', + programmingLanguage: 'Python', + offers: { + '@type': 'Offer', + price: '0', + 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', + ], + isAccessibleForFree: true, +} + +const websiteSchema = { + '@context': 'https://schema.org', + '@type': 'WebSite', + name: 'OpenAdapt.AI', + alternateName: 'OpenAdapt', + url: 'https://openadapt.ai', + description: + 'Open-source AI-powered GUI automation platform. Teach AI to use any software.', + publisher: { + '@type': 'Organization', + name: 'OpenAdapt.AI', + url: 'https://openadapt.ai', + }, + inLanguage: 'en', +} + export default function Home() { const [feedbackData, setFeedbackData] = useState({ email: '', @@ -20,6 +105,27 @@ export default function Home() { return (
+ + +