Website Maintenance Guide

Personal academic website built with Quarto.
Live URL: https://lasaibarrenada.github.io/
Source repo: https://github.com/LasaiBarrenada/LasaiBarrenada.github.io/


Quick Reference

What do you want to update? File to edit
Bio text / photo index.qmd
Add a new project projects/projects.xlsx
Add a conference talk speaking/conferences.xlsx
Add a CV entry (job, education, award…) cv/cv.qmd
Add a publication to the CV PDF cv/peer_bib.bib
Replace the CV PDF cv/cv.pdf
Refresh publications network (new paper) Delete _freeze/Publications/ then render
Replace navbar logo img/lb_logo_opt1.svg
Replace browser tab icon (favicon) img/favicon.svg
Change navbar links or social icons _quarto.yml
Change global font / colours html/styles.scss
Change landing-page styles html/landing_page_styles.css
Change page footer text _quarto.ymlpage-footer
Update “last updated” date _variables.yml
Edit the license page license/index.qmd

1. How to Rebuild and Deploy

Render the site locally (generates _site/):

quarto render

Preview locally (hot-reload):

quarto preview

Publish to GitHub Pages:

quarto publish gh-pages

This pushes the rendered _site/ to the gh-pages branch automatically.


2. The Freeze Mechanism

execute: freeze: true is set globally in _quarto.yml. This means:

  • R code chunks are only executed once. Results are cached in _freeze/.
  • On subsequent renders Quarto uses the cached output — it does not re-run R.
  • This keeps the build fast and reproducible without needing R dependencies installed on the server.

Exceptions: The Projects and Speaking pages have freeze: false set in their YAML header, so they always re-execute when rendered. This means you can just edit the Excel files and render — no need to delete _freeze/ folders for those pages.

When you MUST delete the freeze cache (to force re-execution on other pages):

Situation Cache folder to delete
New paper on Google Scholar _freeze/Publications/
Any other R-code change The folder matching the changed .qmd

After deleting, run quarto render and the R code will re-execute and create a new cache.


3. Landing Page — index.qmd

Update bio text

The bio lives inside the {=html} block. Edit the three <p> paragraphs directly:

<p>I'm a final-year PhD student at KU Leuven ...</p>

Replace profile photo

  1. Save the new photo as img/lasai_headshot.png (overwrite the existing file).
  2. Recommended: square crop, at least 600×600 px.
  3. No code changes needed — the page references this filename directly.

4. Projects Page — projects/projects-page.qmd

The page is a vertical HTML timeline generated by an R chunk (tl-projects) that reads projects/projects.xlsx. This works the same way as the speaking page — the R code builds the HTML cards from the spreadsheet data.

Because the R output is inserted into Markdown before Pandoc processes it, no line of generated HTML may start with 4+ spaces (same constraint as the speaking page). Keep all sprintf() / paste0() templates at ≤ 3-space indentation.

Add a new project

Open projects/projects.xlsx and add a new row. The columns are:

Column Description Example
Title Paper/project title Clustered Flexible Calibration…
Year Four-digit year 2026
Month Numeric month (used for sorting) 3
Venue Journal name or “arXiv preprint” BMJ Open
Link_1_name Label for the first link Paper
Link_1 URL for the first link https://…
Link_2_name Label for the second link Code
Link_2 URL for the second link https://…
Link_3_name Label for an optional third link (leave blank if none) Package
Link_3 URL for the optional third link https://…
Summary 2–3 sentence plain-language summary Two or three sentences…

If Link_1 is left blank, the project is displayed as Upcoming — grey hollow dot, grey card, and an “Upcoming” badge. Once published, fill in the links and the project switches to the normal blue style.

Freeze is disabled on this page, so just edit the Excel and re-render — no need to delete cache folders.


5. Speaking Page — speaking/speaking-page.qmd

The page has two sections, both driven by R code that reads conferences.xlsx:

  1. Timeline — an R chunk (tl-speaking) reads the Excel, builds HTML cards, and outputs them via cat() with results='asis'.
  2. Map — an R chunk (map-data) geocodes conference cities and injects the coordinates as JSON for the D3 map.

Both the projects and speaking timelines are generated by R. Because the R output is inserted into Markdown before Pandoc processes it, no line of generated HTML may start with 4+ spaces — Pandoc would treat it as a code block and escape the tags. Keep all sprintf() / paste0() templates at ≤ 3-space indentation.

Add a new talk or poster

Open speaking/conferences.xlsx and add a new row. The columns are:

Column Description Example
Conference Full conference name International Society for Clinical Biostatistics
Code_Name Short acronym shown on the timeline ISCB
Year Four-digit year 2026
Month Numeric month (used for sorting) 7
Location City name (used for geocoding the map) Geneva
Title Full talk/poster title Multicenter calibration…
Type Oral or Poster (leave blank for upcoming) Oral
Link_1_name Label for the first link button Slides
Link_1 URL for the first link https://…
Link_2_name Label for an optional second link (leave blank if none) Paper
Link_2 URL for the optional second link https://…

Freeze is disabled on this page, so just edit the Excel and re-render — no need to delete cache folders. Note that the map geocoding will re-run each time, which requires an internet connection.


6. Publications Page — Publications/publications-page.qmd

The page pulls data live from Google Scholar (user ID uPOL3NkAAAAJ) using the scholar R package. The co-authorship network is built automatically from your publication list.

When a new paper appears on Google Scholar

  1. Delete _freeze/Publications/.
  2. Run quarto render.
  3. The R code will re-fetch publications, re-run the deduplication pipeline, and rebuild the network.

Author name deduplication

The pipeline automatically handles accent variants (e.g. M Martinez-GarciaM Martínez-García). For cases that cannot be resolved automatically — typically Dutch/Belgian particle names or abbreviated compound surnames — a manual_corrections vector is defined near the top of the R chunk:

manual_corrections <- c(
  "G Collins"       = "GS Collins",
  "BV Calster"      = "B Van Calster",
  "BD Moor"         = "B De Moor",
  "JYJ Verbakel"    = "JY Verbakel",
  "JF Calatrava"    = "J Fernández Calatrava",
  "JCGS de Cueto"   = "JC Gálvez Sainz de Cueto",
  "Rén Armañanzas"  = "R Armañanzas"
)

If a new co-author appears under two different name formats, add a new entry here:

"Garbled form"  = "Canonical form"

Publication deduplication (preprint + journal)

The pipeline also detects preprint/working-paper duplicates by comparing titles with Jaccard similarity. If a preprint you have on Google Scholar gets published and the two entries persist simultaneously, the preprint will be automatically dropped when Jaccard similarity ≥ 0.28 with the published version. No manual action needed.

The network only shows co-authors with ≥ 2 shared papers

This is controlled by the filter(n_papers >= 2) line in the R chunk. Change 2 to any other threshold if needed.


7. CV

The CV exists in two forms:

File Purpose
cv/cv-page.qmd HTML page shown on the website — renders the CV content directly with styled sections, a table of contents, and a “Download PDF” button at the top
cv/cv.qmd PDF source using quarto-cv-pdf format — generates cv.pdf for download

Both files should be kept in sync when you add new entries.

Add a new entry (job, talk, award, etc.)

Update both files:

  1. cv-page.qmd — Add an entry using the Quarto div pattern:
:::: {.cv-entry}
::: {.cv-entry-title}
Institution Name
:::
::: {.cv-entry-date}
MM/YYYY – MM/YYYY
:::
::::
::: {.cv-entry-detail}
Role description, City
:::
  1. cv/cv.qmd — Add the corresponding entry using LaTeX \hfill for dates:
**Institution Name**

Role description (City) \hfill MM/YYYY–MM/YYYY

Then re-render cv/cv.qmd to regenerate the PDF.

Add a publication to the CV

Publications on the HTML page are rendered automatically from cv/peer_bib.bib using Quarto’s bibliography support (nocite: '@*'). Add the BibTeX entry to the bib file and it will appear on both the HTML page and in the PDF.

BibTeX entry format example:

@article{barrenada2025example,
  author  = {Barreñada, Lasai and Van Calster, Ben},
  title   = {Title of the paper},
  journal = {Journal Name},
  year    = {2025},
  volume  = {10},
  pages   = {123--130},
  doi     = {10.xxxx/xxxxx}
}

Replace the CV PDF only

Overwrite cv/cv.pdf with the new file. The HTML page links to this file via the download button.

Technical notes

  • cv-page.qmd uses engine: knitr (needed for the inline R expression Sys.Date()). Without it, Quarto falls back to Jupyter/Python and fails.
  • cv-page.qmd has freeze: true since publications from the bib file don’t change often. Delete _freeze/cv/cv-page/ when you add a new publication to force re-rendering.

8. Site-wide Settings — _quarto.yml

Change your name or description (appears in browser tab / SEO)

title-meta: "Your Name"
description-meta: "Your description"

Add a new page to the navbar

Add an entry under website: navbar: left::

- text: New Page
  href: folder/new-page.qmd

Then create folder/new-page.qmd with at minimum a YAML header:

---
title: New Page
---

9. Global Styles

File Controls
html/styles.scss Global font (Inter for body and headings), link colours, spacing — applied to all pages
html/landing_page_styles.css Hero section layout on the landing page
html/seo.html Meta tags injected into every page <head>

10. Images and Branding

File Purpose
img/lasai_headshot.png Profile photo on the landing page
img/lb_logo_opt1.svg Navbar logo — “LB” initials with R prompt > and sigmoid curve. Referenced in _quarto.ymlnavbar: logo
img/favicon.svg Browser tab icon — blue rounded square with “LB”. Referenced in _quarto.ymlfavicon
img/website_thumbnail.png Social preview image (Twitter/Open Graph)
projects/*.png Project thumbnail images referenced in the projects page

Replace the favicon

Overwrite img/favicon.svg (or create a new file and update the favicon: path in _quarto.yml). Keep it simple — favicons display at 16–32px.


11. License Page — license/index.qmd

The license page (linked in the footer) contains:

  • An MIT License covering the website source code.
  • A copyright notice for written content, publications, talks, and images.
  • An acknowledgement of the original template by Marvin Schmitt.

Edit license/index.qmd directly. No R code, no freeze cache.


12. Variables File — _variables.yml

Small global variables used across the site (e.g. the “last updated” date in the footer). Edit directly:

last_updated: "February 2026"