diff --git a/content/authors/jacob-coffee.json b/content/authors/jacob-coffee.json
new file mode 100644
index 0000000..fdce75b
--- /dev/null
+++ b/content/authors/jacob-coffee.json
@@ -0,0 +1,11 @@
+{
+ "name": "Jacob Coffee",
+ "bio": "Python Software Foundation Staff. Litestar Maintainer.",
+ "github": "JacobCoffee",
+ "avatar": "https://avatars.githubusercontent.com/u/45884264",
+ "twitter": "_scriptr",
+ "bluesky": "scriptr.dev",
+ "mastodon": "https://fosstodon.org/@Monorepo",
+ "website": "https://scriptr.dev",
+ "featured": false
+}
diff --git a/content/posts/the-python-insider-blog-has-moved/index.mdx b/content/posts/the-python-insider-blog-has-moved/index.mdx
new file mode 100644
index 0000000..05fb2d2
--- /dev/null
+++ b/content/posts/the-python-insider-blog-has-moved/index.mdx
@@ -0,0 +1,82 @@
+---
+title: The Python Insider Blog Has Moved!
+publishDate: '2026-03-03'
+updatedDate: '2026-03-03'
+author: Jacob Coffee
+description: 'Python Insider now lives at blog.python.org, backed by a Git repository. All 307 posts from the Blogger era have been migrated, and old URLs redirect automatically.'
+tags:
+ - python
+ - community
+published: true
+legacyUrl: /2026/03/the-python-insider-blog-has-moved.html
+---
+
+import ShowcasePostCards from '../../../src/components/showcase/ShowcasePostCards.astro';
+import ShowcaseTagCloud from '../../../src/components/showcase/ShowcaseTagCloud.astro';
+import ShowcaseAuthors from '../../../src/components/showcase/ShowcaseAuthors.astro';
+import ShowcaseSearch from '../../../src/components/showcase/ShowcaseSearch.astro';
+
+Python Insider now lives at [blog.python.org](https://blog.python.org), backed by a Git repository. All 307 posts from the Blogger era have been migrated over, and old URLs redirect to the new ones automatically. Your RSS readers should pick up the new feed without any action on your part, but if something looks off, the new feed URL is [blog.python.org/rss.xml](https://blog.python.org/rss.xml).
+
+## Why we moved
+
+Blogger worked fine for a long time, but contributing to the blog meant having a Google account and using Blogger's editor. That's a higher bar than it needs to be. The new setup is just Markdown files in a Git repo. If you can open a pull request, you can write a post.
+
+Posts live in `content/posts/{slug}/index.md` with YAML frontmatter for the title, date, authors, and tags. Images go right next to the post in the same directory. No special tooling required beyond a text editor.
+
+## Contributing
+
+Want to write about a Python release, core sprint, governance update, or anything else that belongs on the official Python blog? Here's the short version:
+
+1. Fork [python/python-insider-blog](https://github.com/python/python-insider-blog)
+2. Create a new directory under `content/posts/` with your post slug
+3. Add an `index.md` with your content (and optionally upload your images)
+4. Open a PR
+
+The repo README has more detail on frontmatter fields and local development if you want to preview your post before submitting.
+
+## What's new on the site
+
+Beyond the content itself, the new site has a few features the old Blogger setup never had. Here's a live look:
+
+### Browse & filter posts
+
+All posts are browsable with pagination, a year filter, and a tag sidebar. Click any tag or year to narrow things down.
+
+
+
+### Every author has a page
+
+See who's been writing, how much they've contributed, and browse their posts individually.
+
+
+
+### Tags at a glance
+
+Every tag across the archive, ranked by how often it appears. Great for finding all the release announcements or security updates in one place.
+
+
+
+### Search everything
+
+Hit Ctrl+K (or Cmd+K on Mac) from any page to open the command palette. It searches across all 307+ posts by title, author, tags, and description. There are also keyboard chord shortcuts for quick navigation.
+
+
+
+### And more
+
+- **RSS feed** at [blog.python.org/rss.xml](https://blog.python.org/rss.xml), compatible with the old Blogger feed URL so existing subscribers don't need to change anything.
+- **Dark mode** that follows your system preference (try the toggle in the header).
+- **Open Graph images** generated automatically for every post, so links shared on social media get proper preview cards.
+
+## What's under the hood
+
+The site is built with [Astro](https://astro.build) and deployed as fully static HTML. There's a [Keystatic](https://keystatic.com) CMS available in dev mode if you prefer a visual editor over raw Markdown, but it's entirely optional. Tailwind handles the styling. The whole thing builds and deploys through GitHub Actions.
+
+## Links
+
+- New site: [blog.python.org](https://blog.python.org)
+- Repository: [github.com/python/python-insider-blog](https://github.com/python/python-insider-blog)
+- RSS feed: [blog.python.org/rss.xml](https://blog.python.org/rss.xml)
+
+If you spot broken links, missing images, or formatting issues from the migration, [file an issue](https://github.com/python/python-insider-blog/issues) on the repo. PRs are welcome too.
diff --git a/src/components/showcase/ShowcaseAuthors.astro b/src/components/showcase/ShowcaseAuthors.astro
new file mode 100644
index 0000000..ff71443
--- /dev/null
+++ b/src/components/showcase/ShowcaseAuthors.astro
@@ -0,0 +1,80 @@
+---
+import { getCollection } from "astro:content";
+import { slugify, withBase } from "../../lib/utils";
+
+const allPosts = await getCollection("posts");
+const publishedPosts = allPosts.filter((p) => p.data.published);
+const allAuthors = await getCollection("authors");
+
+const authorCounts = new Map();
+for (const post of publishedPosts) {
+ const slug = slugify(post.data.author);
+ authorCounts.set(slug, (authorCounts.get(slug) || 0) + 1);
+}
+
+const authorsWithCounts = allAuthors
+ .map((a) => ({
+ slug: a.id,
+ name: a.data.name,
+ github: a.data.github,
+ count: authorCounts.get(a.id) || 0,
+ }))
+ .filter((a) => a.count > 0)
+ .sort((a, b) => b.count - a.count);
+
+const topAuthors = authorsWithCounts.slice(0, 6);
+const maxCount = topAuthors[0]?.count ?? 1;
+---
+
+