Fix brand-site issues #91-#96
All checks were successful
Build and Deploy to Storj / build-and-deploy (push) Successful in 15s
- #91: Contact form now delivers via Web3Forms (sharedform.js + newsletter endpoint) - #92: GitHub links updated to wscoble - #93: ScobleClaw link corrected to sscoble/scobleclaw - #94: Speckl description updated to compile-time provenance - #95: Consulting CTA now links to /contact/ instead of LinkedIn - #96: CI/CD test comment removed from production output - Additional: Newsletter signup rewritten with working form, testimonial component removed
|
Before Width: | Height: | Size: 6 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 446 B After Width: | Height: | Size: 712 B |
|
|
@ -4,7 +4,14 @@
|
|||
<stop offset="0%" style="stop-color:#3d5a3e;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#2d4a2e;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient id="highlight" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#d9a12b;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#c8952e;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect width="100" height="100" rx="18" fill="url(#bg)"/>
|
||||
<text x="50" y="70" font-family="EB Garamond, Georgia, serif" font-size="56" font-weight="600" fill="#faf8f5" text-anchor="middle">S</text>
|
||||
<rect width="100" height="100" rx="20" fill="url(#bg)"/>
|
||||
<circle cx="35" cy="40" r="18" fill="url(#highlight)" opacity="0.9"/>
|
||||
<circle cx="65" cy="60" r="14" fill="url(#highlight)" opacity="0.7"/>
|
||||
<circle cx="50" cy="75" r="10" fill="url(#highlight)" opacity="0.5"/>
|
||||
<text x="50" y="68" font-family="EB Garamond, Georgia, serif" font-size="52" font-weight="600" fill="#faf8f5" text-anchor="middle">S</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 516 B After Width: | Height: | Size: 966 B |
|
Before Width: | Height: | Size: 6 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 6 KiB After Width: | Height: | Size: 7.6 KiB |
17
public/images/photo-silhouette.svg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 500" width="400" height="500">
|
||||
<defs>
|
||||
<linearGradient id="sil-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#f5f0e8;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#ede9e2;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient id="sil-body" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#4a4438;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#3d5a3e;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<circle cx="200" cy="200" r="180" fill="url(#sil-bg)" stroke="#e0dbd2" stroke-width="1"/>
|
||||
<ellipse cx="200" cy="160" rx="55" ry="65" fill="url(#sil-body)"/>
|
||||
<path d="M 130 260 Q 165 230 200 235 Q 235 230 270 260 L 290 380 L 110 380 Z" fill="url(#sil-body)"/>
|
||||
<path d="M 80 420 Q 100 390 130 400 Q 110 420 80 420 Z" fill="#3d5a3e" opacity="0.3"/>
|
||||
<path d="M 320 420 Q 300 390 270 400 Q 290 420 320 420 Z" fill="#3d5a3e" opacity="0.3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1,022 B |
143
public/rss.xml
|
|
@ -1,143 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||
<channel>
|
||||
<title>Scott Scoble Blog</title>
|
||||
<link>https://scott.scoble.me/blog</link>
|
||||
<description>Articles on AI, leadership, cultivation, and the human side of technology.</description>
|
||||
<language>en-us</language>
|
||||
<lastBuildDate>Sat, 23 May 2026 21:24:00 +0000</lastBuildDate>
|
||||
<atom:link href="https://scott.scoble.me/rss.xml" rel="self" type="application/rss+xml"/>
|
||||
<image>
|
||||
<url>https://scott.scoble.me/social-card.png</url>
|
||||
<title>Scott Scoble Blog</title>
|
||||
<link>https://scott.scoble.me/blog</link>
|
||||
</image>
|
||||
|
||||
<item>
|
||||
<title>My Open Source Projects: Speckl, ScobleClaw, and Beyond the Prompt</title>
|
||||
<link>https://scott.scoble.me/blog/open-source-projects</link>
|
||||
<guid>https://scott.scoble.me/blog/open-source-projects</guid>
|
||||
<pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>A roundup of Scott Scoble's open-source projects — Speckl (spec compiler with provenance), ScobleClaw (agentic engineering framework), and Beyond the Prompt (workshop on building with AI agents).</description>
|
||||
<category>Open Source</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>We're Going to Formally Verify SQLite</title>
|
||||
<link>https://scott.scoble.me/blog/prove-sqlite</link>
|
||||
<guid>https://scott.scoble.me/blog/prove-sqlite</guid>
|
||||
<pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>SQLite runs on every smartphone, every browser, every embedded system. Its core state machines have never been formally verified.</description>
|
||||
<category>Engineering</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>You're Already in the Agentic Wars</title>
|
||||
<link>https://scott.scoble.me/blog/agentic-wars</link>
|
||||
<guid>https://scott.scoble.me/blog/agentic-wars</guid>
|
||||
<pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>Meta has Hatch. Google has Remy. Everyone is building agents. Whose capability compounds?</description>
|
||||
<category>AI</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>The Strip Mining is Happening Right Now</title>
|
||||
<link>https://scott.scoble.me/blog/strip-mining-happening-right-now</link>
|
||||
<guid>https://scott.scoble.me/blog/strip-mining-happening-right-now</guid>
|
||||
<pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>Strip-mining of people isn't a future risk — it's already happening in every org that treats AI as headcount reduction.</description>
|
||||
<category>Leadership</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>AI Exposes Leaders; The Cultivation Test</title>
|
||||
<link>https://scott.scoble.me/blog/ai-exposes-leaders-cultivation-test</link>
|
||||
<guid>https://scott.scoble.me/blog/ai-exposes-leaders-cultivation-test</guid>
|
||||
<pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>AI doesn't just change work — it exposes what kind of leader you already were.</description>
|
||||
<category>AI</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Mentorship Isn't Latency; It's Leverage</title>
|
||||
<link>https://scott.scoble.me/blog/mentorship-isnt-latency-its-leverage</link>
|
||||
<guid>https://scott.scoble.me/blog/mentorship-isnt-latency-its-leverage</guid>
|
||||
<pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>The highest-ROI activity in your organization is the one you canceled first.</description>
|
||||
<category>Mentorship</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Three Signs Your Team Is Being Strip-Mined</title>
|
||||
<link>https://scott.scoble.me/blog/strip-mining-signs</link>
|
||||
<guid>https://scott.scoble.me/blog/strip-mining-signs</guid>
|
||||
<pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>The mindset shift that separates thriving teams from burned-out ones — cultivation over extraction.</description>
|
||||
<category>Teams</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Three Questions That Changed How I Mentor</title>
|
||||
<link>https://scott.scoble.me/blog/three-questions-mentoring</link>
|
||||
<guid>https://scott.scoble.me/blog/three-questions-mentoring</guid>
|
||||
<pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>The simple mentoring framework that actually gets used: three questions that unlock real growth.</description>
|
||||
<category>Leadership</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>The Token Anxiety Trap; Why AI Agents Aren't Liberating Us (Yet)</title>
|
||||
<link>https://scott.scoble.me/blog/token-anxiety</link>
|
||||
<guid>https://scott.scoble.me/blog/token-anxiety</guid>
|
||||
<pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>Your agent swarm runs 24/7 and you're more anxious than ever. The agent revolution promised freedom — instead it gave us token anxiety.</description>
|
||||
<category>AI</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>I'm Exhausted. Your Brain Is Reconfiguring, Not Breaking.</title>
|
||||
<link>https://scott.scoble.me/blog/ai-brain-fry</link>
|
||||
<guid>https://scott.scoble.me/blog/ai-brain-fry</guid>
|
||||
<pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>Your brain is reconfiguring from intonation to orchestration. That hurts. That doesn't mean it's broken. Discomfort ≠ damage.</description>
|
||||
<category>AI</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>The Surveillance Dividend Is a Lie</title>
|
||||
<link>https://scott.scoble.me/blog/surveillance-extraction</link>
|
||||
<guid>https://scott.scoble.me/blog/surveillance-extraction</guid>
|
||||
<pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>Every company running AI adoption is making an implicit bargain: data for tools.</description>
|
||||
<category>Leadership</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>80% of Your Team Is Disengaged. It's Not Their Fault.</title>
|
||||
<link>https://scott.scoble.me/blog/gallup-disengagement</link>
|
||||
<guid>https://scott.scoble.me/blog/gallup-disengagement</guid>
|
||||
<pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>Gallup says 80% of the global workforce is disengaged. The $100B+ engagement industry has failed for 20 years.</description>
|
||||
<category>Leadership</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>The Developer Experience Shift; Why Tooling Alone Won't Save You</title>
|
||||
<link>https://scott.scoble.me/blog/devex-shift</link>
|
||||
<guid>https://scott.scoble.me/blog/devex-shift</guid>
|
||||
<pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
|
||||
<description>Companies will spend $60B+ on developer tools in 2026. But the real DevEx crisis isn't tooling — it's autonomy, mastery, and belonging.</description>
|
||||
<category>Engineering</category>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>The Soil Beneath the Code</title>
|
||||
<link>https://scott.scoble.me/blog/the-soil-beneath-the-code</link>
|
||||
<guid>https://scott.scoble.me/blog/the-soil-beneath-the-code</guid>
|
||||
<pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate>
|
||||
<description>A three-layer framework for understanding what makes engineering organizations healthy — or not.</description>
|
||||
<category>Engineering</category>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://scott.scoble.me/</loc>
|
||||
<priority>1.0</priority>
|
||||
<changefreq>weekly</changefreq>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://scott.scoble.me/speaking</loc>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://scott.scoble.me/consulting</loc>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://scott.scoble.me/books</loc>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://scott.scoble.me/about</loc>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://scott.scoble.me/blog</loc>
|
||||
<priority>0.6</priority>
|
||||
<changefreq>weekly</changefreq>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://scott.scoble.me/contact</loc>
|
||||
<priority>0.5</priority>
|
||||
</url>
|
||||
</urlset>
|
||||
|
|
@ -9,17 +9,30 @@ const currentYear = new Date().getFullYear();
|
|||
<div class="footer-brand">
|
||||
<span class="footer-logo">Scott Scoble</span>
|
||||
<p class="footer-tagline">The human cultivation expert for the AI age.</p>
|
||||
<p class="footer-email">📧 <a href="mailto:scott@scoble.me">scott@scoble.me</a></p>
|
||||
<p class="footer-email">📧 <span id="footer-email-link" data-user="scott" data-domain="scoble.me"></span></p>
|
||||
<script>
|
||||
(function() {
|
||||
const el = document.getElementById('footer-email-link');
|
||||
if (!el) return;
|
||||
const user = el.getAttribute('data-user');
|
||||
const domain = el.getAttribute('data-domain');
|
||||
const email = user + '@' + domain;
|
||||
el.innerHTML = '<a href="mailto:' + email + '">' + email + '</a>';
|
||||
})();
|
||||
</script>
|
||||
|
||||
<div class="footer-social">
|
||||
<a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener" aria-label="LinkedIn">
|
||||
<svg viewBox="0 0 24 24" width="24" height="24" 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>
|
||||
<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">
|
||||
<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" aria-label="X/Twitter">
|
||||
<svg viewBox="0 0 24 24" width="24" height="24" 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>
|
||||
<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">
|
||||
<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/sscoble" target="_blank" rel="noopener" aria-label="GitHub">
|
||||
<svg viewBox="0 0 24 24" width="24" height="24" 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>
|
||||
<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">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -112,16 +125,32 @@ const currentYear = new Date().getFullYear();
|
|||
|
||||
.footer-social {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
gap: 0.75rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.footer-social a {
|
||||
.social-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.375rem;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
transition: color 0.2s ease;
|
||||
text-decoration: none;
|
||||
font-size: 0.8125rem;
|
||||
padding: 0.375rem 0.625rem;
|
||||
border-radius: 6px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.footer-social a:hover {
|
||||
.social-link:hover {
|
||||
color: var(--color-amber);
|
||||
border-color: var(--color-amber);
|
||||
background: rgba(200, 149, 46, 0.08);
|
||||
}
|
||||
|
||||
.social-label {
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.footer-newsletter {
|
||||
|
|
|
|||
|
|
@ -110,7 +110,9 @@ const topicParam = Astro.url.searchParams.get('topic');
|
|||
))}
|
||||
|
||||
<button type="submit" class="form-submit">
|
||||
<span class="submit-text">{type === 'waitlist' ? 'Join Waitlist' : 'Connect on LinkedIn'}</span>
|
||||
<span class="submit-text">
|
||||
{type === 'speaking' ? 'Send Inquiry' : type === 'contact' ? 'Send Message' : 'Join Waitlist'}
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<div class="form-error" role="alert" style="display:none;"></div>
|
||||
|
|
@ -118,7 +120,7 @@ const topicParam = Astro.url.searchParams.get('topic');
|
|||
|
||||
<div class="form-success" style="display:none;">
|
||||
<h4>{type === 'waitlist' ? "You're on the waitlist!" : 'Thanks for reaching out!'}</h4>
|
||||
<p>{type === 'waitlist' ? "We'll let you know when Dark Provenance is available." : 'You\'ll be redirected to LinkedIn to connect with Scott.'}</p>
|
||||
<p>{type === 'speaking' ? "Your inquiry has been submitted. Scott typically responds within 24 hours." : type === 'contact' ? "Your message has been submitted. Scott typically responds within 24 hours." : "We'll let you know when Dark Provenance is available."}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -135,29 +137,66 @@ const topicParam = Astro.url.searchParams.get('topic');
|
|||
form.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
submitBtn.disabled = true;
|
||||
submitText.textContent = 'Redirecting...';
|
||||
submitText.textContent = 'Sending...';
|
||||
errorEl.style.display = 'none';
|
||||
errorEl.textContent = '';
|
||||
|
||||
try {
|
||||
// Show success message briefly, then redirect to LinkedIn
|
||||
form.style.display = 'none';
|
||||
successEl.style.display = '';
|
||||
// POST form data to Web3Forms API
|
||||
const formData = new FormData(form);
|
||||
|
||||
// Build subject based on form type
|
||||
let subject = '';
|
||||
if (type === 'speaking') {
|
||||
subject = 'Speaking Inquiry - Scott Scoble Brand Site';
|
||||
} else if (type === 'contact') {
|
||||
subject = 'Contact Form - Scott Scoble Brand Site';
|
||||
} else if (type === 'waitlist') {
|
||||
subject = 'Dark Provenance Waitlist Interest';
|
||||
}
|
||||
|
||||
// Collect field data
|
||||
let body = '';
|
||||
formData.forEach((value, key) => {
|
||||
if (key !== '_gotcha' && value) {
|
||||
body += `${key}: ${value}\n`;
|
||||
}
|
||||
});
|
||||
|
||||
// Prepare payload for Web3Forms
|
||||
const payload = {
|
||||
access_key: 'e6e6c7ab-3a0f-49b1-ac78-0f2f2fe84cbe',
|
||||
subject: subject,
|
||||
from_name: formData.get('name') || 'Brand Site Visitor',
|
||||
email: formData.get('email') || 'no-reply@scott.scoble.me',
|
||||
message: body,
|
||||
};
|
||||
|
||||
const response = await fetch('https://api.web3forms.com/submit', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (!response.ok || !result.success) {
|
||||
throw new Error(result.message || 'Failed to send message. Please try again or email directly.');
|
||||
}
|
||||
|
||||
// Track with Umami if available
|
||||
if (window.umami) {
|
||||
window.umami.track('form_submitted', { type, success: true });
|
||||
}
|
||||
|
||||
// Redirect to LinkedIn after a brief pause
|
||||
setTimeout(() => {
|
||||
window.location.href = 'https://linkedin.com/in/scottscoble';
|
||||
}, 1000);
|
||||
// Show success
|
||||
form.style.display = 'none';
|
||||
successEl.style.display = '';
|
||||
} catch (err) {
|
||||
errorEl.textContent = err.message;
|
||||
errorEl.textContent = err.message || 'Something went wrong. Please try again.';
|
||||
errorEl.style.display = '';
|
||||
submitBtn.disabled = false;
|
||||
submitText.textContent = type === 'waitlist' ? 'Join Waitlist' : 'Connect on LinkedIn';
|
||||
submitText.textContent = type === 'speaking' ? 'Send Inquiry' : type === 'contact' ? 'Send Message' : 'Join Waitlist';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -14,13 +14,74 @@ const {
|
|||
<div class="newsletter-block">
|
||||
<h2>{title}</h2>
|
||||
<p>{description}</p>
|
||||
<form class="newsletter-form" action="https://formspree.io/f/placeholder" method="POST">
|
||||
<label for="newsletter-email" class="sr-only">Email address</label>
|
||||
<input id="newsletter-email" type="email" name="email" placeholder="your@email.com" required />
|
||||
<button type="submit" class="btn btn-primary">Subscribe</button>
|
||||
</form>
|
||||
<div class="newsletter-form">
|
||||
<form class="newsletter-form-inline" id="newsletter-form" novalidate>
|
||||
<div style="position: absolute; left: -9999px;" aria-hidden="true">
|
||||
<input type="text" name="_gotcha" tabindex={-1} autocomplete="off" />
|
||||
</div>
|
||||
<input type="email" name="email" placeholder="Your email" required />
|
||||
<button type="submit" class="btn btn-primary">Subscribe →</button>
|
||||
</form>
|
||||
<div class="newsletter-success" style="display:none;">
|
||||
<p><strong>You're subscribed!</strong> Check your inbox for the welcome email.</p>
|
||||
</div>
|
||||
<div class="newsletter-error" style="display:none;"></div>
|
||||
<p class="newsletter-note">
|
||||
No spam. No AI-generated content. Just the soil report.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const form = document.getElementById('newsletter-form');
|
||||
if (form) {
|
||||
const successEl = form.parentElement.querySelector('.newsletter-success');
|
||||
const errorEl = form.parentElement.querySelector('.newsletter-error');
|
||||
const submitBtn = form.querySelector('button[type="submit"]');
|
||||
|
||||
form.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.textContent = 'Subscribing...';
|
||||
errorEl.style.display = 'none';
|
||||
errorEl.textContent = '';
|
||||
|
||||
try {
|
||||
const formData = new FormData(form);
|
||||
const email = formData.get('email');
|
||||
|
||||
const payload = {
|
||||
access_key: 'e6e6c7ab-3a0f-49b1-ac78-0f2f2fe84cbe',
|
||||
subject: 'Newsletter Subscribe - Scott Scoble',
|
||||
from_name: email,
|
||||
email: email,
|
||||
message: `New newsletter subscriber: ${email}`,
|
||||
};
|
||||
|
||||
const response = await fetch('https://api.web3forms.com/submit', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (!response.ok || !result.success) {
|
||||
throw new Error(result.message || 'Subscription failed. Please try again.');
|
||||
}
|
||||
|
||||
form.style.display = 'none';
|
||||
successEl.style.display = '';
|
||||
} catch (err) {
|
||||
errorEl.textContent = err.message || 'Something went wrong. Please try again.';
|
||||
errorEl.style.display = '';
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.textContent = 'Subscribe →';
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.newsletter-block {
|
||||
text-align: center;
|
||||
|
|
@ -41,28 +102,78 @@ const {
|
|||
|
||||
.newsletter-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
max-width: 24rem;
|
||||
max-width: 28rem;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.newsletter-form input {
|
||||
.newsletter-form-inline {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
width: 100%;
|
||||
max-width: 400px;
|
||||
}
|
||||
|
||||
.newsletter-form-inline input[type="email"] {
|
||||
flex: 1;
|
||||
padding: 0.75rem 1rem;
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: 4px;
|
||||
font-family: var(--font-body);
|
||||
font-size: var(--size-base);
|
||||
border-radius: 6px;
|
||||
font-size: 1rem;
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
.newsletter-form input:focus {
|
||||
.newsletter-form-inline input[type="email"]:focus {
|
||||
outline: none;
|
||||
border-color: var(--color-green);
|
||||
box-shadow: 0 0 0 3px rgba(61, 90, 62, 0.15);
|
||||
box-shadow: 0 0 0 2px rgba(61, 90, 62, 0.2);
|
||||
}
|
||||
|
||||
.newsletter-form-inline .btn {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.newsletter-note {
|
||||
font-size: var(--size-sm);
|
||||
color: var(--color-text-muted);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.newsletter-note a {
|
||||
color: var(--color-green);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.newsletter-success {
|
||||
text-align: center;
|
||||
padding: 1.5rem;
|
||||
background: var(--color-green);
|
||||
color: white;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.newsletter-success p {
|
||||
color: white;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.newsletter-error {
|
||||
background: #dc2626;
|
||||
color: white;
|
||||
padding: 0.75rem;
|
||||
border-radius: 4px;
|
||||
font-size: 0.9375rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media (max-width: 639px) {
|
||||
.newsletter-form {
|
||||
.newsletter-block {
|
||||
padding: var(--space-2xl) var(--space-md);
|
||||
}
|
||||
|
||||
.newsletter-form-inline {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ function getJsonLd(pageType: string): string {
|
|||
sameAs: [
|
||||
'https://linkedin.com/in/scottscoble',
|
||||
'https://x.com/scottscoble',
|
||||
'https://github.com/sscoble',
|
||||
'https://github.com/wscoble',
|
||||
],
|
||||
knowsAbout: ['AI leadership', 'human cultivation', 'engineering teams', 'formal specifications', 'provenance systems'],
|
||||
knowsLanguage: ['en'],
|
||||
|
|
@ -58,7 +58,7 @@ function getJsonLd(pageType: string): string {
|
|||
'@type': 'SoftwareSourceCode',
|
||||
name: 'ScobleClaw',
|
||||
description: 'Agentic engineering framework for building with AI agents',
|
||||
url: 'https://os.scoble.me/forgejo/marcus/scobleclaw',
|
||||
url: 'https://os.scoble.me/forgejo/sscoble/scobleclaw',
|
||||
},
|
||||
{
|
||||
'@type': 'CreativeWork',
|
||||
|
|
|
|||
|
|
@ -24,9 +24,11 @@ const { title, premise, takeaways, audience, slug } = Astro.props;
|
|||
</div>
|
||||
)}
|
||||
|
||||
<div class="talk-audience">
|
||||
<span class="talk-label">Ideal Audience:</span> {audience}
|
||||
</div>
|
||||
{audience && audience.trim() && (
|
||||
<div class="talk-audience">
|
||||
<span class="talk-label">Ideal Audience:</span> {audience}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{slug && (
|
||||
<a href={slug} class="talk-link">Learn more →</a>
|
||||
|
|
|
|||
|
|
@ -1,69 +0,0 @@
|
|||
---
|
||||
// TestimonialCard.astro — Placeholder testimonial card
|
||||
export interface Props {
|
||||
quote: string;
|
||||
name: string;
|
||||
role: string;
|
||||
organization?: string;
|
||||
}
|
||||
|
||||
const { quote, name, role, organization } = Astro.props;
|
||||
---
|
||||
|
||||
<figure class="testimonial-card card">
|
||||
<blockquote>
|
||||
<p>“{quote}”</p>
|
||||
</blockquote>
|
||||
<figcaption>
|
||||
<strong>{name}</strong>
|
||||
<span>{role}{organization ? `, ${organization}` : ''}</span>
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
<style>
|
||||
.testimonial-card {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.testimonial-card blockquote {
|
||||
border: none;
|
||||
padding: 0;
|
||||
margin: 0 0 var(--space-md);
|
||||
background: none;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.testimonial-card blockquote p {
|
||||
font-size: var(--size-sm);
|
||||
line-height: 1.7;
|
||||
color: var(--color-text);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.testimonial-card blockquote p::before {
|
||||
content: '"';
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-2xl);
|
||||
color: var(--color-amber);
|
||||
position: absolute;
|
||||
top: -0.25em;
|
||||
left: -0.5em;
|
||||
}
|
||||
|
||||
.testimonial-card figcaption {
|
||||
border-top: 1px solid var(--color-border-light);
|
||||
padding-top: var(--space-md);
|
||||
}
|
||||
|
||||
.testimonial-card figcaption strong {
|
||||
display: block;
|
||||
font-size: var(--size-sm);
|
||||
color: var(--color-brown);
|
||||
}
|
||||
|
||||
.testimonial-card figcaption span {
|
||||
display: block;
|
||||
font-size: var(--size-xs);
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
</style>
|
||||
|
|
@ -110,4 +110,4 @@ const currentPath = canonicalUrl || Astro.url.pathname;
|
|||
--size-4xl: 3rem;
|
||||
}
|
||||
</style>
|
||||
<!-- CI/CD test: 2026-04-28T21:06:42-07:00 -->
|
||||
|
||||
|
|
|
|||
|
|
@ -4,129 +4,393 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
|
||||
<BaseLayout
|
||||
title="Page Not Found — Scott Scoble"
|
||||
description="That page doesn't exist."
|
||||
description="That page doesn't exist. Let's get you back on track."
|
||||
pageType="home"
|
||||
>
|
||||
|
||||
<section class="error-page">
|
||||
<div class="error-content">
|
||||
<span class="error-code">404</span>
|
||||
<h1>Page not found</h1>
|
||||
<p>That link doesn't lead anywhere. Maybe it moved, maybe it never existed.</p>
|
||||
|
||||
<span class="error-code" aria-hidden="true">404</span>
|
||||
<h1>This path is fallow ground</h1>
|
||||
<p class="error-subtitle">
|
||||
Not every link leads to cultivated soil. This one hit a patch of
|
||||
<span class="accent-text">strip-mined earth</span> — nothing grows here.
|
||||
But the good news: the rest of the site is deep, fertile, and ready to explore.
|
||||
</p>
|
||||
|
||||
<!-- Site Search -->
|
||||
<div class="search-section">
|
||||
<form class="search-form" action="https://duckduckgo.com/" method="GET" target="_blank" rel="noopener">
|
||||
<label for="search-input" class="sr-only">Search scott.scoble.me</label>
|
||||
<div class="search-wrapper">
|
||||
<svg class="search-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
||||
<circle cx="11" cy="11" r="8"></circle>
|
||||
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
|
||||
</svg>
|
||||
<input
|
||||
id="search-input"
|
||||
class="search-input"
|
||||
type="search"
|
||||
name="q"
|
||||
placeholder="Search the site…"
|
||||
autocomplete="off"
|
||||
aria-label="Search scott.scoble.me"
|
||||
/>
|
||||
<input type="hidden" name="sites" value="scott.scoble.me" />
|
||||
</div>
|
||||
<button type="submit" class="search-btn">Search</button>
|
||||
</form>
|
||||
<p class="search-hint">Try searching for what you need, or pick a path below.</p>
|
||||
</div>
|
||||
|
||||
<!-- Suggested Pages -->
|
||||
<div class="suggested-links">
|
||||
<h3>Explore the site</h3>
|
||||
<h3>Popular Paths</h3>
|
||||
<ul>
|
||||
<li><a href="/speaking">Book Scott for Your Event</a></li>
|
||||
<li><a href="/consulting">AI Team Consulting</a></li>
|
||||
<li><a href="/books">Books & Publications</a></li>
|
||||
<li><a href="/about">About Scott</a></li>
|
||||
<li>
|
||||
<a href="/speaking">
|
||||
<span class="link-icon" aria-hidden="true">🎤</span>
|
||||
<span class="link-text">
|
||||
<strong>Speaking</strong>
|
||||
<span class="link-desc">Book Scott for your next event</span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/consulting">
|
||||
<span class="link-icon" aria-hidden="true">🌱</span>
|
||||
<span class="link-text">
|
||||
<strong>Consulting</strong>
|
||||
<span class="link-desc">AI team cultivation & strategy</span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/about">
|
||||
<span class="link-icon" aria-hidden="true">🧑🌾</span>
|
||||
<span class="link-text">
|
||||
<strong>About</strong>
|
||||
<span class="link-desc">Scott's story & approach</span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/books">
|
||||
<span class="link-icon" aria-hidden="true">📖</span>
|
||||
<span class="link-text">
|
||||
<strong>Books</strong>
|
||||
<span class="link-desc">Publications & writing</span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/blog">
|
||||
<span class="link-icon" aria-hidden="true">✍️</span>
|
||||
<span class="link-text">
|
||||
<strong>Blog</strong>
|
||||
<span class="link-desc">Essays on AI, leadership & cultivation</span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/contact">
|
||||
<span class="link-icon" aria-hidden="true">📬</span>
|
||||
<span class="link-text">
|
||||
<strong>Contact</strong>
|
||||
<span class="link-desc">Get in touch directly</span>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<p>Can't find what you're looking for? <a href="/contact">Get in touch</a> — I'll get back to you.</p>
|
||||
|
||||
<a href="/" class="btn-home">← Go home</a>
|
||||
|
||||
<div class="error-footer">
|
||||
<a href="/" class="btn-home">← Back to the soil</a>
|
||||
<p class="error-footnote">Even the most cultivated land has a fallow season. You're just in one now.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
.sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
.error-page {
|
||||
min-height: 70vh;
|
||||
min-height: 80vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
padding: 6rem 2rem;
|
||||
padding: 8rem 2rem 6rem;
|
||||
background: var(--color-cream);
|
||||
}
|
||||
|
||||
|
||||
.error-content {
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
|
||||
.error-code {
|
||||
display: block;
|
||||
font-family: var(--font-heading);
|
||||
font-size: 6rem;
|
||||
font-size: 8rem;
|
||||
font-weight: 700;
|
||||
color: var(--color-amber);
|
||||
opacity: 0.3;
|
||||
opacity: 0.15;
|
||||
line-height: 1;
|
||||
margin-bottom: 1rem;
|
||||
margin-bottom: 0.5rem;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
|
||||
.error-content h1 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: 2rem;
|
||||
font-size: clamp(1.75rem, 4vw, 2.25rem);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 0 0 1rem;
|
||||
margin: 0 0 1.25rem;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.error-content p {
|
||||
|
||||
.error-subtitle {
|
||||
color: var(--color-text-muted);
|
||||
margin: 0 0 2rem;
|
||||
line-height: 1.6;
|
||||
line-height: 1.7;
|
||||
font-size: 1.05rem;
|
||||
}
|
||||
|
||||
|
||||
.accent-text {
|
||||
color: var(--color-green);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* --- Search Section --- */
|
||||
.search-section {
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
.search-form {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
max-width: 480px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.search-wrapper {
|
||||
flex: 1;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.search-icon {
|
||||
position: absolute;
|
||||
left: 0.875rem;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
color: var(--color-text-muted);
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.search-input {
|
||||
width: 100%;
|
||||
padding: 0.75rem 1rem 0.75rem 2.75rem;
|
||||
border: 2px solid var(--color-border);
|
||||
border-radius: 8px;
|
||||
font-size: 0.9375rem;
|
||||
font-family: var(--font-body);
|
||||
color: var(--color-text);
|
||||
background: white;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
.search-input:focus {
|
||||
outline: none;
|
||||
border-color: var(--color-green);
|
||||
box-shadow: 0 0 0 3px rgba(61, 90, 62, 0.12);
|
||||
}
|
||||
|
||||
.search-input::placeholder {
|
||||
color: var(--color-text-muted);
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.search-btn {
|
||||
background: var(--color-green);
|
||||
color: white;
|
||||
padding: 0.75rem 1.25rem;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
font-size: 0.9375rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
transition: background 0.2s ease, transform 0.15s ease;
|
||||
}
|
||||
|
||||
.search-btn:hover {
|
||||
background: var(--color-green-dark);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.search-btn:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.search-hint {
|
||||
font-size: 0.8125rem;
|
||||
color: var(--color-text-muted);
|
||||
opacity: 0.7;
|
||||
margin: 0.75rem 0 0;
|
||||
}
|
||||
|
||||
/* --- Suggested Links --- */
|
||||
.suggested-links {
|
||||
text-align: left;
|
||||
background: white;
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem 1.75rem;
|
||||
border-radius: 10px;
|
||||
border: 1px solid var(--color-border);
|
||||
margin: 0 0 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
|
||||
.suggested-links h3 {
|
||||
font-size: 0.875rem;
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.1em;
|
||||
letter-spacing: 0.12em;
|
||||
color: var(--color-text-muted);
|
||||
margin: 0 0 1rem;
|
||||
padding-bottom: 0.75rem;
|
||||
border-bottom: 1px solid var(--color-border-light);
|
||||
}
|
||||
|
||||
|
||||
.suggested-links ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
|
||||
.suggested-links li {
|
||||
margin-bottom: 0.75rem;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
.suggested-links a {
|
||||
color: var(--color-green);
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 0.625rem;
|
||||
padding: 0.625rem 0.75rem;
|
||||
color: var(--color-brown);
|
||||
text-decoration: none;
|
||||
font-weight: 500;
|
||||
border-radius: 6px;
|
||||
transition: background 0.15s ease, color 0.15s ease;
|
||||
}
|
||||
|
||||
|
||||
.suggested-links a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.error-content a {
|
||||
background: var(--color-cream);
|
||||
color: var(--color-green);
|
||||
}
|
||||
|
||||
|
||||
.link-icon {
|
||||
flex-shrink: 0;
|
||||
font-size: 1.125rem;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.link-text {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.link-text strong {
|
||||
font-size: 0.9375rem;
|
||||
font-weight: 600;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.link-desc {
|
||||
font-size: 0.75rem;
|
||||
color: var(--color-text-muted);
|
||||
line-height: 1.3;
|
||||
margin-top: 0.125rem;
|
||||
}
|
||||
|
||||
.suggested-links a:hover .link-desc {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
/* --- Footer --- */
|
||||
.error-footer {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
.btn-home {
|
||||
display: inline-block;
|
||||
background: var(--color-amber);
|
||||
color: white;
|
||||
padding: 0.75rem 1.5rem;
|
||||
border-radius: 6px;
|
||||
padding: 0.75rem 1.75rem;
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
font-size: 0.9375rem;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
|
||||
.btn-home:hover {
|
||||
background: var(--color-amber-light);
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px rgba(200, 149, 46, 0.25);
|
||||
}
|
||||
|
||||
.error-footnote {
|
||||
font-style: italic;
|
||||
font-size: 0.875rem;
|
||||
color: var(--color-text-muted);
|
||||
opacity: 0.6;
|
||||
margin: 1.25rem 0 0;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* --- Responsive --- */
|
||||
@media (max-width: 600px) {
|
||||
.error-page {
|
||||
padding: 6rem 1.25rem 4rem;
|
||||
}
|
||||
|
||||
.error-code {
|
||||
font-size: 5rem;
|
||||
}
|
||||
|
||||
.search-form {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.search-btn {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.suggested-links ul {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.suggested-links {
|
||||
padding: 1.25rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
<p class="bio-lead">
|
||||
Scott Scoble is a builder, writer, and speaker focused on the human side of AI systems.
|
||||
He's the author of <em>The Soil Beneath the Code</em> and <em>A Walk in Mentoring</em>,
|
||||
and creator of Speckl — a dark provenance system for agentic engineering.
|
||||
and creator of Speckl — a compile-time provenance layer for regulated industries.
|
||||
He advises engineering leaders on how to build AI systems that cultivate human capability
|
||||
instead of strip-mining it.
|
||||
</p>
|
||||
|
|
@ -45,12 +45,10 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Photo placeholder - hidden until real photo exists -->
|
||||
<!--
|
||||
<div class="photo-placeholder">
|
||||
<p>📷 Photo coming soon</p>
|
||||
<!-- Photo silhouette placeholder -- hidden until a real headshot is available -->
|
||||
<div class="photo-placeholder" style="display: none;">
|
||||
<img src="/images/photo-silhouette.svg" alt="Scott Scoble" width="400" height="500" class="photo-silhouette" loading="lazy" />
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
@ -92,7 +90,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
</article>
|
||||
|
||||
<article class="project-card">
|
||||
<h3><a href="https://os.scoble.me/forgejo/marcus/scobleclaw">ScobleClaw</a></h3>
|
||||
<h3><a href="https://os.scoble.me/forgejo/sscoble/scobleclaw">ScobleClaw</a></h3>
|
||||
<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>
|
||||
|
||||
|
|
@ -133,7 +131,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
|
||||
.bio-section .section-container {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-columns: 1fr 300px;
|
||||
gap: 3rem;
|
||||
align-items: start;
|
||||
}
|
||||
|
|
@ -188,15 +186,16 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
|
||||
.photo-placeholder {
|
||||
background: var(--color-cream-warm);
|
||||
border-radius: 8px;
|
||||
padding: 4rem 2rem;
|
||||
border-radius: 12px;
|
||||
padding: 1rem;
|
||||
text-align: center;
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.photo-placeholder p {
|
||||
font-size: 1.25rem;
|
||||
margin: 0;
|
||||
.photo-silhouette {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.books-section {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
---
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import NewsletterSignup from '../components/NewsletterSignup.astro';
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
|
|
@ -19,6 +20,58 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
<section class="posts">
|
||||
<div class="posts-container">
|
||||
|
||||
<article class="post-card">
|
||||
<a href="/blog/50-first-dates-with-ai" class="post-link">
|
||||
<div class="post-meta">
|
||||
<span class="post-date">May 24, 2026</span>
|
||||
<span class="post-tag">AI</span>
|
||||
</div>
|
||||
<h2>50 First Dates with AI: Why Your AI Forgets Everything and What to Do About It</h2>
|
||||
<p class="post-excerpt">
|
||||
Every conversation with most AI systems is a first date. Here's the three-layer memory model that actually compounds — from Scott Scoble's scobleclaw experience.
|
||||
</p>
|
||||
</a>
|
||||
</article>
|
||||
|
||||
<article class="post-card">
|
||||
<a href="/blog/strip-mining-cultivation" class="post-link">
|
||||
<div class="post-meta">
|
||||
<span class="post-date">May 18, 2026</span>
|
||||
<span class="post-tag">Leadership</span>
|
||||
</div>
|
||||
<h2>Stop Strip-Mining Your Engineers: The Cultivation Alternative to Throughput Obsession</h2>
|
||||
<p class="post-excerpt">
|
||||
Gallup 2026: 80% of the global workforce is disengaged. The $438B cost isn't a tool problem; it's a people problem. Here's the cultivation alternative.
|
||||
</p>
|
||||
</a>
|
||||
</article>
|
||||
|
||||
<article class="post-card">
|
||||
<a href="/blog/soil-health-teams" class="post-link">
|
||||
<div class="post-meta">
|
||||
<span class="post-date">May 18, 2026</span>
|
||||
<span class="post-tag">Leadership</span>
|
||||
</div>
|
||||
<h2>Soil Health for Teams: A Diagnostic Framework for What's Actually Depleted</h2>
|
||||
<p class="post-excerpt">
|
||||
Tall stalks, ground cover, nitrogen fixers, pollinators, deep roots. The agricultural metaphor isn't poetic; it's diagnostic. Here's how to read the soil under your team.
|
||||
</p>
|
||||
</a>
|
||||
</article>
|
||||
|
||||
<article class="post-card">
|
||||
<a href="/blog/30-years-software" class="post-link">
|
||||
<div class="post-meta">
|
||||
<span class="post-date">May 18, 2026</span>
|
||||
<span class="post-tag">Engineering</span>
|
||||
</div>
|
||||
<h2>From QA to Principal: What 30 Years of Software Teaches You About Humans</h2>
|
||||
<p class="post-excerpt">
|
||||
I started writing code in 1985. I started getting paid for it in 1996. The tech stacks changed; the human patterns didn't. Here's what three decades teaches you when you pay attention to the people, not just the code.
|
||||
</p>
|
||||
</a>
|
||||
</article>
|
||||
|
||||
<article class="post-card">
|
||||
<a href="/blog/spec-first-audit-surface" class="post-link">
|
||||
<div class="post-meta">
|
||||
|
|
@ -58,6 +111,19 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
</a>
|
||||
</article>
|
||||
|
||||
<article class="post-card">
|
||||
<a href="/blog/ai-has-amnesia" class="post-link">
|
||||
<div class="post-meta">
|
||||
<span class="post-date">May 18, 2026</span>
|
||||
<span class="post-tag">AI</span>
|
||||
</div>
|
||||
<h2>Your AI Has Amnesia: Why Memory Architecture Is the Hardest Problem in Agentic Systems</h2>
|
||||
<p class="post-excerpt">
|
||||
The anterograde amnesia metaphor for AI memory architecture. Three-layer memory model for agentic systems from Scott Scoble's scobleclaw experience.
|
||||
</p>
|
||||
</a>
|
||||
</article>
|
||||
|
||||
<article class="post-card">
|
||||
<a href="/blog/agentic-wars" class="post-link">
|
||||
<div class="post-meta">
|
||||
|
|
@ -178,6 +244,8 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<NewsletterSignup title="Stay Cultivated" description="New articles on AI, leadership, and cultivation. No spam. No AI-generated content. Just the soil report." />
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
|
|
|
|||
264
src/pages/blog/30-years-software.astro
Normal file
|
|
@ -0,0 +1,264 @@
|
|||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import NewsletterSignup from '../../components/NewsletterSignup.astro';
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
title="From QA to Principal: What 30 Years of Software Teaches You About Humans"
|
||||
description="Scott Scoble's 30-year software career arc from QA to principal engineer. The human patterns that repeat regardless of tech stack."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/30-years-software"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="article">
|
||||
<header class="article-header">
|
||||
<div class="article-meta">
|
||||
<span class="article-date">May 18, 2026</span>
|
||||
<span class="article-tag">Engineering</span>
|
||||
</div>
|
||||
<h1>From QA to Principal: What 30 Years of Software Teaches You About Humans</h1>
|
||||
<p class="article-subtitle">
|
||||
I started writing code in 1985. I started getting paid for it in 1996. The tech stacks changed; the human patterns didn't. Here's what three decades teaches you when you pay attention to the people, not just the code.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div class="article-body">
|
||||
<p>I started writing code in 1985.</p>
|
||||
|
||||
<p>I was twelve, on a Commodore 64, copying BASIC programs out of magazines and wondering why changing one line made the whole thing stop working. The screen was green. The storage was a cassette tape. The concept of "the cloud" would have sounded like science fiction.</p>
|
||||
|
||||
<p>I started getting paid for it in 1996.</p>
|
||||
|
||||
<p>That first paycheck felt like a mistake. Someone was going to give me money to do what I did for free on weekends? The answer, I learned, was yes — but only because what I did for free on weekends turned out to be rarer than I thought. Not the coding; the caring. The willingness to sit with a broken system until you understood why it broke.</p>
|
||||
|
||||
<p>Thirty years later, the tools have changed beyond recognition. The human patterns haven't.</p>
|
||||
|
||||
<h2>The Arc</h2>
|
||||
|
||||
<p>My career didn't follow a ladder. It followed a river — meandering, sometimes doubling back, occasionally plunging through rapids I didn't choose.</p>
|
||||
|
||||
<p>I started in QA. Not because I planned to; because that's where there was an opening. I learned something important there that engineers who skip QA never learn: the difference between "it works" and "it's correct." Working is observable; correctness requires thinking about what isn't there. Edge cases, failure modes, the user's actual intent versus the spec's assumed intent.</p>
|
||||
|
||||
<p>From QA I moved into development, then into architecture, then into the fuzzy space where technical decisions and organizational decisions become the same thing. The title that eventually stuck was "principal engineer," but the work was never about the title. It was about the pattern: seeing systems, human and technical, whole enough to make choices that don't solve today's problem at tomorrow's expense.</p>
|
||||
|
||||
<p>Along the way I built things that shipped and things that didn't. I worked on teams that hummed and teams that imploded. I learned Nix, Kubernetes, compliance-as-code, and a dozen other technologies that will sound dated by the time you read this. And I kept noticing that the successes and failures had less to do with the stack than with the soil underneath it.</p>
|
||||
|
||||
<h2>What Doesn't Change</h2>
|
||||
|
||||
<p>Here are the human patterns that repeat regardless of whether you're writing COBOL or Rust, deploying to mainframes or serverless edge functions:</p>
|
||||
|
||||
<p><strong>People optimize for what gets measured.</strong></p>
|
||||
<p>This is the oldest pattern in software and the hardest to escape. You measure velocity, you get fast code that breaks in production. You measure test coverage, you get tests that cover lines but not intent. You measure commits, you get small meaningless changes that game the metric.</p>
|
||||
<p>I've watched this pattern destroy quality in every decade. The fix isn't better metrics; it's better judgment about which metrics matter and the courage to ignore the ones that don't. That's a people problem, not a tooling problem.</p>
|
||||
|
||||
<p><strong>Complexity is a loan with compounding interest.</strong></p>
|
||||
<p>Every shortcut, every abstraction leak, every "we'll fix this later" is a loan. The interest rate is higher than you think, and it compounds. I've inherited systems where the technical debt was so deep that adding a simple feature required touching fourteen files in seven services. The original authors weren't stupid; they were under pressure. The pressure won.</p>
|
||||
<p>What I've learned: the teams that survive are the ones where someone has the authority and the stubbornness to say no to complexity before it becomes structural. Usually that person is unpopular until everyone else realizes they were right.</p>
|
||||
|
||||
<p><strong>Communication bandwidth is the real bottleneck.</strong></p>
|
||||
<p>Not CPU. Not network. Not database throughput. The limit on every project I've ever worked on was how fast the right information got to the right person.</p>
|
||||
<p>A requirement misunderstood for three weeks is more expensive than a slow query. An architectural decision made in isolation and reversed two months later is more expensive than a server outage. A team that doesn't know what the adjacent team is building is more expensive than any technical constraint.</p>
|
||||
<p>The senior engineers I respect most aren't the fastest coders. They're the ones who know when to stop coding and start talking.</p>
|
||||
|
||||
<p><strong>Authority without accountability corrupts; accountability without authority paralyzes.</strong></p>
|
||||
<p>I've been in organizations where engineers had no say in what they built. I've been in organizations where they had say but no ownership of the result. Both are broken in different directions.</p>
|
||||
<p>The healthiest teams I've worked on had clear authority boundaries and clear accountability. You owned this; you decided that; you were responsible for the outcome. Ambiguity in either direction created the politics that technical people pretend to hate but are actually terrible at.</p>
|
||||
|
||||
<p><strong>The best engineers are gardeners, not builders.</strong></p>
|
||||
<p>This took me years to see. The engineers who leave lasting value don't just write code; they cultivate the conditions for other people to write better code. They clean up the codebase incrementally. They write the documentation that saves the next person six hours. They refactor the module that everyone else is afraid to touch.</p>
|
||||
<p>This work is invisible in sprint reviews. It shows up in velocity six months later when the team is suddenly moving faster and nobody can point to why. The engineer who did it is usually working on something else by then.</p>
|
||||
|
||||
<h2>Beyond the Prompt</h2>
|
||||
|
||||
<p>Lately I've been working on AI systems — not using them, but thinking about how to build with them. The <code>beyond-the-prompt</code> repo is my attempt to treat AI skills as software modules: composable, testable, versioned.</p>
|
||||
|
||||
<p>What I've learned there connects back to everything else. The prompt is the interface, but the architecture is what determines whether the system works. Context management is memory. Evaluation is quality assurance. Progressive disclosure is user experience design.</p>
|
||||
|
||||
<p>The tools are new; the patterns are ancient. Every generation of technologists thinks they're the first to face integration complexity, context management, or the gap between what the user asked for and what they actually need. We're not. We're just using different vocabulary.</p>
|
||||
|
||||
<p>The containerless work — deploying Nix closures instead of containers — is another example. The specific technology (Nix, Kubernetes, registries) is 2020s. The underlying question (how do we package and deploy software reliably?) is 1960s. The human challenge (getting teams to change how they work) is timeless.</p>
|
||||
|
||||
<h2>What I Got Wrong</h2>
|
||||
|
||||
<p>Thirty years includes a lot of wrong turns. Here are some I can name:</p>
|
||||
|
||||
<p>I once optimized a system for performance metrics that turned out to matter to no actual user. The numbers were beautiful; the experience was worse. I learned that metrics require validation against reality, not just internal consistency.</p>
|
||||
|
||||
<p>I once pushed a technical decision through despite team resistance because I was convinced I was right. I was right about the technology and wrong about the timing. The implementation worked; the adoption failed. I learned that correctness without timing is incomplete.</p>
|
||||
|
||||
<p>I once stayed too long in a role because the title was flattering and the work was familiar. I stopped growing; I started extracting. I learned that the best signal it's time to leave is when you can do the job without thinking.</p>
|
||||
|
||||
<p>I once believed that better tools would solve organizational problems. They don't. Tools amplify existing patterns. Healthy organizations get healthier with good tools; dysfunctional ones get more efficiently dysfunctional.</p>
|
||||
|
||||
<h2>What I Still Believe</h2>
|
||||
|
||||
<p>Despite the wrong turns, some convictions have deepened:</p>
|
||||
|
||||
<p>Software is a team sport played by people who often wish it wasn't. The best code I've written was improved by someone else's eyes. The worst code I've written was written alone, late at night, under pressure.</p>
|
||||
|
||||
<p>The user is not stupid; the user is busy. Every interface that assumes user stupidity is actually hiding designer laziness. Every system that requires the user to "just" do something complex is pushing cost onto the wrong side of the boundary.</p>
|
||||
|
||||
<p>Technical debt is a moral problem, not just a technical one. When we leave messes for others to clean, we're choosing our convenience over their time. The codebase is a shared space; leaving it worse than you found it is a small act of extraction.</p>
|
||||
|
||||
<p>Learning compounds. The engineer who reads broadly — outside software, outside their specialty — makes connections that the narrowly focused engineer can't. The domain knowledge, the historical context, the adjacent discipline: these aren't distractions. They're the nutrients.</p>
|
||||
|
||||
<h2>The Stack Is Temporary; the Patterns Are Permanent</h2>
|
||||
|
||||
<p>If you're early in your career, here's what I'd tell you: don't chase the stack. Chase the patterns.</p>
|
||||
|
||||
<p>The frameworks you're learning today will be obsolete in a decade. The cloud provider you're certifying on will change its API, its pricing model, its entire approach. The language that's hot now will be legacy or dead in fifteen years.</p>
|
||||
|
||||
<p>But the patterns — how complexity grows, how communication breaks down, how authority and accountability need to match, how good work is invisible and bad work is loud — these don't change. Learn them once and you'll recognize them in every new technology.</p>
|
||||
|
||||
<p>The senior engineer's real job isn't knowing more syntax. It's seeing the pattern earlier and naming it clearly enough that others can see it too.</p>
|
||||
|
||||
<h2>Still Walking</h2>
|
||||
|
||||
<p>I'm not done. The Nix work, the AI skills, the multi-agent system, the book, the talks — these aren't a retirement portfolio. They're the current crop. The soil underneath them is thirty years of patterns, failures, and the occasional insight that held up longer than I expected.</p>
|
||||
|
||||
<p>The technology will keep changing. The human patterns will keep repeating. The work is to notice which is which, and to cultivate the conditions where good work can grow regardless of what stack it happens in.</p>
|
||||
|
||||
<p>That's what thirty years teaches you. Not how to code better; how to see more clearly. The code is just the medium.</p>
|
||||
</div>
|
||||
|
||||
<footer class="article-footer">
|
||||
<div class="article-cta">
|
||||
<p>Want to continue this conversation? <a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">Connect with me on LinkedIn</a> — I write about the human side of AI and what to do about it.</p>
|
||||
</div>
|
||||
</footer>
|
||||
</article>
|
||||
|
||||
<NewsletterSignup />
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
.article {
|
||||
padding: 12rem 2rem 6rem;
|
||||
background: var(--color-cream);
|
||||
}
|
||||
|
||||
.article-header {
|
||||
max-width: 720px;
|
||||
margin: 0 auto 3rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.article-meta {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.article-date {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.article-tag {
|
||||
color: var(--color-amber);
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.article-header h1 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: clamp(2rem, 4vw, 3rem);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 0 0 1rem;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.article-subtitle {
|
||||
font-size: var(--size-lg);
|
||||
color: var(--color-text-muted);
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.article-body {
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
font-size: var(--size-md);
|
||||
line-height: 1.8;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.article-body h2 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-2xl);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 3rem 0 1rem;
|
||||
}
|
||||
|
||||
.article-body h3 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-xl);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 2.5rem 0 0.75rem;
|
||||
}
|
||||
|
||||
.article-body p {
|
||||
margin: 0 0 1.25rem;
|
||||
}
|
||||
|
||||
.article-body a {
|
||||
color: var(--color-green);
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
}
|
||||
|
||||
.article-body a:hover {
|
||||
color: var(--color-green-dark);
|
||||
}
|
||||
|
||||
.article-body strong {
|
||||
color: var(--color-brown-dark);
|
||||
}
|
||||
|
||||
.article-body code {
|
||||
background: var(--color-gray-100);
|
||||
padding: 0.125rem 0.375rem;
|
||||
border-radius: 4px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.article-footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.article-footer hr {
|
||||
border: none;
|
||||
border-top: 1px solid var(--color-border);
|
||||
margin: 0 0 2rem;
|
||||
}
|
||||
|
||||
.article-cta {
|
||||
text-align: center;
|
||||
font-size: var(--size-sm);
|
||||
color: var(--color-text-muted);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.article-cta a {
|
||||
color: var(--color-green);
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.article {
|
||||
padding: 6rem 1.25rem 4rem;
|
||||
}
|
||||
|
||||
.article-header h1 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.article-body {
|
||||
font-size: var(--size-base);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
216
src/pages/blog/50-first-dates-with-ai.astro
Normal file
|
|
@ -0,0 +1,216 @@
|
|||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import NewsletterSignup from '../../components/NewsletterSignup.astro';
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
title="50 First Dates with AI: Why Your AI Forgets Everything and What to Do About It"
|
||||
description="Current AI memory architecture is anterograde amnesia — every session is a first date. Here's the three-layer memory model that actually compounds, from Scott Scoble's scobleclaw experience."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/50-first-dates-with-ai"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
<header class="post-header">
|
||||
<div class="post-meta">
|
||||
<span class="post-date">May 24, 2026</span>
|
||||
<span class="post-tag">AI</span>
|
||||
</div>
|
||||
<h1>50 First Dates with AI: Why Your AI Forgets Everything and What to Do About It</h1>
|
||||
<p class="post-subtitle">
|
||||
Every conversation with most AI systems is a first date. You explain your codebase. You define your conventions. You correct the same misunderstanding three times. And when you come back tomorrow, it's 2004 again — Drew Barrymore wakes up with no memory of who you are.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div class="post-content">
|
||||
|
||||
<p>That's anterograde amnesia. The brain can't form new long-term memories. Every interaction is fresh. Everything you've built together — the corrections, the preferences, the evolving understanding of your domain — evaporates when the session ends.</p>
|
||||
|
||||
<p>I built a talk around this metaphor: <em>50 First Dates with AI</em>. The response was immediate because the problem is universal. Everyone who's used an AI assistant for real work has felt the frustration. Everyone who's tried to build an agentic system has hit the wall.</p>
|
||||
|
||||
<p>The wall is memory architecture. And it's the hardest problem in agentic systems because it's not a single problem; it's three problems stacked on top of each other, each pretending to be the other.</p>
|
||||
|
||||
<h2>The 50 First Dates Problem</h2>
|
||||
|
||||
<p>In the movie <em>50 First Dates</em>, Drew Barrymore's character Lucy has anterograde amnesia. Every morning she wakes up and yesterday never happened. Her family adapts by leaving her notes, updating a whiteboard, re-explaining the same things every day. It's loving; it's also exhausting.</p>
|
||||
|
||||
<p>This is exactly how most AI systems work. They record VHS tapes (context windows) every night and hope the agent can reconstruct enough context to be functional the next morning. The context window is the whiteboard. The system prompt is the morning briefing. And every single day, it's groundhog day.</p>
|
||||
|
||||
<p>We built agentic systems with anterograde amnesia — not because we couldn't do better, but because it was easier than building systems that actually learn. Session-based memory is simple. It doesn't require state management, storage decisions, or curation. It just resets.</p>
|
||||
|
||||
<p>But resetting is not remembering. And remembering is what makes systems compound.</p>
|
||||
|
||||
<h2>The Three-Layer Memory Model</h2>
|
||||
|
||||
<p>I've been running scobleclaw — my multi-agent system — long enough to know that memory isn't a feature you add later. It's the foundation everything else sits on. Get it wrong and your agents are expensive interns who need retraining every morning. Get it right and they compound.</p>
|
||||
|
||||
<p>Here's the model that emerged from real operation, not from a whitepaper:</p>
|
||||
|
||||
<h3>Layer 1: Compound Memory (The Journal)</h3>
|
||||
|
||||
<p>This is the raw log of what happened. Every interaction, every decision, every correction, every output. Unstructured, chronological, append-only.</p>
|
||||
|
||||
<p>In scobleclaw, every agent interaction writes to a daily note. Not a database table; a markdown file. Why markdown? Because it's human-readable, because it survives format changes, because in 2030 I can still open it and understand what happened. The journal is for me as much as for the agents.</p>
|
||||
|
||||
<p>The key discipline with compound memory: write everything down, but don't expect the agents to read it raw. That's Layer 2's job.</p>
|
||||
|
||||
<h3>Layer 2: Semantic Recall (The Index)</h3>
|
||||
|
||||
<p>If the journal is a library, semantic recall is the card catalog. Not the books themselves; the <em>relationships</em> between ideas.</p>
|
||||
|
||||
<p>This is where embeddings and vector search come in. The journal gets chunked, embedded, and indexed so that when an agent asks "what have we said about mentoring frameworks?" it doesn't have to read six months of daily notes. It queries the index and gets the relevant passages.</p>
|
||||
|
||||
<p>But here's the trap: semantic recall without curation is just faster amnesia. You can retrieve more fragments, but you're still retrieving fragments. The index needs maintenance. It needs promotion (what matters enough to keep near the top). It needs decay (what's no longer relevant).</p>
|
||||
|
||||
<p>I run a nightly process — REM sleep, I call it — that scans the day's journal, identifies patterns, and promotes significant observations to long-term memory. Without this curation step, the index bloats. You get 500 "relevant" results for every query and none of them matter.</p>
|
||||
|
||||
<h3>Layer 3: Coach Evaluation (The Mirror)</h3>
|
||||
|
||||
<p>This is the layer almost nobody builds. It's also the one that makes the difference between a system that works and a system that learns.</p>
|
||||
|
||||
<p>Every agent in scobleclaw gets evaluated. Not by me directly — I don't have time to review every interaction — but by a coach agent that watches patterns over time. Did this agent complete what it said it would? Did it use the right tools? Did it match the human's voice when drafting content?</p>
|
||||
|
||||
<p>The coach writes evaluations back to the journal, which feeds the index, which influences future behavior. It's a feedback loop, but a slow one. The coach doesn't intervene in real time; it reflects after the fact. That's intentional. Real-time coaching is micromanagement. Post-hoc coaching is mentorship.</p>
|
||||
|
||||
<h2>Why Most Memory Solutions Fail</h2>
|
||||
|
||||
<p>You'd think memory is a solved problem. We have databases, vector stores, logging systems. Why is this still the bottleneck?</p>
|
||||
|
||||
<p><strong>Compound memory fails when it's not human-legible.</strong> Most systems store agent interactions as structured logs or database rows. The human can't read them without a query. When the human can't read them, the human can't correct them. When the human can't correct them, the system learns the wrong lessons.</p>
|
||||
|
||||
<p><strong>Semantic recall fails when it's not curated.</strong> Vector search is magical until it isn't. Without editorial judgment — what to promote, what to decay, what to connect — the index becomes a junk drawer. Every query returns 47 "relevant" fragments and the actual insight is fragment #38.</p>
|
||||
|
||||
<p><strong>Coach evaluation fails when there's no feedback loop.</strong> Evaluations that don't change behavior are performance reviews, not coaching. The coach has to write to the journal; the journal has to feed the index; the index has to influence future prompts. Any break in that chain and you have theater, not improvement.</p>
|
||||
|
||||
<h2>Building for Compounding, Not Resetting</h2>
|
||||
|
||||
<p>The goal isn't an AI that remembers everything. The goal is an AI where today's work makes tomorrow's work better.</p>
|
||||
|
||||
<p>That's compounding. And compounding requires memory that gets richer over time, not just bigger. Bigger is easy; richer is hard.</p>
|
||||
|
||||
<p>If you're building agentic systems, start here. Before you worry about tools, agents, workflows, or orchestration, ask: what does this system remember? How does it recall? How does it improve?</p>
|
||||
|
||||
<p>Get memory right and everything else gets easier. Get it wrong and you're dating Drew Barrymore forever.</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<p><em>This article is adapted from Scott Scoble's keynote <a href="/speaking/50-first-dates">50 First Dates with AI</a>. Interested in having Scott deliver this talk at your event? <a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">Connect on LinkedIn</a></em></p>
|
||||
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<NewsletterSignup title="Get the Soil Report" description="New articles on AI, leadership, and cultivation delivered to your inbox. No spam. No AI-generated content. Just the soil report." />
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
.post {
|
||||
padding: 12rem 2rem 6rem;
|
||||
background: var(--color-cream);
|
||||
}
|
||||
|
||||
.post-header {
|
||||
max-width: 720px;
|
||||
margin: 0 auto 3rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.post-meta {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.post-date {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.post-tag {
|
||||
color: var(--color-amber);
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.post-header h1 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: clamp(2rem, 4vw, 3rem);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 0 0 1rem;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.post-subtitle {
|
||||
font-size: var(--size-lg);
|
||||
color: var(--color-text-muted);
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.post-content {
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
font-size: var(--size-md);
|
||||
line-height: 1.8;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.post-content h2 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-2xl);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 3rem 0 1rem;
|
||||
}
|
||||
|
||||
.post-content h3 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-xl);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 2.5rem 0 0.75rem;
|
||||
}
|
||||
|
||||
.post-content p {
|
||||
margin: 0 0 1.25rem;
|
||||
}
|
||||
|
||||
.post-content a {
|
||||
color: var(--color-green);
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
}
|
||||
|
||||
.post-content a:hover {
|
||||
color: var(--color-green-dark);
|
||||
}
|
||||
|
||||
.post-content strong {
|
||||
color: var(--color-brown-dark);
|
||||
}
|
||||
|
||||
.post-content em {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.post-content hr {
|
||||
border: none;
|
||||
border-top: 1px solid var(--color-border);
|
||||
margin: 3rem 0;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.post {
|
||||
padding: 6rem 1.25rem 4rem;
|
||||
}
|
||||
|
||||
.post-header h1 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.post-content {
|
||||
font-size: var(--size-base);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -4,9 +4,10 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
|
||||
<BaseLayout
|
||||
title="You're Already in the Agentic Wars"
|
||||
description="Are your capabilities compounding, or are you being extracted from? Big Tech agents compound theirs. Yours can too — if you own them."
|
||||
description="Meta has Hatch. Google has Remy. Everyone is building agents. Whose capability compounds?"
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/agentic-wars"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="Your brain is reconfiguring from intonation to orchestration. That hurts. That doesn't mean it's broken. Discomfort ≠ damage."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/ai-brain-fry"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="AI doesn't just change work — it exposes what kind of leader you already were. The cultivation test: give your team AI tools and watch what happens."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/ai-exposes-leaders-cultivation-test"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import NewsletterSignup from '../../components/NewsletterSignup.astro';
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
|
|
@ -119,6 +120,8 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
</div>
|
||||
</article>
|
||||
|
||||
<NewsletterSignup />
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="Who gives a crap about things that are never used."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/devex-shift"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="Gallup says 80% of the workforce is disengaged. The numbers are real; the premise is wrong. It's not engagement that's missing; it's soil."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/gallup-disengagement"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="The highest-ROI activity in your organization is the one you canceled first. Mentorship compounds in ways no feature ship ever will."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/mentorship-isnt-latency-its-leverage"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -4,9 +4,10 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
|
||||
<BaseLayout
|
||||
title="My Open Source Projects: Speckl, ScobleClaw, and Beyond the Prompt"
|
||||
description="A roundup of Scott Scoble's open-source projects — Speckl (spec compiler with provenance), ScobleClaw (agentic engineering framework), and Beyond the Prompt (workshop on building with AI agents)."
|
||||
description="A roundup of Scott Scoble's open-source projects — Speckl, ScobleClaw, and Beyond the Prompt."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/open-source-projects"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
@ -38,7 +39,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
|
||||
<h2>ScobleClaw — Agentic Engineering Framework</h2>
|
||||
|
||||
<p><strong><a href="https://os.scoble.me/forgejo/marcus/scobleclaw">ScobleClaw</a></strong> is a monorepo of agentic engineering patterns that I use daily. It's the shared infrastructure across all my projects — subagent dispatch, skill-based development, and provenance tracking for AI agent workflows.</p>
|
||||
<p><strong><a href="https://os.scoble.me/forgejo/sscoble/scobleclaw">ScobleClaw</a></strong> is a monorepo of agentic engineering patterns that I use daily. It's the shared infrastructure across all my projects — subagent dispatch, skill-based development, and provenance tracking for AI agent workflows.</p>
|
||||
|
||||
<p>This is the layer between "talk to an LLM" and "run an AI-augmented engineering operation." ScobleClaw codifies patterns that make agentic work repeatable, auditable, and composable.</p>
|
||||
|
||||
|
|
@ -56,7 +57,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
|
||||
<ul>
|
||||
<li><strong>Speckl</strong> — <a href="https://speckl.scoble.me">speckl.scoble.me</a> / <a href="https://os.scoble.me/forgejo/sscoble/speckl">source</a></li>
|
||||
<li><strong>ScobleClaw</strong> — <a href="https://os.scoble.me/forgejo/marcus/scobleclaw">source</a></li>
|
||||
<li><strong>ScobleClaw</strong> — <a href="https://os.scoble.me/forgejo/sscoble/scobleclaw">source</a></li>
|
||||
<li><strong>Beyond the Prompt</strong> — <a href="https://os.scoble.me/forgejo/sscoble/beyond-the-prompt">source</a></li>
|
||||
<li><strong>Brand Site</strong> — <a href="https://scott.scoble.me">scott.scoble.me</a> / <a href="https://os.scoble.me/forgejo/sscoble/brand-site">source</a></li>
|
||||
</ul>
|
||||
|
|
|
|||
|
|
@ -4,9 +4,10 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
|
||||
<BaseLayout
|
||||
title="We're Going to Formally Verify SQLite"
|
||||
description="SQLite runs on every smartphone, every browser, every embedded system. Its core state machines have never been formally verified. We're going to fix that."
|
||||
description="SQLite runs on every smartphone, every browser, every embedded system. Its core state machines have never been formally verified."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/prove-sqlite"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
284
src/pages/blog/soil-health-teams.astro
Normal file
|
|
@ -0,0 +1,284 @@
|
|||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import NewsletterSignup from '../../components/NewsletterSignup.astro';
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
title="Soil Health for Teams: A Diagnostic Framework for What's Actually Depleted"
|
||||
description="The four soil nutrients diagnostic framework for engineering team health. From Scott Scoble's talk, The Soil Under Your Team."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/soil-health-teams"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="article">
|
||||
<header class="article-header">
|
||||
<div class="article-meta">
|
||||
<span class="article-date">May 18, 2026</span>
|
||||
<span class="article-tag">Leadership</span>
|
||||
</div>
|
||||
<h1>Soil Health for Teams: A Diagnostic Framework for What's Actually Depleted</h1>
|
||||
<p class="article-subtitle">
|
||||
Tall stalks, ground cover, nitrogen fixers, pollinators, deep roots. The agricultural metaphor isn't poetic; it's diagnostic. Here's how to read the soil under your team.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div class="article-body">
|
||||
<p>Every engineering team has soil underneath it.</p>
|
||||
|
||||
<p>Not metaphorical soil; real soil. The accumulated conditions — cultural, structural, relational — that determine what can grow there and what can't. Most teams don't know their soil type. They know their output. They know their velocity. They know whether this quarter's roadmap shipped. But the soil? They assume it's fine until something dies.</p>
|
||||
|
||||
<p>The agricultural metaphor isn't poetic; it's diagnostic. Farmers don't wait for the crop to fail before checking the soil. They test it, they amend it, they rotate it. They know that the visible plant is the last indicator, not the first.</p>
|
||||
|
||||
<p>I developed this framework from a talk I gave called <em>The Soil Under Your Team</em>. It started as a way to make the cultivation concept concrete, and it turned into something I use every time I walk into a new organization.</p>
|
||||
|
||||
<h2>The Four Nutrients</h2>
|
||||
|
||||
<p>Healthy soil requires four things. Deplete any one of them and the whole system weakens. Deplete two and you're in crisis. Deplete three and you're wondering why nobody told you the team was dying.</p>
|
||||
|
||||
<h3>Nutrient One: Tall Stalks (Technical Excellence)</h3>
|
||||
|
||||
<p>In a field, tall stalks are the visible sign of health. In a team, they're the engineers who can solve the hard problems, who know the system deeply, who make the rest of the team better by proximity.</p>
|
||||
|
||||
<p>Tall stalks aren't just your senior engineers. They're the people who raise the ceiling for everyone else. When they leave, the whole field gets shorter. When they're depleted, the whole field gets weaker.</p>
|
||||
|
||||
<p>Here's what depletes tall stalks: using them as the answer to every hard problem instead of growing more tall stalks. The "let's ask Sarah" pattern where Sarah becomes the bottleneck, the crutch, the person who can't take a vacation because the system relies on her being available.</p>
|
||||
|
||||
<p>Cultivation means identifying your tall stalks and asking: are we growing more, or are we burning the ones we have?</p>
|
||||
|
||||
<h3>Nutrient Two: Ground Cover (Psychological Safety)</h3>
|
||||
|
||||
<p>Ground cover prevents erosion. It holds the soil in place during storms. In teams, psychological safety is what keeps people from leaving when things get hard.</p>
|
||||
|
||||
<p>Not comfort. Not absence of conflict. Safety. The confidence that you can say "I don't know" without penalty. That you can raise a concern without retribution. That you can fail without becoming a failure.</p>
|
||||
|
||||
<p>Teams with poor ground cover erode fast. One bad quarter, one difficult reorg, one toxic hire, and the soil starts washing away. People don't leave because of the storm; they leave because the soil wasn't held in place.</p>
|
||||
|
||||
<p>Ground cover is built in small moments. The manager who responds to a missed deadline with "what do we need to fix?" instead of "what went wrong?" The senior engineer who admits uncertainty in a meeting. The team ritual that celebrates learning from failure.</p>
|
||||
|
||||
<p>These moments seem trivial in isolation. They're the difference between a team that weathers storms and one that washes away.</p>
|
||||
|
||||
<h3>Nutrient Three: Nitrogen Fixers (Knowledge Transfer)</h3>
|
||||
|
||||
<p>In agriculture, nitrogen fixers are plants that improve the soil for others. Legumes pull nitrogen from the air and make it available to neighboring plants. In teams, nitrogen fixers are the people who make others better through proximity.</p>
|
||||
|
||||
<p>They're not always the best engineers. Sometimes they're the best teachers. The person who writes documentation that actually gets read. The person who answers questions in public channels so the answers accumulate. The person who pairs with juniors not as a burden but as a practice.</p>
|
||||
|
||||
<p>Nitrogen fixers are invisible in most performance reviews because their impact is indirect. They make the soil richer for everyone else. Remove them and the whole field starves slowly, nobody knows why.</p>
|
||||
|
||||
<p>Organizations that optimize for individual heroics deplete their nitrogen fixers. Why fix the soil when you can just hire more fertilizer? But fertilizer runs out. Nitrogen fixers compound.</p>
|
||||
|
||||
<h3>Nutrient Four: Pollinators (Cross-Functional Connection)</h3>
|
||||
|
||||
<p>Pollinators move between plants, carrying what one has to what another needs. In teams, they're the people who bridge silos. The engineer who understands product context. The PM who can read architecture diagrams. The designer who speaks fluent API.</p>
|
||||
|
||||
<p>Pollinators are deceptively powerful because they make the system coherent. Without them, each function optimizes locally and the overall product becomes incoherent. Engineering ships fast features that product didn't prioritize. Product asks for things engineering can't build. Design creates experiences that don't match technical constraints.</p>
|
||||
|
||||
<p>The cost of poor pollination isn't visible in any single team's metrics. It shows up in the product. In the user experience. In the technical debt that accumulates because nobody was carrying context between decisions.</p>
|
||||
|
||||
<p>Pollinators need time to move between functions. That time looks like overhead to managers optimizing for individual utilization. It's not overhead; it's architecture.</p>
|
||||
|
||||
<h2>The Deep Roots Layer</h2>
|
||||
|
||||
<p>There's a fifth element that doesn't show up in the four nutrients because it's not a nutrient; it's the foundation.</p>
|
||||
|
||||
<p>Deep roots.</p>
|
||||
|
||||
<p>In agriculture, deep roots access water and minerals that surface roots can't reach. They anchor the plant against wind. They're invisible most of the time; you only see them when you dig or when the storm comes.</p>
|
||||
|
||||
<p>In teams, deep roots are the accumulated trust, shared history, and mutual understanding that lets a team move fast without breaking things. You can't build deep roots in a quarter. You can't hire them. You grow them, slowly, by staying together through hard things.</p>
|
||||
|
||||
<p>Teams that reorg every six months never develop deep roots. Teams that treat people as interchangeable resources never develop deep roots. Teams that optimize for short-term flexibility sacrifice the long-term stability that deep roots provide.</p>
|
||||
|
||||
<p>The organization that rotates people every 18 months for "career development" is harvesting the crop and wondering why the soil gets poorer every year.</p>
|
||||
|
||||
<h2>Reading Your Soil</h2>
|
||||
|
||||
<p>Here's the diagnostic. Ask these questions honestly:</p>
|
||||
|
||||
<p><strong>Tall stalks:</strong> Who raises the ceiling for this team? Are we growing more, or burning the ones we have?</p>
|
||||
|
||||
<p><strong>Ground cover:</strong> Can people here say "I don't know" without penalty? Can they fail without becoming failures?</p>
|
||||
|
||||
<p><strong>Nitrogen fixers:</strong> Who makes others better through proximity? Do we value that, or do we only value individual output?</p>
|
||||
|
||||
<p><strong>Pollinators:</strong> Who carries context between functions? Do we give them time to move, or do we treat that time as overhead?</p>
|
||||
|
||||
<p><strong>Deep roots:</strong> How long has this team been together? What have they survived? What trust have they accumulated?</p>
|
||||
|
||||
<p>If you can't answer these, you don't know your soil. And if you don't know your soil, you're farming blind.</p>
|
||||
|
||||
<h2>The Cultivation Assessment</h2>
|
||||
|
||||
<p>I use a simple cultivation assessment when I walk into a team:</p>
|
||||
|
||||
<p>Rate each nutrient 1-5. Not relative to some ideal team in a blog post; relative to what this team needs to do what it's trying to do. A team building critical infrastructure needs more tall stalks than a team running marketing automations. A team in rapid growth needs more nitrogen fixers than a mature maintenance team.</p>
|
||||
|
||||
<p>The goal isn't a perfect score. The goal is honesty about what's depleted and a plan to amend it.</p>
|
||||
|
||||
<p>A team with 2/5 ground cover isn't failing; it's eroding. A team with 1/5 pollinators isn't broken; it's incoherent. The assessment gives you language for what you already feel but couldn't name.</p>
|
||||
|
||||
<h2>What Healthy Soil Feels Like</h2>
|
||||
|
||||
<p>You can feel soil health. Healthy soil is loose, fragrant, alive with microorganisms. Unhealthy soil is compacted, sour, dead.</p>
|
||||
|
||||
<p>You can feel team health too. Healthy teams move with coherence. Decisions make sense in retrospect. People know what's expected without being told. Conflict happens and resolves. There's margin for learning, for experimentation, for the thing that wasn't in the roadmap.</p>
|
||||
|
||||
<p>Unhealthy teams feel different. Everything requires explicit coordination. Decisions seem arbitrary. People are careful in ways that cost energy. There's no margin; every sprint is a sprint to survive.</p>
|
||||
|
||||
<p>The feeling is data. Trust it. Then test the soil to find out why.</p>
|
||||
|
||||
<h2>Amendment, Not Replacement</h2>
|
||||
|
||||
<p>Here's what you don't do: you don't fire the team and hire a new one. That's not cultivation; that's starting over on depleted soil.</p>
|
||||
|
||||
<p>You amend. You add what's missing. You reduce what's toxic. You give it time.</p>
|
||||
|
||||
<p>Tall stalks depleting? Stop using them as the answer to everything; grow more through deliberate mentorship. Ground cover thin? Create small moments of safety and let them accumulate. Nitrogen fixers invisible? Change what you measure so knowledge transfer counts. Pollinators absent? Give people time to move between functions. Deep roots shallow? Stop reorging and let people stay together.</p>
|
||||
|
||||
<p>None of this is fast. None of it shows up in this quarter's metrics. All of it compounds.</p>
|
||||
|
||||
<h2>The Question Underneath</h2>
|
||||
|
||||
<p>The framework isn't really about soil. It's about a question: what are we growing here?</p>
|
||||
|
||||
<p>Most teams can't answer. They're shipping features, hitting OKRs, moving tickets across boards. They're not cultivating anything; they're extracting. And extraction depletes soil whether you name it or not.</p>
|
||||
|
||||
<p>The diagnostic is the first step. The hard part is what comes after: choosing to cultivate in a system that rewards extraction.</p>
|
||||
|
||||
<p>That's the work. That's always the work.</p>
|
||||
</div>
|
||||
|
||||
<footer class="article-footer">
|
||||
<div class="article-cta">
|
||||
<p>Want to continue this conversation? <a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">Connect with me on LinkedIn</a> — I write about the human side of AI and what to do about it.</p>
|
||||
</div>
|
||||
</footer>
|
||||
</article>
|
||||
|
||||
<NewsletterSignup />
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
.article {
|
||||
padding: 12rem 2rem 6rem;
|
||||
background: var(--color-cream);
|
||||
}
|
||||
|
||||
.article-header {
|
||||
max-width: 720px;
|
||||
margin: 0 auto 3rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.article-meta {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.article-date {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.article-tag {
|
||||
color: var(--color-amber);
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.article-header h1 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: clamp(2rem, 4vw, 3rem);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 0 0 1rem;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.article-subtitle {
|
||||
font-size: var(--size-lg);
|
||||
color: var(--color-text-muted);
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.article-body {
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
font-size: var(--size-md);
|
||||
line-height: 1.8;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.article-body h2 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-2xl);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 3rem 0 1rem;
|
||||
}
|
||||
|
||||
.article-body h3 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-xl);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 2.5rem 0 0.75rem;
|
||||
}
|
||||
|
||||
.article-body p {
|
||||
margin: 0 0 1.25rem;
|
||||
}
|
||||
|
||||
.article-body a {
|
||||
color: var(--color-green);
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
}
|
||||
|
||||
.article-body a:hover {
|
||||
color: var(--color-green-dark);
|
||||
}
|
||||
|
||||
.article-body strong {
|
||||
color: var(--color-brown-dark);
|
||||
}
|
||||
|
||||
.article-footer {
|
||||
margin-top: 4rem;
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.article-footer hr {
|
||||
border: none;
|
||||
border-top: 1px solid var(--color-border);
|
||||
margin: 0 0 2rem;
|
||||
}
|
||||
|
||||
.article-cta {
|
||||
text-align: center;
|
||||
font-size: var(--size-sm);
|
||||
color: var(--color-text-muted);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.article-cta a {
|
||||
color: var(--color-green);
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.article {
|
||||
padding: 6rem 1.25rem 4rem;
|
||||
}
|
||||
|
||||
.article-header h1 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.article-body {
|
||||
font-size: var(--size-base);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="Why spec-first development is the only reliable audit surface for AI-generated code — and how Speckl closes the spec-code gap by construction."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/spec-first-audit-surface"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
253
src/pages/blog/strip-mining-cultivation.astro
Normal file
|
|
@ -0,0 +1,253 @@
|
|||
---
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import NewsletterSignup from '../../components/NewsletterSignup.astro';
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
title="Stop Strip-Mining Your Engineers: The Cultivation Alternative to Throughput Obsession"
|
||||
description="Gallup 2026: 80% of the global workforce is disengaged. The $438B cost isn't a tool problem; it's a people problem. Here's the cultivation alternative."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/strip-mining-cultivation"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="article">
|
||||
<header class="article-header">
|
||||
<div class="article-meta">
|
||||
<span class="article-date">May 18, 2026</span>
|
||||
<span class="article-tag">Leadership</span>
|
||||
</div>
|
||||
<h1>Stop Strip-Mining Your Engineers: The Cultivation Alternative to Throughput Obsession</h1>
|
||||
<p class="article-subtitle">
|
||||
Gallup's 2026 report dropped a number that should have stopped the industry in its tracks: 80% of the global workforce is disengaged. The $438B cost isn't a tool problem; it's a people problem. Here's the cultivation alternative.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div class="article-body">
|
||||
<p>Gallup's 2026 report dropped a number that should have stopped the industry in its tracks: 80% of the global workforce is disengaged.</p>
|
||||
|
||||
<p>Not unhappy. Not underpaid. Disengaged. As in, going through the motions. As in, present but not accounted for. The kind of disengagement that doesn't show up in velocity metrics because velocity metrics measure output, not intent.</p>
|
||||
|
||||
<p>The cost? $438 billion annually in lost productivity. But that's accounting, not diagnosis. The real cost is the human potential being strip-mined out of existence while we optimize Jira boards.</p>
|
||||
|
||||
<p>Here's another number from the same report that got less attention: manager engagement dropped from +11 over individual contributors to +3. The people tasked with cultivating others are themselves running on empty.</p>
|
||||
|
||||
<p>This isn't a tool problem. You can't AI your way out of a people problem.</p>
|
||||
|
||||
<h2>The Extraction Economy</h2>
|
||||
|
||||
<p>I call what most engineering organizations do to their people "strip-mining." It's not pejorative; it's descriptive.</p>
|
||||
|
||||
<p>Strip-mining is the practice of removing resources from a site without regard for the long-term health of the soil. You extract maximum value in minimum time. You measure success by tons moved, not by whether anything can grow there afterward.</p>
|
||||
|
||||
<p>Sound familiar?</p>
|
||||
|
||||
<p>The sprint cycle that never ends. The "stretch goals" that stretch people until they break. The performance review that rewards shipped features and says nothing about soil health. The manager who has fifteen direct reports and no time to know any of them.</p>
|
||||
|
||||
<p>These aren't edge cases. They're the default setting. And we've normalized them because the metrics are easy and the alternatives are hard.</p>
|
||||
|
||||
<p>MIT and Gallup ran the numbers on AI adoption: 95% of implementations show zero profit impact. Not because the tools are bad, but because the people using them are depleted. You can't automate your way out of disengagement. You can only deepen it.</p>
|
||||
|
||||
<h2>The Cultivation Alternative</h2>
|
||||
|
||||
<p>I wrote a business novel about this. <em>The Soil Beneath the Code</em> wasn't an accident; it was a necessity. I needed a vocabulary for what I was seeing that "employee engagement" and "developer experience" couldn't capture.</p>
|
||||
|
||||
<p>The agricultural metaphor works because it's ancient, because it's grounded, because it forces you to think in cycles rather than quarters.</p>
|
||||
|
||||
<p>Cultivation is slow. Cultivation is directional. Cultivation measures the health of the soil, not just the height of this year's crop. And cultivation requires something extraction doesn't: the cultivator has to care about what happens after they're gone.</p>
|
||||
|
||||
<p>The three questions from my mentoring framework apply here too. What are you cultivating? At what cost? For how long?</p>
|
||||
|
||||
<p>Most engineering organizations can't answer the first question. They can tell you what they're shipping. They can tell you what their OKRs are. They can't tell you what they're growing in their people because they've never asked.</p>
|
||||
|
||||
<h2>What Cultivation Looks Like in Practice</h2>
|
||||
|
||||
<p>I'm not going to give you a framework with seven pillars and an acronym. Frameworks are what strip-mining looks like when it's trying to seem human. Instead, here are directional signals; practices that indicate cultivation rather than extraction.</p>
|
||||
|
||||
<p><strong>Cultivation invests in capacity, not just output.</strong></p>
|
||||
|
||||
<p>The organization that sends its senior engineers to a conference to learn something unrelated to this quarter's roadmap is cultivating. The organization that cancels training because "we're too busy shipping" is strip-mining. Both are rational within their own logic. Only one of them compounds.</p>
|
||||
|
||||
<p><strong>Cultivation measures soil health, not just yield.</strong></p>
|
||||
|
||||
<p>Velocity is yield. Cycle time is yield. Bug count is yield. None of them tell you whether your best engineer is two months from quitting, or whether your team's collective knowledge is eroding, or whether your onboarding process is destroying the people it's supposed to grow.</p>
|
||||
|
||||
<p>Soil health metrics are harder. They require conversation. They require looking at what people do when nobody's measuring them. They require the patience to measure things that don't show up in dashboards.</p>
|
||||
|
||||
<p><strong>Cultivation tolerates fallow seasons.</strong></p>
|
||||
|
||||
<p>Not every quarter can be a harvest. Sometimes the soil needs to rest. Sometimes the team needs to refactor, to learn, to experiment without a delivery date. The extraction mindset treats fallow seasons as waste. The cultivation mindset treats them as investment.</p>
|
||||
|
||||
<p>I've watched teams go through "innovation sprints" that were really just compressed delivery cycles with a different name. That's not a fallow season; that's strip-mining in disguise. A real fallow season has no metric attached. That's what makes it uncomfortable, and that's what makes it necessary.</p>
|
||||
|
||||
<p><strong>Cultivation is specific to the soil.</strong></p>
|
||||
|
||||
<p>You don't grow corn in sand. You don't cultivate a backend engineer the same way you cultivate a product manager. The generic "leadership training" that gets applied to everyone regardless of role, temperament, or trajectory is the HR equivalent of broadcasting seed from an airplane.</p>
|
||||
|
||||
<p>Cultivation requires knowing the person in front of you. Not their resume; their soil. What do they lean toward? What depletes them? What regenerates them? These questions don't scale. That's the point.</p>
|
||||
|
||||
<h2>The Manager Collapse</h2>
|
||||
|
||||
<p>Let's go back to that Gallup number: manager engagement at +3 over ICs. It used to be +11.</p>
|
||||
|
||||
<p>What happened?</p>
|
||||
|
||||
<p>Managers got loaded up. More direct reports, more cross-functional coordination, more "people leadership" responsibilities added to the same technical workload. The manager role became the dumping ground for everything that didn't fit in an IC job description.</p>
|
||||
|
||||
<p>And then we asked them to "cultivate" their people on top of it.</p>
|
||||
|
||||
<p>You can't cultivate what you don't have time to see. A manager with fifteen reports isn't cultivating; they're triaging. They're deciding which fires to let burn. The human connection that makes cultivation possible — the walk, the conversation, the noticing — gets sacrificed to the standup, the status update, the roadmap review.</p>
|
||||
|
||||
<p>If you want cultivation, you have to protect the cultivators. That means fewer direct reports, fewer meetings, fewer "strategic initiatives" that translate to more hours and less presence. It means treating manager time as a finite resource instead of an infinitely elastic buffer.</p>
|
||||
|
||||
<h2>The Speed Without Soil Trap</h2>
|
||||
|
||||
<p>I've started using a phrase: "speed without soil."</p>
|
||||
|
||||
<p>It describes the organization that moves fast but leaves nothing behind. The sprint that ships a feature and burns out the engineer who built it. The acquisition that brings revenue and destroys culture. The AI adoption that promises efficiency and delivers exhaustion.</p>
|
||||
|
||||
<p>Speed without soil isn't just unsustainable; it's expensive. The cost shows up in turnover, in knowledge loss, in the slow erosion of quality that happens when nobody has the margin to care.</p>
|
||||
|
||||
<p>The alternative isn't "slow." It's "fast with soil." The organization that moves quickly <em>because</em> it invests in its people. The team that ships reliably <em>because</em> it has time to learn from failures. The engineer who solves hard problems <em>because</em> they haven't been depleted by trivial ones.</p>
|
||||
|
||||
<p>Soil isn't a brake on speed. It's what makes sustained speed possible.</p>
|
||||
|
||||
<h2>What You Can Do Tomorrow</h2>
|
||||
|
||||
<p>I'm suspicious of advice that starts with "leadership should." Leadership should do a lot of things. Most of them don't happen because the structure prevents it.</p>
|
||||
|
||||
<p>So here's what you can do regardless of your title:</p>
|
||||
|
||||
<p><strong>If you're an IC:</strong> Notice what depletes you and what regenerates you. Track it for a week. The data is more useful than you think, and nobody else is going to collect it for you.</p>
|
||||
|
||||
<p><strong>If you're a manager:</strong> Reduce your direct report count or delegate something else. If you can't do either, be honest that you're managing, not cultivating. There's no shame in triage when triage is all the system allows. But don't call it mentorship.</p>
|
||||
|
||||
<p><strong>If you're a senior leader:</strong> Ask the three questions about your org. What are you cultivating? At what cost? For how long? If you can't answer them, you're strip-mining. That may be rational; just know what you're doing.</p>
|
||||
|
||||
<p>The $438 billion number is a distraction. It's big enough to seem important and abstract enough to ignore. The real question is personal: are you cultivating the people around you, or extracting from them?</p>
|
||||
|
||||
<p>Your answer matters more than any Gallup report.</p>
|
||||
</div>
|
||||
|
||||
<footer class="article-footer">
|
||||
<div class="article-cta">
|
||||
<p>Want to continue this conversation? <a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">Connect with me on LinkedIn</a> — I write about the human side of AI and what to do about it.</p>
|
||||
</div>
|
||||
</footer>
|
||||
</article>
|
||||
|
||||
<NewsletterSignup />
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
.article {
|
||||
padding: 12rem 2rem 6rem;
|
||||
background: var(--color-cream);
|
||||
}
|
||||
|
||||
.article-header {
|
||||
max-width: 720px;
|
||||
margin: 0 auto 3rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.article-meta {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.article-date {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.article-tag {
|
||||
color: var(--color-amber);
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.article-header h1 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: clamp(2rem, 4vw, 3rem);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 0 0 1rem;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.article-subtitle {
|
||||
font-size: var(--size-lg);
|
||||
color: var(--color-text-muted);
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.article-body {
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
font-size: var(--size-md);
|
||||
line-height: 1.8;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.article-body h2 {
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--size-2xl);
|
||||
color: var(--color-brown-dark);
|
||||
margin: 3rem 0 1rem;
|
||||
}
|
||||
|
||||
.article-body p {
|
||||
margin: 0 0 1.25rem;
|
||||
}
|
||||
|
||||
.article-body a {
|
||||
color: var(--color-green);
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
}
|
||||
|
||||
.article-body a:hover {
|
||||
color: var(--color-green-dark);
|
||||
}
|
||||
|
||||
.article-body strong {
|
||||
color: var(--color-brown-dark);
|
||||
}
|
||||
|
||||
.article-footer {
|
||||
max-width: 720px;
|
||||
margin: 4rem auto 0;
|
||||
padding-top: 2rem;
|
||||
border-top: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
.article-cta {
|
||||
text-align: center;
|
||||
font-size: var(--size-sm);
|
||||
color: var(--color-text-muted);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.article-cta a {
|
||||
color: var(--color-green);
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.article {
|
||||
padding: 6rem 1.25rem 4rem;
|
||||
}
|
||||
|
||||
.article-header h1 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.article-body {
|
||||
font-size: var(--size-base);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="Strip-mining of people isn't a future risk — it's already happening in every org that treats AI as headcount reduction."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/strip-mining-happening-right-now"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -60,8 +60,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
|
||||
<footer class="article-footer">
|
||||
<div class="article-cta">
|
||||
<p>Enjoyed this? <a href="/blog">Read more articles</a> on AI, leadership, and the human side of technology.</p>
|
||||
<p>Ready to bring this thinking to your team? <a href="/contact">Let's talk.</a></p>
|
||||
<p>Want to continue this conversation? <a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">Connect with me on LinkedIn</a> — I write about the human side of AI and what to do about it.</p>
|
||||
</div>
|
||||
</footer>
|
||||
</article>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="You're being strip-mined, but you'd rather be cultivated. Here's how to lead in that direction from where you are."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/surveillance-extraction"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
</p>
|
||||
|
||||
<div class="cta-box">
|
||||
<a href="/contact?subject=Soil%20Assessment" class="btn btn-primary">Book your Soil Assessment →</a>
|
||||
<p>Want to continue this conversation? <a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener" class="btn btn-primary">Connect with me on LinkedIn</a> — I write about the human side of AI and what to do about it.</p>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
|
|
|||
|
|
@ -51,8 +51,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
|
||||
<footer class="article-footer">
|
||||
<div class="article-cta">
|
||||
<p>Enjoyed this? <a href="/blog">Read more articles</a> on AI, leadership, and the human side of technology.</p>
|
||||
<p>Ready to bring this thinking to your team? <a href="/contact">Let's talk.</a></p>
|
||||
<p>Want to continue this conversation? <a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">Connect with me on LinkedIn</a> — I write about the human side of AI and what to do about it.</p>
|
||||
</div>
|
||||
</footer>
|
||||
</article>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
|||
description="Token anxiety is BS. If you know what you're doing and optimize for outcomes, token cost is meaningless."
|
||||
ogType="article"
|
||||
canonicalUrl="/blog/token-anxiety"
|
||||
pageType="blog"
|
||||
>
|
||||
|
||||
<article class="post">
|
||||
|
|
|
|||
|
|
@ -56,9 +56,10 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
<h2>Dark Provenance</h2>
|
||||
<p class="book-meta">Coming 2026</p>
|
||||
<p class="book-description">Formal verification for the AI age. How to audit what your AI actually did.</p>
|
||||
<p class="book-quote">"Speckl and the dark provenance system. A new approach to AI accountability."</p>
|
||||
<p class="book-quote">"Speckl — the compile-time provenance layer. A new approach to AI accountability."</p>
|
||||
|
||||
<SharedForm type="waitlist" />
|
||||
<p class="waitlist-info">Want early access? Email Scott directly to join the waitlist.</p>
|
||||
<a href="mailto:scott@scoble.me?subject=Dark%20Provenance%20Interest" class="waitlist-btn">Email for Early Access</a>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
|
|
@ -170,6 +171,12 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.waitlist-info {
|
||||
font-size: 0.9375rem;
|
||||
color: var(--color-text-muted);
|
||||
margin: 0 0 0.75rem;
|
||||
}
|
||||
|
||||
.waitlist-btn {
|
||||
display: inline-block;
|
||||
background: var(--color-brown);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ import PackageCard from '../components/PackageCard.astro';
|
|||
"90-day cultivation roadmap",
|
||||
"Follow-up recommendations"
|
||||
]}
|
||||
priceRange="Investment varies by scope"
|
||||
priceRange="Starting from $2,500"
|
||||
idealFor="Teams adopting AI but losing human coordination"
|
||||
/>
|
||||
|
||||
|
|
@ -46,7 +46,7 @@ import PackageCard from '../components/PackageCard.astro';
|
|||
"Accountability mandate and cultivation practices",
|
||||
"Follow-up coaching session"
|
||||
]}
|
||||
priceRange="Investment varies by scope"
|
||||
priceRange="Typical range: $5,000–$15,000"
|
||||
idealFor="Teams stuck in reactive mode, need structural change"
|
||||
/>
|
||||
|
||||
|
|
@ -57,10 +57,10 @@ import PackageCard from '../components/PackageCard.astro';
|
|||
deliverables={[
|
||||
"Weekly advisory calls",
|
||||
"Code review and architecture guidance",
|
||||
"Speckl dark provenance audit",
|
||||
"Speckl compile-time provenance audit",
|
||||
"Team mentoring and development"
|
||||
]}
|
||||
priceRange="Monthly retainer, negotiable"
|
||||
priceRange="From $8,000–$20,000/month"
|
||||
idealFor="Startups and mid-size companies building agentic systems"
|
||||
/>
|
||||
|
||||
|
|
@ -100,7 +100,7 @@ import PackageCard from '../components/PackageCard.astro';
|
|||
<div class="section-container">
|
||||
<h2>Ready to cultivate your team?</h2>
|
||||
<p>Schedule a discovery call. We'll talk about your situation and figure out the right engagement.</p>
|
||||
<a href="https://linkedin.com/in/scottscoble" class="cta-button" target="_blank" rel="noopener">Connect on LinkedIn</a>
|
||||
<a href="/contact/" class="cta-button" data-umami-event="consulting-cta-contact">Get in Touch</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
|
|||
|
|
@ -31,23 +31,37 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
<div class="contact-alternatives">
|
||||
<h2>Other Ways to Reach Me</h2>
|
||||
|
||||
|
||||
<div class="contact-option">
|
||||
<h3>📧 Email</h3>
|
||||
<p><a href="mailto:scott@scoble.me">scott@scoble.me</a></p>
|
||||
</div>
|
||||
|
||||
<div class="contact-option">
|
||||
<h3>🔗 LinkedIn</h3>
|
||||
<p><a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">Connect on LinkedIn</a></p>
|
||||
<h3>🔗 Follow on LinkedIn</h3>
|
||||
<p class="contact-cta-text">Daily AI insights, leadership perspectives, and team cultivation practices — from a practitioner who builds.</p>
|
||||
<a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener" class="contact-cta-btn linkedin-btn">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18" 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>
|
||||
Connect on LinkedIn for AI Insights
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="contact-option">
|
||||
<h3>🐦 Social</h3>
|
||||
<p>
|
||||
<a href="https://linkedin.com/in/scottscoble" target="_blank" rel="noopener">LinkedIn</a> •
|
||||
<a href="https://x.com/scottscoble" target="_blank" rel="noopener">X/Twitter</a> •
|
||||
<a href="https://github.com/sscoble" target="_blank" rel="noopener">GitHub</a>
|
||||
</p>
|
||||
<h3>🐦 X / Twitter</h3>
|
||||
<p class="contact-cta-text">Daily thoughts on cultivation, AI, and the intersection of people and systems.</p>
|
||||
<a href="https://x.com/scottscoble" target="_blank" rel="noopener" class="contact-cta-btn x-btn">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18" 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>
|
||||
Follow on X
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="contact-option">
|
||||
<h3>💻 GitHub</h3>
|
||||
<p class="contact-cta-text">Open source projects: Speckl (formal provenance), ScobleClaw (agentic engineering), Beyond the Prompt.</p>
|
||||
<a href="https://github.com/wscoble" target="_blank" rel="noopener" class="contact-cta-btn gh-btn">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18" 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>
|
||||
Explore Open Source
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -167,7 +181,57 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
margin: 0;
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
|
||||
.contact-cta-text {
|
||||
font-size: 0.9375rem;
|
||||
color: var(--color-text-muted);
|
||||
margin: 0 0 0.75rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.contact-cta-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.625rem 1.125rem;
|
||||
border-radius: 6px;
|
||||
font-size: 0.9375rem;
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
border: 1px solid transparent;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.linkedin-btn {
|
||||
background: #0a66c2;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.linkedin-btn:hover {
|
||||
background: #004182;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.x-btn {
|
||||
background: #0f1419;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.x-btn:hover {
|
||||
background: #272c30;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.gh-btn {
|
||||
background: #24292e;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.gh-btn:hover {
|
||||
background: #404448;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.contact-option a {
|
||||
color: var(--color-green);
|
||||
text-decoration: none;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import PillarCard from '../components/PillarCard.astro';
|
||||
import NewsletterSignup from '../components/NewsletterSignup.astro';
|
||||
---
|
||||
|
||||
<BaseLayout
|
||||
|
|
@ -33,7 +34,7 @@ import PillarCard from '../components/PillarCard.astro';
|
|||
</div>
|
||||
<p class="hero-project-link">
|
||||
Creator of <a href="https://speckl.scoble.me">Speckl</a> ·
|
||||
<a href="https://os.scoble.me/forgejo/marcus/scobleclaw">ScobleClaw</a> ·
|
||||
<a href="https://os.scoble.me/forgejo/sscoble/scobleclaw">ScobleClaw</a> ·
|
||||
<a href="https://os.scoble.me/forgejo/sscoble/beyond-the-prompt">Beyond the Prompt</a>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -110,28 +111,6 @@ import PillarCard from '../components/PillarCard.astro';
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Trust Bar - hidden until client logos exist -->
|
||||
<!--
|
||||
<section class="trust-bar">
|
||||
<p class="trust-label">Trusted by leaders at</p>
|
||||
<div class="trust-logos">
|
||||
<span class="logo-placeholder">[Client logos coming soon]</span>
|
||||
</div>
|
||||
</section>
|
||||
-->
|
||||
|
||||
<!-- Testimonials - hidden until content exists
|
||||
<section class="testimonials">
|
||||
<div class="section-header">
|
||||
<p class="section-kicker">Testimonials</p>
|
||||
<h2>What People Say</h2>
|
||||
</div>
|
||||
|
||||
<div class="testimonial-grid">
|
||||
</div>
|
||||
</section>
|
||||
-->
|
||||
|
||||
<!-- CTA Section -->
|
||||
<section class="cta-section">
|
||||
<div class="cta-visual"></div>
|
||||
|
|
@ -139,10 +118,13 @@ import PillarCard from '../components/PillarCard.astro';
|
|||
<p class="cta-kicker">Ready to get started?</p>
|
||||
<h2>Let's cultivate your team.</h2>
|
||||
<p class="cta-desc">Book a keynote, workshop, or discovery call. Let's talk about your event or your team's soil health.</p>
|
||||
<a href="/speaking#book" class="btn btn-primary btn-large">Book Scott</a>
|
||||
<a href="/speaking#book" class="btn btn-primary btn-large" data-umami-event="cta-book-scott">Book Scott</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Newsletter Signup -->
|
||||
<NewsletterSignup />
|
||||
|
||||
</BaseLayout>
|
||||
|
||||
<style>
|
||||
|
|
@ -441,91 +423,6 @@ import PillarCard from '../components/PillarCard.astro';
|
|||
color: var(--color-brown-dark);
|
||||
}
|
||||
|
||||
/* ===== TRUST BAR ===== */
|
||||
.trust-bar {
|
||||
padding: 3rem 2rem;
|
||||
background: var(--color-brown-dark);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.trust-label {
|
||||
font-size: 0.875rem;
|
||||
font-weight: 500;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.1em;
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
margin: 0 0 1.5rem;
|
||||
}
|
||||
|
||||
.trust-logos {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 3rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.logo-placeholder {
|
||||
color: rgba(255, 255, 255, 0.4);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* ===== TESTIMONIALS ===== */
|
||||
.testimonials {
|
||||
padding: 6rem 2rem;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.testimonial-grid {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.testimonial-card {
|
||||
background: linear-gradient(135deg, #faf8f5 0%, #f5f0e8 100%);
|
||||
padding: 3rem;
|
||||
border-radius: 16px;
|
||||
border: none;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.testimonial-card::before {
|
||||
content: '"';
|
||||
position: absolute;
|
||||
top: 1rem;
|
||||
left: 1.5rem;
|
||||
font-family: var(--font-heading);
|
||||
font-size: 6rem;
|
||||
color: var(--color-amber);
|
||||
opacity: 0.3;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.testimonial-quote {
|
||||
font-size: 1.25rem;
|
||||
font-style: italic;
|
||||
color: var(--color-brown-dark);
|
||||
margin: 0 0 1.5rem;
|
||||
line-height: 1.7;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.testimonial-author {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.25rem;
|
||||
}
|
||||
|
||||
.testimonial-author strong {
|
||||
color: var(--color-brown-dark);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.testimonial-author span {
|
||||
color: var(--color-text-muted);
|
||||
font-size: 0.9375rem;
|
||||
}
|
||||
|
||||
/* ===== CTA SECTION ===== */
|
||||
.cta-section {
|
||||
position: relative;
|
||||
|
|
@ -627,7 +524,6 @@ import PillarCard from '../components/PillarCard.astro';
|
|||
|
||||
.pillars,
|
||||
.featured-talks,
|
||||
.testimonials,
|
||||
.cta-section {
|
||||
padding: 4rem 1.5rem;
|
||||
}
|
||||
|
|
@ -635,9 +531,5 @@ import PillarCard from '../components/PillarCard.astro';
|
|||
.talk-card {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
.testimonial-card {
|
||||
padding: 2rem 1.5rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -11,6 +11,20 @@ interface PostEntry {
|
|||
// Blog posts data — matches src/pages/blog/*.astro
|
||||
// When adding a new post, add an entry here
|
||||
const posts: PostEntry[] = [
|
||||
{
|
||||
title: "50 First Dates with AI: Why Your AI Forgets Everything and What to Do About It",
|
||||
description: "Every conversation with most AI systems is a first date. Here's the three-layer memory model that actually compounds — from Scott Scoble's scobleclaw experience.",
|
||||
url: "/blog/50-first-dates-with-ai",
|
||||
date: "2026-05-24",
|
||||
tags: ["AI"],
|
||||
},
|
||||
{
|
||||
title: "Stop Strip-Mining Your Engineers: The Cultivation Alternative to Throughput Obsession",
|
||||
description: "Gallup 2026: 80% of the global workforce is disengaged. Manager engagement has collapsed. The $438B cost isn't a tool problem; it's a people problem. Here's the cultivation alternative.",
|
||||
url: "/blog/strip-mining-cultivation",
|
||||
date: "2026-05-18",
|
||||
tags: ["Leadership"],
|
||||
},
|
||||
{
|
||||
title: "Your AI Has Amnesia: Why Memory Architecture Is the Hardest Problem in Agentic Systems",
|
||||
description: "The anterograde amnesia metaphor for AI memory architecture. Three-layer memory model for agentic systems from Scott Scoble's scobleclaw experience.",
|
||||
|
|
|
|||
|
|
@ -1,30 +1,58 @@
|
|||
import { getCollection } from 'astro:content';
|
||||
import type { APIRoute } from 'astro';
|
||||
|
||||
const siteUrl = 'https://scott.scoble.me';
|
||||
|
||||
const pages = [
|
||||
{ url: '/', lastmod: new Date().toISOString() },
|
||||
{ url: '/speaking', lastmod: new Date().toISOString() },
|
||||
{ url: '/consulting', lastmod: new Date().toISOString() },
|
||||
{ url: '/books', lastmod: new Date().toISOString() },
|
||||
{ url: '/contact', lastmod: new Date().toISOString() },
|
||||
{ url: '/privacy', lastmod: new Date().toISOString() },
|
||||
{ url: '/about', lastmod: new Date().toISOString() },
|
||||
{ url: '/blog', lastmod: new Date().toISOString() },
|
||||
{ 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' },
|
||||
];
|
||||
|
||||
// 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' },
|
||||
];
|
||||
|
||||
const allPages = [...pages, ...blogPosts.map(p => ({ ...p, priority: '0.7' }))];
|
||||
|
||||
// Render the sitemap XML
|
||||
const xml = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
${pages.map(page => `
|
||||
${allPages.map(page => `
|
||||
<url>
|
||||
<loc>${new URL(page.url, 'https://scott.scoble.me').href}</loc>
|
||||
<lastmod>${typeof page.lastmod === 'string' ? page.lastmod : new Date(page.lastmod).toISOString().split('T')[0]}</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>${page.url === '/' ? '1.0' : '0.8'}</priority>
|
||||
<loc>${new URL(page.url, siteUrl).href}</loc>
|
||||
<lastmod>${page.lastmod}</lastmod>
|
||||
<changefreq>${page.url === '/' ? 'weekly' : 'monthly'}</changefreq>
|
||||
<priority>${page.priority}</priority>
|
||||
</url>
|
||||
`).join('')}
|
||||
</urlset>`;
|
||||
|
||||
export const GET = () => {
|
||||
export const GET: APIRoute = () => {
|
||||
return new Response(xml, {
|
||||
headers: {
|
||||
'Content-Type': 'application/xml',
|
||||
|
|
|
|||
|
|
@ -16,26 +16,10 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
<p class="hero-kicker">Keynote Speaker</p>
|
||||
<h1>Helping leaders build AI systems that cultivate humans instead of strip-mining them.</h1>
|
||||
|
||||
<a href="#book" class="hero-cta">Book Scott for Your Event</a>
|
||||
<a href="#book" class="hero-cta" data-umami-event="speaking-hero-cta-book">Book Scott for Your Event</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Speaker Reel - hidden until video is ready -->
|
||||
<!--
|
||||
<section class="reel-section">
|
||||
<div class="section-container">
|
||||
<h2>Watch the Reel</h2>
|
||||
|
||||
<div class="video-container">
|
||||
<div class="video-placeholder">
|
||||
<p>🎬 Speaker reel in production</p>
|
||||
<p>Coming soon — 3-minute highlight reel from keynotes and workshops. In the meantime, explore my signature talks below.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
-->
|
||||
|
||||
<!-- Signature Talks -->
|
||||
<section class="talks-section">
|
||||
<div class="section-container">
|
||||
|
|
@ -47,7 +31,7 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
title="50 First Dates with AI"
|
||||
slug="/speaking/50-first-dates"
|
||||
premise="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."
|
||||
idealFor="Engineering leaders, AI product teams, CTOs implementing agentic systems"
|
||||
audience="Engineering leaders, AI product teams, CTOs implementing agentic systems"
|
||||
takeaways={[
|
||||
"Why your AI's 'memory' is actually just replay, not learning",
|
||||
"The three-layer memory architecture that actually compounds",
|
||||
|
|
@ -59,7 +43,7 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
title="From Strip-Mining to Cultivation"
|
||||
slug="/speaking/strip-mining-to-cultivation"
|
||||
premise="The shift from extraction to cultivation in AI-era teams. Why throughput optimization is killing your soil health."
|
||||
idealFor="CTOs, VP Engineering, people leaders, engineering managers"
|
||||
audience="CTOs, VP Engineering, people leaders, engineering managers"
|
||||
takeaways={[
|
||||
"The difference between strip-mining and cultivation mindsets",
|
||||
"How to assess your team's soil health",
|
||||
|
|
@ -70,7 +54,7 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
<TalkCard
|
||||
title="The Soil Under Your Team"
|
||||
premise="Diagnose what's actually depleted before you fertilize. A diagnostic framework for team health in AI-augmented work."
|
||||
idealFor="Team leads, managers, engineering directors, founders"
|
||||
audience="Team leads, managers, engineering directors, founders"
|
||||
takeaways={[
|
||||
"The four soil nutrients every team needs",
|
||||
"How to run a cultivation assessment",
|
||||
|
|
@ -135,9 +119,9 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
<li><strong>Audience:</strong> Engineering leaders, CTOs, people managers</li>
|
||||
</ul>
|
||||
|
||||
<a href="/downloads/Scott-Scoble-Human-Cultivation-Expert-Speaker-Profile.pdf" class="download-btn" download>📄 Download Speaker Profile (PDF)</a>
|
||||
<a href="/downloads/Scott-Scoble-Human-Cultivation-Expert-Speaker-Profile.pdf" class="download-btn" download data-umami-event="speaker-profile-download">📄 Download Speaker Profile (PDF)</a>
|
||||
|
||||
<p class="contact-alt">Or email: <a href="mailto:scott@scoble.me">scott@scoble.me</a></p>
|
||||
<p class="contact-alt">Or email: <a href="mailto:scott@scoble.me" data-umami-event="speaking-email-link">scott@scoble.me</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -197,29 +181,6 @@ import SharedForm from '../components/Form/SharedForm.astro';
|
|||
color: var(--color-brown-dark);
|
||||
}
|
||||
|
||||
.reel-section {
|
||||
background: white;
|
||||
}
|
||||
|
||||
.video-container {
|
||||
aspect-ratio: 16 / 9;
|
||||
background: var(--color-cream-warm);
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.video-placeholder {
|
||||
text-align: center;
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.video-placeholder p:first-child {
|
||||
font-size: 1.5rem;
|
||||
margin: 0 0 0.5rem;
|
||||
}
|
||||
|
||||
.talks-section {
|
||||
background: var(--color-cream);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -377,24 +377,6 @@ code {
|
|||
font-style: italic;
|
||||
}
|
||||
|
||||
/* --- Testimonials --- */
|
||||
.testimonials-grid {
|
||||
display: grid;
|
||||
gap: var(--space-xl);
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
.testimonials-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.testimonials-grid {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Page Header (non-hero pages) --- */
|
||||
.page-header {
|
||||
padding: var(--space-3xl) 0 var(--space-2xl);
|
||||
|
|
|
|||