I’ve always loved the aesthetic of terminal interfaces. There’s something about monospace fonts, dark backgrounds, and carefully chosen accent colors that feels right for a developer’s personal site.
Why TUI?
Most personal sites fall into two camps: either they’re over-designed with animations and gradients, or they’re plain white pages with default fonts. I wanted something different — a site that looks like it belongs in a terminal but works in any browser.
The inspiration came from musicforprogramming.net, which nails this aesthetic perfectly. IBM Plex Mono at ExtraLight weight, a multi-color accent palette, and that signature inverted hover effect.
The Stack
I chose Astro as the framework because it gives me full control over styling while handling content collections beautifully. The alternatives were:
- Quartz — great for Obsidian publishing but too opinionated for custom themes
- SvelteKit — what musicforprogramming.net actually uses, but overkill for a blog
Astro’s content collections with the glob loader and Zod schemas make it trivially easy to validate frontmatter and query articles.
The Obsidian Pipeline
The interesting part is the content pipeline. I write everything in Obsidian, using all the features I love — [[wikilinks]], callouts, embeds. A Node.js publish script pre-processes the markdown before Astro sees it:
- Scans for articles with
published: true - Resolves
> [!warning] Embedded note "embeds" not foundby inlining referenced notes - Copies
> [!warning] Embedded note "images" not foundand rewrites paths - Bakes dataview queries as static tables
// The core of the publish script
const { data: frontmatter, content } = matter(raw);
if (!frontmatter.published) continue;
let processed = resolveEmbeds(content, allFiles, vaultPath);
processed = processDataview(processed);
What’s Next
I’m planning to add an RSS feed, syntax highlighting for more languages, and maybe a search feature using Pagefind. But for now, the site does exactly what I need — publish my thoughts with zero friction.