Infrastructure

How this blog is built

A static Astro site in a git repository, rebuilt on every commit to main, edited through a CMS

Author: Danylo Pieshkov· Updated

This is the first post on the Podscribe developer blog, so it covers the blog itself. The whole thing is a small static site. There is no server, no database and no admin panel to maintain.

The stack

  • Astro renders Markdown files from src/content/blog into plain HTML at build time.
  • Tailwind CSS and the typography plugin handle layout and article styling. Dark mode is a data-theme attribute on the html element.
  • Expressive Code renders code blocks with a copy button, and Mermaid turns fenced diagrams into SVG in the browser.
  • Pagefind indexes the built pages, so search runs in the browser against static files.
  • The same repository holds the API reference, a Starlight site served under /api/ on the same domain. The two sites share one theme package, and one build assembles both.
  • The hosting builds main on every push and serves the result at developers.podscribe.com.
  • A CMS gives editors a form for the frontmatter fields and a rich-text editor for the body. It commits straight to main.

Why a git repository

Every post is a file. Reviews happen in pull requests, history is git log, and rollback is git revert. Engineers write in their editor; editors who prefer a form use the CMS. Both end up as the same Markdown.

What a deploy looks like

flowchart LR
  A[Save a post in the CMS] --> M[Commit lands on main]
  B[Open a pull request] --> C[CI: lint, types, tests, site build]
  C -->|green| M
  M --> H[Hosting builds the blog and the API reference]
  H --> D[developers.podscribe.com updates]

Code changes go through a pull request, and CI has to pass before it can merge. A CMS save skips the queue and lands on main directly. Either way the hosting picks up the commit and rebuilds both sites in about two minutes. If a post has a broken frontmatter field the build fails and the previous version stays live.

Every post is also Markdown

Append .md to any post URL to get the raw source, and see /llms.txt for the full list. That makes the blog easy to feed to an assistant or a search index.