Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Launching My New Website with MyST Markdown and Typst

I am happy to announce the launch of my redesigned personal website, gishub.org. The new site is built entirely with MyST Markdown and uses Typst to automatically generate a PDF version of my CV. In this post, I want to share the motivation behind the rebuild, the tools I chose, and how the pieces fit together.

Why Rebuild?

My previous HTML-based website served me well, but as my publication list, software portfolio, and teaching materials grew, I needed something that could scale without friction. I wanted a system where:

Why MyST Markdown?

MyST Markdown (Markedly Structured Text) extends standard Markdown with directives and roles inspired by reStructuredText. It is developed by the Executable Books community and powers Jupyter Book. What makes MyST a great fit for an academic website:

Automated CV Generation with Typst

One of the most useful parts of this setup is automatic CV generation. A Python script reads the same Markdown files that power the website -- about.md, research.md, software.md, teaching.md, talks.md, awards.md, services.md, and media.md -- and produces a Typst source file.

Typst is a modern typesetting system designed as a faster, more approachable alternative to LaTeX. It compiles in milliseconds and has a clean scripting language. The CV uses the modern-cv package for consistent, professional formatting with Font Awesome icons for social links.

The workflow looks like this:

  1. Edit content in Markdown (e.g., add a new publication to research.md).

  2. Push to GitHub.

  3. GitHub Actions runs myst build --html to build the website.

  4. A small post-build script runs python inject_comments.py to add the giscus comment widget to blog post pages.

  5. The same workflow runs python generate_cv.py to produce cv.typ.

  6. Typst compiles cv.typ into cv.pdf.

  7. Both the website and the PDF are deployed to GitHub Pages.

The result: updating a single Markdown file updates both the website and the CV automatically. No more maintaining a separate LaTeX document.

Deployment Pipeline

The site uses two GitHub Actions workflows:

The entire build-and-deploy cycle takes under two minutes.

Blog Comments with Giscus

One feature I wanted on the new site was a lightweight comment system for blog posts. Instead of adding a database-backed CMS or a third-party discussion platform, I used giscus, which stores comments as GitHub Discussions in the repository.

This approach fits the rest of the site well:

Because the MyST book theme does not provide a built-in comment slot, I added a small post-processing step. After myst build --html finishes, inject_comments.py scans the generated files in _build/html/blog/ and inserts the giscus client script before the closing </body> tag. The script mounts the widget inside the rendered article element, maps each discussion by page URL, and avoids duplicate injection if the page is processed again.

I also added a bit of JavaScript to make the integration feel native to the site. Since the theme can switch between light and dark modes, the script watches the document theme and sends updates to the embedded giscus iframe so the comment panel always matches the current site theme. A few lines in custom.css ensure the widget spans the full article width without breaking the book layout.

Site Structure

The website is organized as a flat set of Markdown files:

All styling is handled by the book theme with a small custom.css override. No JavaScript frameworks, no complex build chains -- just Markdown, a config file, and a theme.

Lessons Learned