My personal academic website built with Quarto and R. The site includes my research, publications, talks, CV, blog posts, and a "Now" page.
Live site: https://lorenzofabbri.github.io/epilorenzo
-
Clone the repository:
git clone https://github.com/lorenzoFabbri/epilorenzo.git cd epilorenzo -
Restore R packages with renv:
R -e "renv::restore()" -
Render the website:
quarto render
-
Preview locally:
quarto preview
The website is built into the docs/ directory and served via GitHub Pages.
Publications are managed via publications.yml. New journal articles are automatically discovered from ORCID weekly (via the orcidtr R package), and publication pages are generated using a Python script that fetches metadata from CrossRef (primary) or DOI content negotiation / DataCite (fallback).
When new papers are found, a GitHub Issue is opened listing them so you can add categories and links.
research/articles/— Published journal articles and conference papersresearch/posters/— Conference postersresearch/working-papers/— Preprints and works in progress (managed manually)
On the first Monday of every month at 08:00 UTC, a GitHub Actions workflow:
- Queries ORCID for new
journal-articleworks (viascripts/discover_publications.R) - Appends any new DOIs to
publications.ymlwith empty categories - Generates/updates all publication pages (via
scripts/generate_publications.py) - Commits changes and opens a GitHub Issue if new papers were added
- Triggers the website deployment workflow automatically once complete
# Discover new ORCID articles locally
Rscript scripts/discover_publications.R
# Generate pages from publications.yml
python scripts/generate_publications.py
# Preview without writing files
python scripts/generate_publications.py --dry-runAdd an entry to publications.yml under articles or posters:
articles:
- doi: 10.xxxx/xxxxx
slug: fabbri2024title # optional, auto-generated if omitted
categories:
- Epidemiology
github: https://github.com/lorenzoFabbri/my-paper
extra_links:
- name: Preprint
url: https://...
icon: fa-solid fa-file-pdfThen run the generation script:
python scripts/generate_publications.pyThe page will be written to research/articles/{slug}/index.qmd and appear automatically on the Research page.
Talks are listed in talks/talks_2025.yml and rendered via a custom EJS template. Add new entries directly to the YAML file; the page at talks.qmd reads from it automatically.
-
Create a folder under
posts/:mkdir -p posts/my-new-post
-
Create
index.qmdwith frontmatter:--- title: "My Post Title" description: "Short description" author: "Lorenzo Fabbri" date: "2025-01-15" categories: [research, methods] ---
-
Write content in markdown/Quarto and render:
quarto render
The website automatically deploys to GitHub Pages after the Update Publication Pages workflow completes (i.e., once a month on the first Monday). It can also be triggered manually via workflow_dispatch. Make sure:
- GitHub Pages is enabled in repository settings
- Source is set to "GitHub Actions"
- The workflow has proper permissions
The "Now" page fetches currently-reading books from Hardcover via the scripts/hardcover.R script.
Setup:
-
Get your API token from https://hardcover.app/account/api
-
Create
_hardcover_config.Rwith your credentials (see.gitignore— this file is not tracked):HARDCOVER_API_TOKEN <- "your-token-here" HARDCOVER_USER_ID <- "your-user-id"
Content © 2026 Lorenzo Fabbri. Code is MIT licensed.