wip: housekeeping changes from prior session (Footer, SEO, layouts, about, consulting, index, sitemap, speaking, book cover svg)

Carried over from a prior session. Preserved on the feature branch for review rather than discarded; Scott can decide what to merge.
This commit is contained in:
Scott Scoble 2026-07-16 15:49:46 -07:00
parent 2f84d0f7a8
commit a1e41ac6e3
9 changed files with 270 additions and 45 deletions

View file

@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" width="150" height="225" viewBox="0 0 150 225">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#2d1b0e"/>
<stop offset="100%" stop-color="#181818"/>
</linearGradient>
</defs>
<rect width="150" height="225" fill="url(#bg)" rx="4"/>
<!-- subtle border -->
<rect x="2" y="2" width="146" height="221" fill="none" stroke="#8b7355" stroke-width="1" rx="3"/>
<!-- spine line -->
<line x1="10" y1="50" x2="140" y2="50" stroke="#8b7355" stroke-width="1" opacity="0.4"/>
<!-- title -->
<text x="75" y="85" text-anchor="middle" fill="#e8dcc8" font-family="Georgia, serif" font-size="13" font-weight="bold">Dark</text>
<text x="75" y="102" text-anchor="middle" fill="#e8dcc8" font-family="Georgia, serif" font-size="13" font-weight="bold">Provenance</text>
<!-- subtitle -->
<text x="75" y="130" text-anchor="middle" fill="#b8a88a" font-family="sans-serif" font-size="7">Formal Verification</text>
<text x="75" y="142" text-anchor="middle" fill="#b8a88a" font-family="sans-serif" font-size="7">for the AI Age</text>
<!-- coming soon badge -->
<rect x="25" y="160" width="100" height="20" rx="10" fill="#8b7355" opacity="0.8"/>
<text x="75" y="174" text-anchor="middle" fill="#fff" font-family="sans-serif" font-size="8" font-weight="bold" letter-spacing="1">COMING SOON</text>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -66,18 +66,22 @@ const currentYear = new Date().getFullYear();
</script>
<div class="footer-social">
<a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener" class="social-link" aria-label="Follow on LinkedIn for AI insights and leadership perspectives" data-umami-event="footer-linkedin-click">
<a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener me" class="social-link" aria-label="Follow on LinkedIn for AI insights and leadership perspectives" data-umami-event="footer-linkedin-click">
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
<span class="social-label">Follow for AI Insights</span>
</a>
<a href="https://x.com/scottscoble" target="_blank" rel="noopener" class="social-link" aria-label="Follow on X/Twitter for daily thoughts on cultivation and AI" data-umami-event="footer-x-click">
<a href="https://x.com/scottscoble" target="_blank" rel="noopener me" class="social-link" aria-label="Follow on X/Twitter for daily thoughts on cultivation and AI" data-umami-event="footer-x-click">
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
<span class="social-label">Daily Thoughts</span>
</a>
<a href="https://github.com/wscoble" target="_blank" rel="noopener" class="social-link" aria-label="Explore open source projects on GitHub" data-umami-event="footer-github-click">
<a href="https://github.com/wscoble" target="_blank" rel="noopener me" class="social-link" aria-label="Explore open source projects on GitHub" data-umami-event="footer-github-click">
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.605-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg>
<span class="social-label">Open Source</span>
</a>
<a href="https://www.amazon.com/stores/Scott-Scoble/author/B0GKSSBDMK" target="_blank" rel="noopener me" class="social-link" aria-label="Scott Scoble author page on Amazon" data-umami-event="footer-amazon-click">
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M13.23 10.56V10c0-1.2.63-2.1 1.68-2.1.87 0 1.5.64 1.5 1.48 0 .96-1.04 1.76-3.18 3.18zm-4.2 8.68c-2.12 0-4.08-.76-5.48-2.26-.24-.26-.15-.66.2-.78l2.68-.92c.33-.1.66.1.82.4.56.96 1.5 1.5 2.64 1.5 2.3 0 3.34-1.84 3.78-3.34-1.3.52-2.64.78-4.04.78-3.18 0-6.08-1.72-7.2-4.44-.24-.58-.38-1.24-.38-1.92 0-2.92 2.62-6.34 7.2-6.34 2.98 0 5.68 1.24 7.08 3.18 1.44 1.98 1.26 5.08-.24 7.54-1.16 1.92-3.24 3.36-5.46 3.46zM22.46 21l-2.34-.7c-.3-.08-.5-.36-.42-.66.08-.3.36-.5.66-.42l2.34.7c.3.1.48.4.4.7-.1.3-.38.5-.68.4z"/></svg>
<span class="social-label">Books on Amazon</span>
</a>
</div>
</div>

View file

@ -38,6 +38,7 @@ function getJsonLd(pageType: string): string {
'https://linkedin.com/in/scottscoble',
'https://x.com/scottscoble',
'https://github.com/wscoble',
'https://www.amazon.com/stores/Scott-Scoble/author/B0GKSSBDMK',
],
knowsAbout: ['AI leadership', 'human cultivation', 'engineering teams', 'formal specifications', 'provenance systems'],
knowsLanguage: ['en'],
@ -78,7 +79,63 @@ function getJsonLd(pageType: string): string {
description: 'Human Cultivation Expert for the AI Age',
url: siteUrl,
};
return JSON.stringify([personLd, websiteLd], null, 2);
const speakableSchema = {
'@context': 'https://schema.org',
'@type': 'SpeakableSpecification',
cssSelector: ['h1', '.hero p', '.hero-description'],
};
return JSON.stringify([personLd, websiteLd, speakableSchema], null, 2);
}
case 'blog': {
const blogSchema = {
'@context': 'https://schema.org',
'@type': 'Blog',
'@id': `${siteUrl}#blog`,
name: 'Scott Scoble Blog',
description: 'Articles and essays by Scott Scoble on AI leadership, team cultivation, developer experience, and the human side of technology.',
url: `${siteUrl}/blog`,
author: {
'@type': 'Person',
name: 'Scott Scoble',
url: siteUrl,
},
blogPost: [
{
'@type': 'BlogPosting',
headline: 'Why Cultivation Over Strip Mining',
description: 'Gallup 2026: 80% of the global workforce is disengaged. The $438B cost is not a tool problem; it is a people problem.',
url: `${siteUrl}/blog/strip-mining-cultivation`,
datePublished: '2026-05-18',
author: { '@type': 'Person', name: 'Scott Scoble' },
},
{
'@type': 'BlogPosting',
headline: '50 First Dates with AI',
description: "Every conversation with most AI systems is a first date. Here's the three-layer memory model that actually compounds.",
url: `${siteUrl}/blog/50-first-dates-with-ai`,
datePublished: '2026-05-24',
author: { '@type': 'Person', name: 'Scott Scoble' },
},
{
'@type': 'BlogPosting',
headline: 'The Soil Under Your Team',
description: "Tall stalks, ground cover, nitrogen fixers, pollinators, deep roots. Here's how to read the soil under your team.",
url: `${siteUrl}/blog/soil-health-teams`,
datePublished: '2026-05-18',
author: { '@type': 'Person', name: 'Scott Scoble' },
},
{
'@type': 'BlogPosting',
headline: 'The Soil Beneath the Code is Out',
description: 'A three-layer framework for understanding what makes engineering organizations healthy — or not.',
url: `${siteUrl}/blog/the-soil-beneath-the-code`,
datePublished: '2026-04-28',
author: { '@type': 'Person', name: 'Scott Scoble' },
},
],
};
return JSON.stringify([personLd, blogSchema], null, 2);
}
case 'speaking':

View file

@ -17,7 +17,7 @@ export interface Props {
const {
title,
description,
ogImage = '/social-card.png',
ogImage = '/images/hero-speaker-new.webp',
ogType = 'website',
canonicalUrl,
pageType = 'home',

View file

@ -81,7 +81,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
<section class="projects-section">
<div class="section-container">
<h2>Open Source Projects</h2>
<h2>Projects</h2>
<div class="projects-grid">
<article class="project-card">
@ -91,6 +91,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
<article class="project-card">
<h3>ScobleClaw</h3>
<p class="project-visibility">Private</p>
<p>Agentic engineering framework — tools, workflows, and skills for building with AI agents. Patterns for subagent dispatch, skill-based development, and provenance tracking.</p>
</article>
@ -296,4 +297,17 @@ import BaseLayout from '../layouts/BaseLayout.astro';
color: var(--color-text-muted);
line-height: 1.6;
}
.project-visibility {
display: inline-block;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--color-amber);
background: var(--color-cream-warm);
padding: 0.15rem 0.6rem;
border-radius: 3px;
margin-bottom: 0.5rem;
}
</style>

View file

@ -129,7 +129,7 @@ import PackageCard from '../components/PackageCard.astro';
}
.section-container {
max-width: 1000px;
max-width: 1200px;
margin: 0 auto;
padding: 4rem 2rem;
}

View file

@ -33,7 +33,7 @@ import NewsletterSignup from '../components/NewsletterSignup.astro';
<a href="/speaking#book" class="btn btn-primary" data-umami-event="hero-cta-book">Book Scott for Your Event</a>
</div>
<p class="hero-project-link">
Creator of Speckl, ScobleClaw, and Beyond the Prompt
Creator of <a href="https://speckl.scoble.me">Speckl</a>, <a href="https://os.scoble.me/forgejo/sscoble/scobleclaw">ScobleClaw</a>, and <a href="https://os.scoble.me/forgejo/sscoble/beyond-the-prompt">Beyond the Prompt</a>
</p>
</div>
</section>
@ -109,6 +109,49 @@ import NewsletterSignup from '../components/NewsletterSignup.astro';
</div>
</section>
<!-- Featured Books -->
<section class="featured-books">
<div class="section-header">
<p class="section-kicker">Books</p>
<h2>The Cultivation Series</h2>
</div>
<div class="books-list">
<article class="book-card">
<div class="book-cover">
<img src="/images/book-cover-soil.webp" alt="The Soil Beneath the Code book cover" width="120" height="180" loading="lazy" />
</div>
<div class="book-info">
<h3>The Soil Beneath the Code</h3>
<p class="book-desc">What engineering teams can learn from farmers about sustainable systems. A cultivation playbook for technical leaders who are tired of strip-mining their teams.</p>
<a href="https://a.co/d/0226o4Hg" class="book-cta" target="_blank" rel="noopener" data-umami-event="home-book-soil-amazon">Get It on Amazon →</a>
</div>
</article>
<article class="book-card">
<div class="book-cover">
<img src="/images/book-cover-walk.webp" alt="A Walk in Mentoring book cover" width="120" height="180" loading="lazy" />
</div>
<div class="book-info">
<h3>A Walk in Mentoring</h3>
<p class="book-desc">Three questions that change how people learn. The simplest mentoring framework you'll actually use.</p>
<a href="https://a.co/d/0bRKZeUV" class="book-cta" target="_blank" rel="noopener" data-umami-event="home-book-walk-amazon">Get It on Amazon →</a>
</div>
</article>
<article class="book-card">
<div class="book-cover">
<img src="/images/book-cover-dark-provenance.svg" alt="Dark Provenance book cover" width="120" height="180" loading="lazy" />
</div>
<div class="book-info">
<h3>Dark Provenance</h3>
<p class="book-desc">Formal verification for the AI age. How to audit what your AI actually did. Coming 2026.</p>
<a href="https://www.amazon.com/stores/Scott-Scoble/author/B0GKSSBDMK" class="book-cta" target="_blank" rel="noopener" data-umami-event="home-book-author-amazon">More on Amazon →</a>
</div>
</article>
</div>
</section>
<!-- CTA Section -->
<section class="cta-section">
<div class="cta-visual"></div>
@ -421,6 +464,67 @@ import NewsletterSignup from '../components/NewsletterSignup.astro';
color: var(--color-brown-dark);
}
/* ===== FEATURED BOOKS ===== */
.featured-books {
padding: 6rem 2rem;
background: white;
}
.books-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem;
max-width: 1100px;
margin: 0 auto;
}
.featured-books .book-card {
display: flex;
gap: 1.5rem;
padding: 2rem;
border-radius: 12px;
border: 1px solid var(--color-border-light);
background: var(--color-cream);
transition: all 0.3s ease;
}
.featured-books .book-card:hover {
border-color: var(--color-amber);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.06);
}
.book-cover img {
width: 120px;
height: auto;
border-radius: 4px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
flex-shrink: 0;
}
.book-info h3 {
font-family: var(--font-heading);
font-size: 1.375rem;
color: var(--color-brown-dark);
margin: 0 0 0.5rem;
}
.book-info .book-desc {
color: var(--color-text-muted);
margin: 0 0 1rem;
line-height: 1.6;
font-size: 0.95rem;
}
.book-info .book-cta {
color: var(--color-amber);
font-weight: 600;
text-decoration: none;
}
.book-info .book-cta:hover {
color: var(--color-brown-dark);
}
/* ===== CTA SECTION ===== */
.cta-section {
position: relative;
@ -493,6 +597,23 @@ import NewsletterSignup from '../components/NewsletterSignup.astro';
padding: 4rem 1.5rem;
}
.featured-books .books-list {
grid-template-columns: 1fr;
}
.featured-books .book-card {
flex-direction: column;
align-items: center;
text-align: center;
}
.book-info .book-desc {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.hero-overlay {
background:
radial-gradient(

View file

@ -3,44 +3,50 @@ import type { APIRoute } from 'astro';
const siteUrl = 'https://scott.scoble.me';
const pages = [
{ url: '/', lastmod: '2026-05-24', priority: '1.0' },
{ url: '/speaking', lastmod: '2026-05-24', priority: '0.9' },
{ url: '/consulting', lastmod: '2026-05-24', priority: '0.8' },
{ url: '/books', lastmod: '2026-05-24', priority: '0.8' },
{ url: '/contact', lastmod: '2026-05-24', priority: '0.7' },
{ url: '/privacy', lastmod: '2026-05-24', priority: '0.3' },
{ url: '/about', lastmod: '2026-05-24', priority: '0.7' },
{ url: '/blog', lastmod: '2026-05-24', priority: '0.9' },
{ url: '/', lastmod: '2026-06-01', priority: '1.0' },
{ url: '/speaking', lastmod: '2026-06-01', priority: '0.9' },
{ url: '/consulting', lastmod: '2026-06-01', priority: '0.8' },
{ url: '/books', lastmod: '2026-06-01', priority: '0.8' },
{ url: '/contact', lastmod: '2026-06-01', priority: '0.7' },
{ url: '/privacy', lastmod: '2026-06-01', priority: '0.3' },
{ url: '/about', lastmod: '2026-06-01', priority: '0.7' },
{ url: '/blog', lastmod: '2026-06-01', priority: '0.9' },
];
const speakingPages = [
{ url: '/speaking/50-first-dates', lastmod: '2026-06-01' },
{ url: '/speaking/strip-mining-to-cultivation', lastmod: '2026-06-01' },
{ url: '/speaking/soil-under-your-team', lastmod: '2026-06-01' },
];
// All blog post URLs
const blogPosts = [
{ url: '/blog/50-first-dates-with-ai', lastmod: '2026-05-24' },
{ url: '/blog/strip-mining-cultivation', lastmod: '2026-05-18' },
{ url: '/blog/soil-health-teams', lastmod: '2026-05-18' },
{ url: '/blog/30-years-software', lastmod: '2026-05-18' },
{ url: '/blog/spec-first-audit-surface', lastmod: '2026-05-24' },
{ url: '/blog/open-source-projects', lastmod: '2026-05-23' },
{ url: '/blog/prove-sqlite', lastmod: '2026-05-23' },
{ url: '/blog/ai-has-amnesia', lastmod: '2026-05-18' },
{ url: '/blog/agentic-wars', lastmod: '2026-05-08' },
{ url: '/blog/ai-brain-fry', lastmod: '2026-05-03' },
{ url: '/blog/surveillance-extraction', lastmod: '2026-05-03' },
{ url: '/blog/gallup-disengagement', lastmod: '2026-05-03' },
{ url: '/blog/devex-shift', lastmod: '2026-05-03' },
{ url: '/blog/token-anxiety', lastmod: '2026-05-04' },
{ url: '/blog/three-questions-mentoring', lastmod: '2026-04-28' },
{ url: '/blog/strip-mining-signs', lastmod: '2026-04-28' },
{ url: '/blog/the-soil-beneath-the-code', lastmod: '2026-04-28' },
{ url: '/blog/strip-mining-happening-right-now', lastmod: '2026-05-07' },
{ url: '/blog/mentorship-isnt-latency-its-leverage', lastmod: '2026-05-07' },
{ url: '/blog/ai-exposes-leaders-cultivation-test', lastmod: '2026-05-07' },
{ url: '/blog/50-first-dates-with-ai', lastmod: '2026-05-30' },
{ url: '/blog/strip-mining-cultivation', lastmod: '2026-05-30' },
{ url: '/blog/soil-health-teams', lastmod: '2026-05-30' },
{ url: '/blog/30-years-software', lastmod: '2026-05-30' },
{ url: '/blog/spec-first-audit-surface', lastmod: '2026-05-30' },
{ url: '/blog/open-source-projects', lastmod: '2026-05-30' },
{ url: '/blog/prove-sqlite', lastmod: '2026-05-30' },
{ url: '/blog/ai-has-amnesia', lastmod: '2026-05-30' },
{ url: '/blog/agentic-wars', lastmod: '2026-05-30' },
{ url: '/blog/ai-brain-fry', lastmod: '2026-05-30' },
{ url: '/blog/surveillance-extraction', lastmod: '2026-05-30' },
{ url: '/blog/gallup-disengagement', lastmod: '2026-05-30' },
{ url: '/blog/devex-shift', lastmod: '2026-05-30' },
{ url: '/blog/token-anxiety', lastmod: '2026-05-30' },
{ url: '/blog/three-questions-mentoring', lastmod: '2026-05-30' },
{ url: '/blog/strip-mining-signs', lastmod: '2026-05-30' },
{ url: '/blog/the-soil-beneath-the-code', lastmod: '2026-05-30' },
{ url: '/blog/strip-mining-happening-right-now', lastmod: '2026-05-30' },
{ url: '/blog/mentorship-isnt-latency-its-leverage', lastmod: '2026-05-30' },
{ url: '/blog/ai-exposes-leaders-cultivation-test', lastmod: '2026-05-30' },
];
const allPages = [...pages, ...blogPosts.map(p => ({ ...p, priority: '0.7' }))];
const allPages = [...pages, ...speakingPages.map(p => ({ ...p, priority: '0.7' })), ...blogPosts.map(p => ({ ...p, priority: '0.7' }))];
// Render the sitemap XML
const xml = `<?xml version="1.0" encoding="UTF-8"?>
const xml = `\<\?xml version="1.0" encoding="UTF-8"?\>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${allPages.map(page => `
<url>

View file

@ -53,6 +53,7 @@ import SharedForm from '../components/Form/SharedForm.astro';
<TalkCard
title="The Soil Under Your Team"
slug="/speaking/soil-under-your-team"
premise="Diagnose what's actually depleted before you fertilize. A diagnostic framework for team health in AI-augmented work."
audience="Team leads, managers, engineering directors, founders"
takeaways={[