This repo powers franciscorowe.com as a Quarto website with committed static output in _site/.
- Source pages are rendered from root
.qmdfiles listed in_quarto.yml. - Netlify deploys the committed
_site/output, not a fresh build. - The Netlify build command in
netlify.tomlrunsscripts/netlify-preflight.sh, which only checks that_site/exists and is complete enough to publish. - If source content changes,
_site/must usually be re-rendered and committed too.
- Root pages:
index.qmdbio.qmdprojects.qmdmigration-sentiment-digital-technology-ai.qmdhuman-mobility-and-hazards.qmdpapers.qmdcourses.qmdblog.qmdtalks.qmdresources.qmd
- Blog content lives in
content/post/ - Talks content lives in
content/talks/ - Styles and shared assets live mainly in
assets/ - Rendered static output is tracked in
_site/
blog.qmd is not a simple Quarto listing page. It contains custom R code that:
- scans
content/post/ - builds the blog index page
- renders standalone post pages to
_site/post/<slug>/index.html - generates summaries and estimated reading time
- supports
subtitle:in front matter - injects a reusable
Suggested citationblock - injects a BibTeX block
- supports optional
doi:front matter - shows a DOI badge when a DOI exists
Useful front matter fields for posts:
---
title: "Post title"
subtitle: "Optional subtitle"
author: "Francisco Rowe"
date: "2026-04-09"
categories: ["reflections"]
archive: "zenodo"
doi: "10.5281/zenodo.xxxxxxx"
---Important gotcha:
- Some older posts have both
.qmdand.htmlfiles incontent/post/ - The custom blog logic can end up preferring stale companion HTML
- If a post edit does not show up, check whether a same-name
.htmlfile is overriding the.qmd
talks.qmd is also custom. It reads content/talks/**/index.md and renders:
- a talks card grid
- talk descriptions below
- optional links for slides, video, and related pages
- YouTube embeds when
url_videois present
Per-talk media convention:
- each talk folder can include
featured.png,featured.jpg,featured.jpeg, orfeatured.webp
Important gotcha:
- the repo uses Quarto freeze globally with
execute: freeze: auto - if talk updates do not appear, the stale cache is often
_freeze/talks/execute-results/html.json - deleting that file and re-running
quarto renderusually fixes missing talk updates
There is already a scaffold for future post-level DOI automation with Zenodo:
- workflow:
.github/workflows/zenodo-post-doi.yml - helper script:
scripts/zenodo_stage_post.py
Current status:
- it does not mint DOIs yet
- it stages posts marked
archive: zenodothat do not yet have a DOI - it writes candidate metadata to
tmp/zenodo-post-candidates.json
- Deployment happens by pushing to
main - Netlify publishes the committed
_site/ - This means broken or partial local renders can be deployed if
_site/is committed in a bad state
Practical implication:
- treat
_site/as a deploy artifact that still needs review - if a render fails midway, do not blindly stage the resulting
_site/diff
- Dropbox-backed filesystem can sometimes interfere with render moves and leave a half-rendered
_site/ - stale
_freezeoutput can hide changes, especially ontalks.qmd - stale
.htmlfiles incontent/post/can shadow updated.qmdposts - updating a source asset is not enough if the deployed version comes from
_site/
- Edit source content.
- Run
quarto render. - Inspect the resulting
_site/diff carefully. - Commit both the source changes and the corresponding
_site/updates. - Push to
mainto trigger Netlify deployment.
Useful commands:
quarto render
quarto preview --no-browser --port 4200
git status --shortWhen talks look stale:
rm -f _freeze/talks/execute-results/html.json
quarto renderBlog posts:
content/post/2026-03-31-debias-workshop-symposium.qmdcontent/post/2026-04-04-reliefweb-iran-digital-trace-report.qmdcontent/post/2026-04-05-when-good-work-doesnt-travel.qmdcontent/post/2026-04-07-worldpop-scale-sustainability.qmd- refreshed
content/post/2021-02-08-count_data_modelling.qmd
Talks:
- updated
content/talks/2026_hnpw_panel/index.md - added
content/talks/2026_uy_social_sciences/index.md
If opening a new chat for feature work, point it first at:
_quarto.ymlnetlify.tomlblog.qmdtalks.qmd.github/workflows/zenodo-post-doi.ymlscripts/zenodo_stage_post.py
At the time this brief was written, the working tree already had unrelated local changes under _site/ from a render diff. Any new work should inspect git status first and avoid mixing unrelated render artifacts into future commits.