The source for steele-research.com, authored with Quarto and deployed to GitHub Pages.
Open website.Rproj in RStudio. The project uses reproducible defaults: it does not restore .RData, save the workspace, or save command history automatically.
Quarto is included with current versions of RStudio and can also be installed from quarto.org. From the RStudio Terminal, start a local preview with:
quarto previewThe preview runs at http://localhost:1313. It refreshes after source changes; stop it with Ctrl+C. Draft posts are visible in preview but excluded from production builds.
If you prefer to stay in the R console, install the quarto R package once and use its equivalent project commands:
install.packages("quarto") # once only
quarto::quarto_preview()
quarto::quarto_render()Run a complete production render before publishing substantial changes:
quarto renderThe generated _site/ directory is ignored by Git and should not be committed.
These are the hand-edited sources:
| Component | File |
|---|---|
| Home-page wording and sections | index.qmd |
| About page | about/index.qmd |
| Detailed declaration of interests | declaration-of-interests/index.qmd |
| Consulting page | consulting/index.qmd |
| Research-page heading and introduction | research/index.qmd |
| Video-page heading and introduction | videos/index.qmd |
| Writing-page heading and listing settings | writing/index.qmd |
| Notes index | notes/index.qmd |
| Essays index | essays/index.qmd |
| Navigation, site title, description, favicon, resources, and rendering options | _quarto.yml |
| Shared language and date formatting | _metadata.yml |
| Colours, typography, spacing, responsive layout, and component styling | css/main.css |
| Shared footer | includes/site-footer.html |
| Logos and other shared images | images/ |
| Publication filtering and other browser behaviour | js/library.js and includes/research-script.html |
Most page prose is ordinary Quarto Markdown. Some page structures use raw HTML blocks so that the custom layout classes in css/main.css can be applied. Edit the words inside those blocks normally, but retain the surrounding tags and class names unless you are deliberately changing the layout.
Do not directly edit includes/home-library.html, includes/home-latest.html, includes/research-archive.html, or includes/video-archive.html. They are generated from the publication, writing, and video sources and will be overwritten. The latest published notes and essays appear on the home page automatically; drafts do not.
data/publications.json is the current source of truth for the publication archive. Each publication is an object like this:
{
"year": 2026,
"date": "2026-08-09",
"title": "Publication title",
"authors": "First Author, James Steele",
"type": "article",
"category": "article",
"topics": ["Resistance training", "Research methods & statistics"],
"venue": "Journal name",
"url": "https://doi.org/10.xxxx/example",
"full_text": "",
"preprint_url": "https://doi.org/10.xxxx/preprint",
"peer_review_url": "https://doi.org/10.xxxx/peer-review",
"correction_url": "https://doi.org/10.xxxx/correction",
"presentation_url": "https://example.com/slides",
"video_url": "https://example.com/video",
"open_access": false
}To add a publication, copy an existing object and change its fields. The generated archive automatically sorts objects by date, newest first, so their position in the JSON file does not control their displayed order. To correct or remove a publication, search this file by DOI or title and edit or delete the complete object. Keep the commas between objects and leave the file as valid JSON.
When the source confirms only a month and year, use the first day of that month in date so the value remains sortable (for example, "date": "2026-08-01") and add "date_precision": "month". This records that the day is a technical placeholder rather than a claimed publication day.
topics is a list, so one output can belong to several subject areas. Reuse the existing topic labels to keep the archive filter concise. Topics appear on each archive entry and are available in both the Topic dropdown and free-text search.
When a preprint is subsequently published, update the existing object rather than adding a second one. Set type and category to article, put the publisher or article DOI in url, and retain the preprint DOI or landing page in preprint_url. The archive will then show one article entry with separate Original URL and Preprint buttons. Omit preprint_url when no preprint exists.
For an article with openly available peer reviews and author responses, put the URL of the PCI evaluation or other complete review record in peer_review_url. The archive will add a Peer review button to the article entry. Omit peer_review_url when no open review record exists; do not add the reviews or responses as separate research outputs.
When an article has an erratum or correction, put its DOI or landing page in correction_url. The archive will add a Correction button to the original article entry, so the correction does not need to appear as a separate research output.
For a presentation with separately hosted slides or a recording, put the slide-deck URL in presentation_url and the recording URL in video_url. The archive will add Slides and Video buttons to the same presentation entry. Either field can be omitted when that version is unavailable.
For a remotely hosted open copy, put its URL in full_text. To host an author-shareable PDF locally:
- Give the PDF a short, descriptive filename and place it in
publications/. - Set
full_textto/publications/filename.pdf. - Optionally add
full_text_label, such as"Author manuscript"or"Preprint PDF". - Confirm that the version is one you are entitled to share before publishing it.
data/publication_overrides.json preserves preprint links, local full-text links, and other corrections when the catalogue is rebuilt from OpenAlex data. If you add a preprint link, local PDF, or correction to data/publications.json, make the equivalent DOI-keyed entry in the overrides file so a future bulk rebuild does not discard it.
After changing publication data, regenerate the displayed archive:
python scripts/render_quarto_data.pyFor an occasional bulk rebuild from downloaded OpenAlex result pages:
python scripts/build_publications.py path/to/openalex-page-*.json --output data/publications.json
python scripts/render_quarto_data.pyReview the resulting changes before committing; external databases can introduce duplicates, changed titles, or less useful links.
data/videos.yaml is the source of truth for the video library. Add a new video at the top in this form:
- title: Video title
url: https://www.youtube.com/watch?v=VIDEO_ID
duration: 12:34
category: Research talkEdit or remove the corresponding four-line entry to update or remove a video. Categories are free text, but reusing existing labels keeps the archive consistent. Then regenerate the displayed archive:
python scripts/render_quarto_data.pyThe GitHub deployment also runs this generator automatically, but running it locally lets you inspect the updated archive in preview before publishing.
Notes are intended for short observations, links, working ideas, research updates, or compact commentary. Create a dated page bundle, for example:
notes/2026/08/my-note/index.qmd
In RStudio, create the folders through the Files pane, copy templates/note.qmd to the new folder, and edit it. Alternatively, from a PowerShell terminal:
New-Item -ItemType Directory -Path "notes/2026/08/my-note"
Copy-Item "templates/note.qmd" "notes/2026/08/my-note/index.qmd"Replace the template title, description, and YYYY-MM-DD date. Leave kind: "Note" and draft: true while writing.
Essays use the same page-bundle approach, for example:
essays/2026/my-essay/index.qmd
Copy templates/essay.qmd into the new folder. Images, data, bibliographies, and other supporting files can live beside index.qmd, keeping each essay self-contained.
Useful Quarto patterns include:

An in-text citation [@citation-key].
## A section headingFor citations, add this to the essay's YAML header and place the bibliography beside the essay:
bibliography: references.bibQuarto also supports equations, footnotes, cross-references, callouts, figures, tables, and executable R, Python, or Julia code cells. To give a long essay its own table of contents, add:
toc: trueThe project uses freeze: auto. If a post contains executable code, render it locally and commit both its source/supporting files and any generated _freeze/ output. This allows GitHub to publish the computed result without needing your complete local analytical environment.
For either a note or an essay:
- Preview it locally and check links, figures, citations, and mobile-width layout.
- Replace
draft: truewithdraft: false, or remove thedraftline. - Run
quarto renderfor a final production check. - Commit and push the source to
master.
The post will automatically appear in the combined Writing page and in its Notes or Essays index. Its title, description, date, and kind come from the YAML header.
You can use RStudio's Git pane:
- Review the changed files.
- Stage the files that belong to the update.
- Commit with a short description.
- Push to GitHub.
Or use the RStudio Terminal:
git status
git add path/to/changed-file
git commit -m "Describe the website update"
git push origin masterPushing to master runs .github/workflows/quarto.yaml. GitHub regenerates the research and video fragments, renders _site/, and deploys it to GitHub Pages. Deployment progress is visible in the repository's Actions tab. The repository's Settings → Pages → Build and deployment → Source must remain set to GitHub Actions.
Routine wording or post changes therefore follow this loop:
Open website.Rproj → edit .qmd files → preview → render → commit → push
Publication and video changes add one step:
Edit data → regenerate includes → preview → render → commit → push
The previous Wowchemy/Hugo site remains recoverable from Git history.