Personal portfolio site — hero intro, talks & presentations, and writing, built with Astro.
| Command | Action |
|---|---|
npm install |
Install dependencies |
npm run dev |
Start local dev server at localhost:4321 |
npm run build |
Build production site to ./dist/ |
npm run preview |
Preview the build locally before deploying |
Pushing to main triggers .github/workflows/deploy.yml, which builds and deploys to GitHub Pages automatically.
Talks and posts are Astro content collections, defined in src/content.config.ts. Add a new entry by dropping a markdown file into the matching folder — the homepage picks it up automatically, no code changes needed.
Create src/content/presentations/<slug>.md:
---
title: 'Talk title'
event: 'Where it was given'
year: '2026'
description: 'One or two sentences on what the talk covers.'
tags: ['tag1', 'tag2']
url: 'https://link-to-slides'
---Create src/content/posts/<slug>.md with the article body as the markdown content, below the frontmatter:
---
title: 'Post title'
description: 'One or two sentences summarizing the post.'
tags: ['tag1', 'tag2']
sourceUrl: 'https://...' # optional — original/source location, for attribution
notebookUrl: 'https://mybinder.org/...' # optional — Binder link
nbviewerUrl: 'https://nbviewer.org/...' # optional — nbviewer link
---
The rest of the file is the article itself, rendered at `/posts/<slug>/`.Posts are hosted here — the body is the canonical copy. sourceUrl is optional and only for linking back to where the piece originated (e.g. a project repo's own blog folder), not a substitute for the body.
Talks remain link-out only: url is required and should point wherever the slides actually live (a deployed Slidev deck, etc.) — this site doesn't host presentations.
Both collections are schema-validated (see src/content.config.ts); a missing required field or malformed URL will fail the build.