The Blog Comes Home
For a while, my writing lived on a hosted Ghost blog while this site just linked out to it. That always felt a little off — the whole point of a personal site is that it’s yours, end to end.
So: the blog now lives here. Every post is a markdown file in the site’s repo, rendered at build time, deployed on push. No CMS, no database, no separate service to keep alive.
The setup
The site is SvelteKit + mdsvex, which means posts are markdown but can embed Svelte components when a post needs something interactive. Code blocks are highlighted at build time with Shiki, so there’s zero client-side highlighting JavaScript.
A post is just a file with frontmatter:
---
title: The Blog Comes Home
date: '2026-07-06'
tags:
- meta
published: true
--- And the “engine” that finds them is small enough to quote in full:
export function getPosts(): Post[] {
const modules = import.meta.glob<PostModule>('/src/posts/*.md', { eager: true });
return Object.entries(modules)
.map(([path, module]) => ({
...module.metadata,
slug: path.split('/').pop()!.replace('.md', '')
}))
.filter((post) => post.published)
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
} The whole site prerenders to static HTML — there’s an RSS feed if you want posts as they land.
What’s coming
More writing on the things I spend my days on: LLMs, agents, evals, post-training, and the craft of AI engineering generally.