Building a TUI Website with Obsidian and Astro

2026-04-18 · 1 min read · web astro obsidian tui


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:

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:

  1. Scans for articles with published: true
  2. Resolves > [!warning] Embedded note "embeds" not found by inlining referenced notes
  3. Copies > [!warning] Embedded note "images" not found and rewrites paths
  4. 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.