This is a Quarto-based static website deployed to GitHub Pages. It serves as a personal research blog focused on quantitative finance, data science, and machine learning. Content is organized as multi-part series and standalone notes.
docs/ (GitHub Pages publishes from here).qmd), Jupyter notebooks (.ipynb), Python, JavaScriptexecute: enabled: false in _quarto.yml). Posts contain static code blocks only.├── _quarto.yml # Main Quarto config (theme, navbar, format)
├── index.qmd # Homepage
├── styles.css # Global CSS
├── references.bib # Shared bibliography (BibTeX)
├── posts/ # Published posts (each in posts/<slug>/index.qmd)
│ └── _metadata.yml # Shared post metadata (bibliography path)
├── pages/ # Navigation pages (series, notes, projects, categories, about, search)
├── scripts/ # Python build utilities
│ ├── generate_indexes.py # Pre-render: generates pages/ from post metadata
│ ├── new_post_from_notebook.py # Creates draft notebooks
│ └── preview_notebook_post.sh # Previews notebook as rendered post
├── blog_styles/ # Python plotting/table style library
├── data/ # YAML data files (projects.yml)
├── assets/ # Static images and media
├── _includes/ # HTML templates (nav.html)
├── drafts/ # Private notebook drafts (ignored by Quarto)
├── tests/e2e/ # Playwright smoke tests
├── docs/ # Rendered output (committed for GitHub Pages)
└── .github/workflows/ # CI and deploy pipelines
# Full site render (also runs generate_indexes.py as pre-render step)
quarto render
# Render a single post
quarto render posts/<slug>/index.qmd
# Render a single page
quarto render pages/<name>.qmd
# Live preview with hot reload
quarto preview
# Run E2E smoke tests (requires Playwright installed)
npm test
# Serve rendered docs locally
npm run serve:docsBuild: npm run build (alias for quarto render). The pre-render hook automatically runs python3 scripts/generate_indexes.py to regenerate index pages from post metadata.
Test: npm test runs Playwright E2E tests against the rendered docs/ directory. Tests cover search filtering and bibliography rendering.
CI: On every PR and push to main, GitHub Actions (.github/workflows/ci.yml): 1. Renders the site with quarto render and fails on any WARN-level messages 2. Runs Playwright smoke tests
Always ensure quarto render produces zero warnings before pushing.
Each post lives in posts/<slug>/index.qmd with YAML frontmatter:
---
title: "Post Title"
date: YYYY-MM-DD
description: "One sentence summary"
categories: [Category1, Category2]
content-type: "series" # or "note"
series-id: "series-slug" # if series
series-title: "Series Name"
series-part: 1
project-ids: [project-id] # optional
---Draft privately, publish when ready:
# Create a draft notebook
python scripts/new_post_from_notebook.py --slug <slug> --title "<Title>" \
--categories "Cat1, Cat2" --description "One sentence"
# Preview as rendered post
scripts/preview_notebook_post.sh drafts/<slug>.ipynb <slug>
# Publish: keep posts/<slug>/index.qmd, leave notebook in drafts/Draft files are excluded via .quartoignore: drafts/, posts/**/draft.ipynb, posts/**/_draft.ipynb.
scripts/generate_indexes.py scans all posts/*/index.qmd files and auto-generates: - pages/series.qmd — posts grouped by series - pages/notes.qmd — standalone notes - pages/projects.qmd — from data/projects.yml - pages/categories.qmd — category listings
This runs automatically as a Quarto pre-render hook. Do not edit generated pages manually.
references.bib (BibTeX format, shared across all posts)posts/_metadata.yml@taylor2004 in post body; a References section is generated automaticallytheme: none), Charter/Georgia serif fonts#8B4513 (saddle brown), background #FDFCF9 (off-white), text #292524blog_styles Python package for consistent Matplotlib/table stylingThese rules apply to all post content. Follow them strictly.
:=. Use = with phrases like “where” or “defined as”.volatility-forecasts-1)posts/*/index.qmd — publish as .qmd, not .ipynb_includes/nav.html (referenced in _quarto.yml)pages/search.qmd) uses custom JS filtering over Quarto listingsdocs/ directory is committed to the repo for GitHub Pages deployment