+
+
diff --git a/src/content/blog/2026/introducing-dtvem/index.md b/src/content/blog/2026/introducing-dtvem/index.md
index f543bdd..9edb841 100644
--- a/src/content/blog/2026/introducing-dtvem/index.md
+++ b/src/content/blog/2026/introducing-dtvem/index.md
@@ -3,6 +3,7 @@ title: "Introducing the Developer Tools Virtual Environment Manager!"
date: "2026-01-05T12:00:00-05:00"
categories: [golang, cli, python, node, ruby]
description: "A unified, cross-platform runtime version manager that actually works on Windows"
+blueskyPostId: 3mbpawpkn4z26
---
If you've ever tried to manage multiple versions of Python, Node.js, or Ruby on Windows, you know the pain. Tools like `nvm`, `pyenv`, and `rbenv` work great on macOS and Linux, but Windows support ranges from "hacky workarounds" to "just use WSL." And even on Unix systems, you're juggling three different tools with three different configurations.
diff --git a/src/content/blog/2026/introducing-the-visual-studio-toolbox/index.md b/src/content/blog/2026/introducing-the-visual-studio-toolbox/index.md
index 75dd800..078674a 100644
--- a/src/content/blog/2026/introducing-the-visual-studio-toolbox/index.md
+++ b/src/content/blog/2026/introducing-the-visual-studio-toolbox/index.md
@@ -3,6 +3,7 @@ title: "Introducing the Visual Studio Toolbox!"
date: "2026-01-02T12:00:00-05:00"
categories: [dotnet, csharp, visualstudio, winui]
description: "Mission Control for your Visual Studio Installations, inspired by JetBrains Toolbox"
+blueskyPostId: 3mbhgd6et4b26
---
If you've ever used JetBrains Toolbox, you know how convenient it is. It's the central hub for all your JetBrains IDEs — install new tools, manage updates, launch any version with a single click. Everything in one place, tucked away in the system tray.
diff --git a/src/content/blog/2026/introducing-vscwhere/index.md b/src/content/blog/2026/introducing-vscwhere/index.md
index 0380be9..cfd1c91 100644
--- a/src/content/blog/2026/introducing-vscwhere/index.md
+++ b/src/content/blog/2026/introducing-vscwhere/index.md
@@ -3,6 +3,7 @@ title: "Introducing vscwhere!"
date: "2026-01-08T12:00:00-05:00"
categories: [rust, cli, vscode]
description: "A CLI tool for locating Visual Studio Code installations on Windows, inspired by Microsoft's vswhere"
+blueskyPostId: 3mbwhet7cbl24
---
If you've ever used Microsoft's [vswhere](https://github.com/microsoft/vswhere), you know how handy it is. Need to find where Visual Studio is installed? Run `vswhere`. Need the path for a CI/CD script? `vswhere -latest -property installationPath`. It just works.
diff --git a/src/content/blog/2026/sdk-style-projects-for-your-visual-studio-extensions/index.md b/src/content/blog/2026/sdk-style-projects-for-your-visual-studio-extensions/index.md
index 6b2923f..e2eb74d 100644
--- a/src/content/blog/2026/sdk-style-projects-for-your-visual-studio-extensions/index.md
+++ b/src/content/blog/2026/sdk-style-projects-for-your-visual-studio-extensions/index.md
@@ -3,8 +3,10 @@ title: "SDK-style Projects for your Visual Studio Extensions!"
date: "2026-01-01T12:00:00-05:00"
categories: [dotnet, csharp, vsix]
description: "Remember that MSBuild SDK post from last week? Well, I actually built something with it - an SDK that brings modern project files to Visual Studio extension development."
+blueskyPostId: 3mbezw2qfgt2m
---
+
Remember [that post I wrote last week](https://www.codingwithcalvin.net/creating-your-own-msbuild-sdk-it-s-easier-than-you-think) about creating MSBuild SDKs? Well, I wasn't just writing that for fun - I was actually building something with all that knowledge.
I've released [CodingWithCalvin.VsixSdk](https://www.nuget.org/packages/CodingWithCalvin.VsixSdk/), an MSBuild SDK that brings modern SDK-style `.csproj` files to Visual Studio extension development. No more XML soup!
diff --git a/src/content/config.ts b/src/content/config.ts
index dbe710a..ab7a634 100644
--- a/src/content/config.ts
+++ b/src/content/config.ts
@@ -10,6 +10,7 @@ const blog = defineCollection({
description: z.string().optional(),
image: image().optional(),
youtube: z.string().optional(),
+ blueskyPostId: z.string().optional(),
}),
});
diff --git a/src/layouts/PostLayout.astro b/src/layouts/PostLayout.astro
index 0c2982a..0cac061 100644
--- a/src/layouts/PostLayout.astro
+++ b/src/layouts/PostLayout.astro
@@ -4,6 +4,7 @@ import type { ImageMetadata } from 'astro';
import BaseLayout from './BaseLayout.astro';
import CategoryBadges from '../components/CategoryBadges.astro';
import YouTubeEmbed from '../components/YouTubeEmbed.astro';
+import BlueskyEngagement from '../components/BlueskyEngagement.astro';
interface Props {
title: string;
@@ -13,9 +14,10 @@ interface Props {
description?: string;
image?: ImageMetadata;
youtube?: string;
+ blueskyPostId?: string;
}
-const { title, slug, date, categories, description, image, youtube } = Astro.props;
+const { title, slug, date, categories, description, image, youtube, blueskyPostId } = Astro.props;
const formattedDate = date.toLocaleDateString('en-US', {
year: 'numeric',
@@ -69,8 +71,15 @@ const ogImageUrl = image?.src;
+ {blueskyPostId && (
+ <>
+
+
+ >
+ )}
+
-