Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions website/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,17 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Agentic WebView SDK</title>
<meta name="description" content="Agentic WebView SDK bridging large language models and Android WebViews." />
<meta name="robots" content="index, follow" />
<link rel="canonical" href="https://awv.shantoislam.dev/" />
<meta property="og:title" content="Agentic WebView SDK" />
<meta property="og:description" content="Bridging large language models and Android WebViews for seamless agentic interactions on device." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://agenticwebview.example.com/" />
<meta name="twitter:card" content="summary" />
<meta property="og:url" content="https://awv.shantoislam.dev/" />
<meta property="og:image" content="https://awv.shantoislam.dev/og-image.png" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Agentic WebView SDK" />
<meta name="twitter:description" content="Bridging large language models and Android WebViews for seamless agentic interactions on device." />
<meta name="twitter:image" content="https://awv.shantoislam.dev/og-image.png" />
</head>
<body>
<div id="root"></div>
Expand Down
Binary file added website/public/og-image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions website/public/robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
User-agent: *
Allow: /

Sitemap: https://awv.shantoislam.dev/sitemap.xml
27 changes: 27 additions & 0 deletions website/public/sitemap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://awv.shantoislam.dev/</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://awv.shantoislam.dev/documentation/integration-guide</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://awv.shantoislam.dev/documentation/agent-integration</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://awv.shantoislam.dev/documentation/best-practices</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
15 changes: 14 additions & 1 deletion website/src/components/DocPage.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
import React from 'react';
import { useLocation } from 'react-router-dom';
import { SEO } from './SEO';

interface DocPageProps {
title: string;
description: React.ReactNode;
seoDescription?: string;
children: React.ReactNode;
}

export function DocPage({ title, description, children }: DocPageProps) {
export function DocPage({ title, description, seoDescription, children }: DocPageProps) {
const location = useLocation();

const cleanDescription = seoDescription ||
(typeof description === 'string' ? description : 'Agentic WebView SDK documentation and integration guide.');

return (
<div className="animate-in fade-in slide-in-from-bottom-4 duration-500">
<SEO
title={title}
description={cleanDescription}
path={location.pathname}
/>
<h1 className="text-3xl font-medium tracking-tight mb-4 text-vp-fg">{title}</h1>
<p className="text-vp-text mb-12 text-[16px] leading-relaxed">
{description}
Expand Down
67 changes: 67 additions & 0 deletions website/src/components/SEO.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import React, { useEffect } from 'react';

interface SEOProps {
title: string;
description: string;
path: string;
}

export function SEO({ title, description, path }: SEOProps) {
useEffect(() => {
// 1. Update title
const fullTitle = title === 'Agentic WebView SDK' ? title : `${title} | Agentic WebView SDK`;
document.title = fullTitle;

// Helper to set/update meta tag
const updateMetaTag = (attributeName: string, attributeValue: string, content: string) => {
let element = document.querySelector(`meta[${attributeName}="${attributeValue}"]`);
if (element) {
element.setAttribute('content', content);
} else {
element = document.createElement('meta');
element.setAttribute(attributeName, attributeValue);
element.setAttribute('content', content);
document.head.appendChild(element);
}
};

// Helper to set/update link tag
const updateLinkTag = (rel: string, href: string) => {
let element = document.querySelector(`link[rel="${rel}"]`);
if (element) {
element.setAttribute('href', href);
} else {
element = document.createElement('link');
element.setAttribute('rel', rel);
element.setAttribute('href', href);
document.head.appendChild(element);
}
};

// Normalize path to ensure leading slash
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
const fullUrl = `https://awv.shantoislam.dev${normalizedPath}`;

// 2. Update description meta tag
updateMetaTag('name', 'description', description);

// 3. Update canonical link
updateLinkTag('canonical', fullUrl);

// 4. Update Open Graph tags
updateMetaTag('property', 'og:title', fullTitle);
updateMetaTag('property', 'og:description', description);
updateMetaTag('property', 'og:url', fullUrl);
updateMetaTag('property', 'og:type', 'website');
updateMetaTag('property', 'og:image', 'https://awv.shantoislam.dev/og-image.png');

// 5. Update Twitter Card tags
updateMetaTag('name', 'twitter:title', fullTitle);
updateMetaTag('name', 'twitter:description', description);
updateMetaTag('name', 'twitter:card', 'summary_large_image');
updateMetaTag('name', 'twitter:image', 'https://awv.shantoislam.dev/og-image.png');

}, [title, description, path]);

return null; // This component does not render visual UI
}
6 changes: 6 additions & 0 deletions website/src/pages/Home.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { InlineCode } from '../components/InlineCode';
import { Footer } from '../components/Footer';
import { ArrowRight, ArrowUpRight } from 'lucide-react';
import { useLatestRelease } from '../hooks/useLatestRelease';
import { SEO } from '../components/SEO';

const integrationCode = `// initialize the controller
val controller = remember { AgenticWebController() }
Expand Down Expand Up @@ -52,6 +53,11 @@ export default function Home() {

return (
<div className="min-h-screen bg-vp-bg text-vp-fg font-sans antialiased flex flex-col items-center">
<SEO
title="Agentic WebView SDK"
description="Bridging large language models and Android WebViews for seamless agentic interactions on device."
path="/"
/>
<header className="w-full max-w-[700px] px-4 sm:px-6 h-16 sm:h-20 flex items-center justify-end">
<ThemeToggle />
</header>
Expand Down
1 change: 1 addition & 0 deletions website/src/pages/docs/AgentIntegration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export default function AgentIntegration() {
This guide explains how to use the <InlineCode className="text-tk-class">AgenticWebController</InlineCode> to build LLM-powered agents that can perceive and interact with web pages.
</>
}
seoDescription="This guide explains how to use the AgenticWebController to build LLM-powered agents that can perceive and interact with web pages."
>
<section>
<h2 className="text-xl font-medium mb-4 text-vp-fg">1. Capturing Page State</h2>
Expand Down
Loading