This is my personal website built with Sphinx and MyST Markdown, deployed to GitHub Pages.
Live site: https://mjboos.github.io
This site includes:
- Blog: Posts about Python, machine learning, neuroscience, and data science
- Publications: Academic publications and preprints
- Projects: Open source projects and tools
- Static Site Generator: Sphinx with MyST-NB
- Theme: PyData Sphinx Theme
- Blog: ABlog
- Package Manager: uv (fast Python package installer)
- Deployment: GitHub Actions → GitHub Pages
- uv (recommended, 10-100x faster than pip)
- OR Python 3.11+ and pip
macOS and Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"With pip:
pip install uvSee uv installation docs for more options.
-
Install dependencies:
uv sync
This creates a virtual environment and installs all dependencies from
pyproject.toml. -
Build the site:
# Build with uv run (recommended) uv run sphinx-build -b html . _build/html # Or use nox uv run nox -s docs
-
Live preview (with auto-reload):
uv run nox -s docs -- live
This will open the site in your browser at
http://localhost:8000and automatically rebuild when you make changes.
If you prefer pip over uv:
pip install -r requirements.txt
sphinx-build -b html . _build/htmlNote: You may encounter installation issues with ablog (specifically with feedgen). If so, try:
pip install --no-build-isolation ablogThe built site will be in _build/html/.
.
├── blog/ # Blog posts organized by year
│ ├── 2020/
│ ├── 2021/
│ └── 2022/
├── _static/ # Static assets (CSS, images, etc.)
├── _templates/ # Custom Sphinx templates
├── conf.py # Sphinx configuration
├── pyproject.toml # Project metadata and dependencies
├── uv.lock # Lockfile for reproducible builds
├── .python-version # Python version specification
├── index.md # Homepage
├── about.md # About page
├── blog.md # Blog index
├── publications.md # Publications list
├── projects.md # Projects list
├── requirements.txt # Python dependencies (for pip compatibility)
└── noxfile.py # Build automation
- Create a new markdown or Jupyter notebook file in
blog/YYYY/(where YYYY is the year) - Add frontmatter:
--- date: "YYYY-MM-DD" author: Moritz Boos tags: - tag1 - tag2 --- # Post Title Content goes here...
Simply place a .ipynb file in blog/YYYY/ with appropriate metadata. The notebook will be rendered directly.
Dependencies are managed in pyproject.toml under the [project] section.
-
Add the package to
pyproject.toml:[project] dependencies = [ # ... existing deps "new-package>=1.0", ]
-
Update lockfile and install:
uv lock uv sync
# Update all dependencies to latest compatible versions
uv lock --upgrade
# Update a specific package
uv lock --upgrade-package sphinx
# Install updated dependencies
uv syncrequirements.txt is kept for backward compatibility with pip users, but pyproject.toml is the source of truth.
The site is automatically deployed to GitHub Pages via GitHub Actions when you push to the master branch.
The workflow is defined in .github/workflows/deploy.yml.
Main configuration is in conf.py. Key settings:
- Extensions: myst_nb, ablog, sphinx_design, sphinx_copybutton, sphinxext.opengraph
- Theme: pydata_sphinx_theme
- Blog settings: Post pattern, feeds, excerpts
- Notebook execution: Currently set to "off" (change to "cache" to execute during build)
This site was migrated from Jekyll to MyST+Sphinx. See MIGRATION_NOTES.md for details.
Content is licensed under CC BY 4.0.