Rebuilding this site with Astro
I rebuilt this site again. It looks the same — same typography-first theme, same pages — but everything underneath is different. Jekyll is out, Astro is in. The output is still plain static HTML on GitHub Pages at vajradevam.in, just produced by a saner pipeline.
Why leave Jekyll?
Nothing was broken, exactly. But the project had accumulated the usual Jekyll cruft: _layouts, _includes, _data, root-level blog.html / tags.html / projects.html, a Gemfile with vendor/bundle weighing 84 MB locally, a one-off generate.js plus a GitHub Action just to list PDFs, and client-side fallbacks hitting the GitHub API. Layout and structure were the mess, not the design.
Astro fits this site well: content collections for the blog, TypeScript data files instead of YAML sprawl, file-based routing, zero JavaScript by default, and static output that deploys to Pages via the official deploy-pages action. No Ruby toolchain, no vendor/, no _site/ committed confusion.
What changed
- Posts moved from
_posts/YYYY-MM-DD-slug.mdtosrc/content/blog/slug.md, with the date living in frontmatter aspubDate. A Zod schema insrc/content.config.tsvalidates every post. - Data moved from
_data/*.ymlto typedsrc/data/*.ts— projects, publications, patents, experience, skills, now, categories. - Layouts are
src/layouts/Base.astro,Page.astro, andPost.astroinstead of Liquid templates. Components are justNav.astroandFooter.astro. - Writings got the biggest simplification. PDFs live in
public/writings/and the page reads that directory at build time withnode:fs. Nolist.json, no extra workflow, no API fallback. - Highlighting switched from Rouge to Shiki (
github-dark). Container styling stayed insrc/styles/global.css. - Feeds: canonical
/rss.xml, with/feed.xmlkept as an alias so old subscribers don’t break. Sitemap is automatic.
Old URLs are preserved: /blog/<slug>/, /tags/#<tag>, /projects/, /research/, /writings/.
Writing a post now
Create src/content/blog/<slug>.md:
---
title: "Your title here"
pubDate: 2026-10-08
tags: [technical, c]
description: "A one-line summary shown in the post list."
---
Your post body goes here, in Markdown.
Fenced code blocks get Shiki highlighting. Add math: true to the frontmatter on posts that need LaTeX, and MathJax loads only there.
Push to master and the deploy action builds (npm ci + npm run build) and publishes dist/. Local preview is npm run dev at http://localhost:4321 — note the port change from Jekyll’s 4000.
Same words, less machinery. That’s the whole point.
all posts