--- interface Props { title: string; description: string; ogImage?: string; ogType?: string; canonicalUrl?: string; pageType?: 'home' | 'speaking' | 'books' | 'consulting' | 'contact' | 'blog'; } const { title, description, ogImage = '/social-card.png', ogType = 'website', canonicalUrl, pageType = 'home', } = Astro.props; const siteUrl = 'https://scott.scoble.me'; const currentPath = canonicalUrl || Astro.url.pathname; const fullTitle = title.includes('Scott Scoble') ? title : `${title} — Scott Scoble`; const imageUrl = new URL(ogImage, siteUrl).href; const pageUrl = new URL(currentPath, siteUrl).href; // JSON-LD structured data function getJsonLd(pageType: string): string { const personLd = { '@type': 'Person', '@id': `${siteUrl}#person`, name: 'Scott Scoble', givenName: 'Scott', familyName: 'Scoble', jobTitle: 'Human Cultivation Expert', url: siteUrl, email: 'mailto:scott@scoble.me', sameAs: [ 'https://linkedin.com/in/scottscoble', 'https://x.com/scottscoble', 'https://github.com/sscoble', ], }; switch (pageType) { case 'home': { const websiteLd = { '@type': 'WebSite', '@id': `${siteUrl}#website`, name: 'Scott Scoble', description: 'Human Cultivation Expert for the AI Age', url: siteUrl, }; return JSON.stringify([personLd, websiteLd], null, 2); } case 'speaking': // Event schemas for each signature talk const talks = [ { name: '50 First Dates with AI', description: 'Current AI memory architecture is anterograde amnesia — and we\'re all Henry Roth, recording VHS tapes every night so our agent can wake up functional tomorrow.', url: `${siteUrl}/speaking/50-first-dates`, }, { name: 'From Strip-Mining to Cultivation', description: 'The shift from extraction to cultivation in AI-era teams. Why throughput optimization is killing your soil health.', url: `${siteUrl}/speaking/strip-mining-to-cultivation`, }, { name: 'The Soil Under Your Team', description: 'Diagnose what\'s actually depleted before you fertilize. A diagnostic framework for team health in AI-augmented work.', url: `${siteUrl}/speaking/soil-under-your-team`, }, ]; const eventSchemas = talks.map((talk) => ({ '@context': 'https://schema.org', '@type': 'Event', name: talk.name, description: talk.description, url: talk.url, performer: { '@type': 'Person', name: 'Scott Scoble', jobTitle: 'Keynote Speaker', url: siteUrl, }, offers: { '@type': 'Offer', availability: 'https://schema.org/InStock', availabilityStarts: '2026-01-01', }, eventStatus: 'https://schema.org/EventScheduled', eventAttendanceMode: 'https://schema.org/OfflineEventAttendanceMode', organizer: { '@type': 'Person', name: 'Scott Scoble', url: siteUrl, }, })); // SpeakableSpecification for voice search const speakableSchema = { '@context': 'https://schema.org', '@type': 'SpeakableSpecification', cssSelector: ['h1', '.hero p'], }; const speakerSchema = { '@context': 'https://schema.org', '@type': 'Person', '@id': `${siteUrl}#speaker`, name: 'Scott Scoble', jobTitle: 'Keynote Speaker', description: 'Human Cultivation Expert speaking on AI, leadership, and team cultivation', url: siteUrl, sameAs: personLd.sameAs, }; return JSON.stringify([speakerSchema, speakableSchema, ...eventSchemas], null, 2); case 'books': return JSON.stringify([ { '@context': 'https://schema.org', '@type': 'Book', name: 'The Soil Beneath the Code', author: { '@type': 'Person', name: 'Scott Scoble', url: siteUrl, }, datePublished: '2023', bookFormat: 'https://schema.org/EBook', description: 'What engineering teams can learn from farmers about sustainable systems. A cultivation playbook for technical leaders who are tired of strip-mining their teams.', sameAs: 'https://a.co/d/0226o4Hg', }, { '@context': 'https://schema.org', '@type': 'Book', name: 'A Walk in Mentoring', author: { '@type': 'Person', name: 'Scott Scoble', url: siteUrl, }, datePublished: '2024', bookFormat: 'https://schema.org/EBook', description: 'Three questions that change how people learn. The simplest mentoring framework you\'ll actually use.', sameAs: 'https://a.co/d/0bRKZeUV', }, { '@context': 'https://schema.org', '@type': 'Book', name: 'Dark Provenance', author: { '@type': 'Person', name: 'Scott Scoble', url: siteUrl, }, datePublished: '2026', bookFormat: 'https://schema.org/EBook', description: 'Formal verification for the AI age. How to audit what your AI actually did.', }, ], null, 2); case 'consulting': return JSON.stringify({ '@type': 'Service', name: 'AI Team Consulting', description: 'Helping leaders build AI systems that cultivate humans instead of strip-mining them', provider: { '@type': 'Person', name: 'Scott Scoble' }, serviceType: 'Professional Consulting', areaServed: 'Worldwide', offering: [ { '@type': 'Offering', name: 'Keynote Speaking', description: '45-60 minute keynotes on AI, leadership, and team cultivation', }, { '@type': 'Offering', name: 'Workshops', description: 'Half-day or full-day workshops on cultivation practices', }, ], }, null, 2); case 'contact': return JSON.stringify({ '@type': 'ContactPoint', email: 'scott@scoble.me', contactType: 'Customer Service', availableLanguage: 'English', }, null, 2); default: return JSON.stringify({ '@type': 'Blog', name: 'Scott Scoble Blog', description: 'Thoughts on AI, leadership, and human cultivation', url: `${siteUrl}/blog`, }, null, 2); } } const jsonLd = getJsonLd(pageType); --- {fullTitle}