diff --git a/src/content/blog/using-mdx.mdx b/src/content/blog/using-mdx.mdx
deleted file mode 100644
index bd8856e..0000000
--- a/src/content/blog/using-mdx.mdx
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: 'Using MDX'
-description: 'Lorem ipsum dolor sit amet'
-pubDate: 'Jun 01 2024'
-heroImage: '../../assets/blog-placeholder-5.jpg'
----
-
-This theme comes with the [@astrojs/mdx](https://docs.astro.build/en/guides/integrations-guide/mdx/) integration installed and configured in your `astro.config.mjs` config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.
-
-## Why MDX?
-
-MDX is a special flavor of Markdown that supports embedded JavaScript & JSX syntax. This unlocks the ability to [mix JavaScript and UI Components into your Markdown content](https://docs.astro.build/en/guides/markdown-content/#mdx-features) for things like interactive charts or alerts.
-
-If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.
-
-## Example
-
-Here is how you import and use a UI component inside of MDX.
-When you open this page in the browser, you should see the clickable button below.
-
-import HeaderLink from '../../components/HeaderLink.astro';
-
-
- Embedded component in MDX
-
-
-## More Links
-
-- [MDX Syntax Documentation](https://mdxjs.com/docs/what-is-mdx)
-- [Astro Usage Documentation](https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages)
-- **Note:** [Client Directives](https://docs.astro.build/en/reference/directives-reference/#client-directives) are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default.
diff --git a/src/content/config.ts b/src/content/config.ts
index 8763547..795e6d0 100644
--- a/src/content/config.ts
+++ b/src/content/config.ts
@@ -2,20 +2,15 @@ import { defineCollection, z } from "astro:content";
const blog = defineCollection({
type: "content",
- schema: z.object({
- title: z.string(),
- description: z.string().optional(),
- pubDate: z.coerce.date(),
- updatedDate: z.coerce.date().optional(),
- draft: z.boolean().optional().default(false),
- // Optional if you use hero images in your layout:
- heroImage: z
- .object({
- src: z.string(),
- alt: z.string().optional(),
- })
- .optional(),
- }),
+ schema: ({ image }) =>
+ z.object({
+ title: z.string(),
+ description: z.string().optional(),
+ pubDate: z.coerce.date(),
+ updatedDate: z.coerce.date().optional(),
+ draft: z.boolean().default(false),
+ heroImage: image().optional(),
+ }),
});
export const collections = { blog };
diff --git a/src/layouts/BlogPost.astro b/src/layouts/BlogPost.astro
index 2c79f3b..3ad3b31 100644
--- a/src/layouts/BlogPost.astro
+++ b/src/layouts/BlogPost.astro
@@ -1,86 +1,88 @@
---
-import { Image } from 'astro:assets';
-import type { CollectionEntry } from 'astro:content';
-import BaseHead from '../components/BaseHead.astro';
-import Footer from '../components/Footer.astro';
-import FormattedDate from '../components/FormattedDate.astro';
-import Header from '../components/Header.astro';
+import { Image } from "astro:assets";
+import type { CollectionEntry } from "astro:content";
+import BaseHead from "../components/BaseHead.astro";
+import Footer from "../components/Footer.astro";
+import FormattedDate from "../components/FormattedDate.astro";
+import Header from "../components/Header.astro";
-type Props = CollectionEntry<'blog'>['data'];
+type Props = CollectionEntry<"blog">["data"];
-const { title, description, pubDate, updatedDate, heroImage } = Astro.props;
+const { title, description, pubDate, updatedDate, heroImage } = Astro.props as Props;
---
-
-
-
-
+
+
+
+
-
-
-
-
-
- {heroImage && }
-
-
-
-
-
- {
- updatedDate && (
-
- Last updated on
-
- )
- }
-
-
{title}
-
-
-
-
-
-
-
-
+
+
+
+
+ {heroImage && (
+
+
+
+ )}
+
+
+
+
+
+ {updatedDate && (
+
+ Last updated on
+
+ )}
+
+
{title}
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro
index b8ed93b..86f731b 100644
--- a/src/pages/blog/[...slug].astro
+++ b/src/pages/blog/[...slug].astro
@@ -1,24 +1,24 @@
---
-import { type CollectionEntry, getCollection, render } from 'astro:content';
-import BlogPost from '../../layouts/BlogPost.astro';
+import { type CollectionEntry, getCollection, render } from "astro:content";
+import BlogPost from "../../layouts/BlogPost.astro";
export async function getStaticPaths() {
- const posts = await getCollection('blog');
+ const posts = await getCollection("blog");
- return posts
- .filter((post) => !(post.data as { draft?: boolean }).draft)
- .map((post) => ({
- params: { slug: post.id },
- props: post,
- }));
+ return posts
+ .filter((p) => !(((p.data as any).draft) ?? false))
+ .map((post) => ({
+ params: { slug: post.id },
+ props: post,
+ }));
}
-type Props = CollectionEntry<'blog'>;
+type Props = CollectionEntry<"blog">;
const post = Astro.props as Props;
const { Content } = await render(post);
---
-
+
diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro
index be27000..d928f03 100644
--- a/src/pages/blog/index.astro
+++ b/src/pages/blog/index.astro
@@ -7,54 +7,33 @@ import { SITE_DESCRIPTION, SITE_TITLE } from '../../consts';
import { getCollection } from 'astro:content';
const posts = (await getCollection('blog'))
- .filter((p) => !(p.data as { draft?: boolean }).draft)
- .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
+ .filter((p) => !(((p.data as any).draft) ?? false))
+ .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
---
-
-
-
-
-
-
- Sean's Cloud!
- Infrastructure • Cloud • Systems Thinking • Leadership
+
+
+
+
+
+
+ Blog
+ Lab notes, guides, and lessons learned.
-
- seans.cloud is an evolving space focused on building, testing, and refining modern IT and cloud practices with an eye toward what’s next. It serves as a foundation for future projects in cloud architecture, automation, security, and operational excellence—along with the leadership thinking that supports sustainable systems.
-
-
- As this site grows, it will become a place to share practical insights, real-world experiments, and lessons learned from working with infrastructure at scale. Future content may include technical guides, architecture patterns, tooling evaluations, and perspectives on how technology, process, and people intersect to create resilient organizations.
-
-
- On this site you’ll find:
-
- - Technical experiments and lab notes
- - Cloud and infrastructure architecture thinking
- - Reflections on reliability, security, and process
- - Lessons learned from real-world systems
-
-
-
-
- Latest Posts
-
- {posts.length === 0 ? (
- No posts yet. Check back soon.
- ) : (
-
- {posts.map((post) => (
- -
- {post.data.title}
- — {post.data.pubDate.toLocaleDateString()}
- {post.data.description ?
{post.data.description}
: null}
-
- ))}
-
- )}
-
-
-
-
+
+ {posts.map((post) => (
+ -
+ {post.data.title}
+
+
{post.data.pubDate.toLocaleDateString()}
+ {post.data.description ?
{post.data.description}
: null}
+
+
+ ))}
+
+
+
+
+