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:
All content lives in plain Markdown files that are easy to edit and version-control.
The site builds fast and deploys automatically on every push.
My CV stays in sync with the website content without manual copy-pasting.
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:
Rich components: Dropdowns, grids, cards, admonitions, and cross-references are all available as simple directives. For example, the Software page uses
:::{card}directives to display each open-source package as a clickable card, and the Research page uses:::{dropdown}directives to organize publications by year.Frontmatter-driven: Each page declares its title and metadata in YAML frontmatter. A single
myst.ymlconfiguration file defines the table of contents, site options, and theme settings.Book theme: The built-in book theme provides a clean, responsive layout with a sidebar, table of contents, and search -- all without custom templates.
Fast builds: Running
myst build --htmlcompiles the entire site in seconds.
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:
Edit content in Markdown (e.g., add a new publication to
research.md).Push to GitHub.
GitHub Actions runs
myst build --htmlto build the website.A small post-build script runs
python inject_comments.pyto add thegiscuscomment widget to blog post pages.The same workflow runs
python generate_cv.pyto producecv.typ.Typst compiles
cv.typintocv.pdf.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:
Pull request previews: Every PR triggers a build and deploys a preview to Netlify, making it easy to review changes before merging.
Production deployment: Pushing to
mainbuilds the HTML, injects blog comments withgiscus, generates the CV PDF, and deploys everything to GitHub Pages.
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:
No backend to maintain: Comments are handled through GitHub Discussions, so the static site stays static.
Open by default: Discussions are public, searchable, and tied to the same repository that hosts the website.
Easy moderation: Managing comments happens through GitHub’s existing moderation tools.
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:
index.md-- Home page with highlights and recent newsabout.md-- Biography, education, and appointmentsresearch.md-- Patents, books, publications, and grantssoftware.md-- Open-source packages displayed as cardsbooks.md-- Published booksteaching.md-- Courses and mentoringtalks.md-- Workshops, invited talks, and conference presentationsawards.md-- Awards and honorsservices.md-- Professional and institutional servicemedia.md-- Social media and press coverageblog.md-- Blog posts (you are reading one now)contact.md-- Contact information
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¶
Single source of truth works. Having the CV pull from the same Markdown files as the website eliminates drift between the two. Every change is reflected everywhere.
MyST directives are powerful. Cards, dropdowns, and grids cover most layout needs without resorting to raw HTML.
Typst is a real alternative to LaTeX. Compilation is fast, the syntax is readable, and the package ecosystem is growing. For documents like CVs and reports, it is a strong choice.
Small post-build scripts go a long way. MyST handles almost everything out of the box, and lightweight additions like the
giscusinjector are enough to fill the remaining gaps.Keep it simple. A static site generator, a CI pipeline, and a PDF compiler are all you need. No databases, no CMS, no server-side rendering.