This repository hosts the Tuva Project Blog as a Quarto site.
The current implementation uses Quarto's website project type with a custom landing page, custom global header, card-based article directory, and article pages with a right-side table of contents.
The goal of this project is to publish practical knowledge about doing healthcare analytics.
- Quarto (site build and search index generation)
- Markdown/Quarto (
.qmd) for content - Custom HTML/CSS/JS for landing page and header behavior
- Static hosting (for example Netlify) serving the generated
_book/output
_quarto.yml: Quarto project config and chapter listindex.qmd: Landing page card grid and client-side search logicabout.qmd: About and contributor guidance pageglobal-header.html: Shared top header injected on all pageshome.css: Global theme, header, landing page, cards, and shared responsive rulesarticle.css: Article page layout, title/byline, and right-side TOC behaviorimg/blog/: Hero/card images_book/: Generated static site output (build artifact)
Prerequisite: install Quarto.
Build the site:
quarto renderPreview with Quarto:
quarto previewIf you want to serve the already-rendered _book/ output directly:
python3 -m http.server 5117 -d _bookThen open http://127.0.0.1:5117.
- A post is a
.qmdfile in the project root. - A post appears in the site only if it is listed under
project.renderin_quarto.yml. - The landing page cards are manually authored in
index.qmd.
- Create a new
.qmdfile with front matter (title,date,toc, etc). - Add a hero image under
img/blog/. - Add a card entry in
index.qmd. - Add the
.qmdfile toproject.renderin_quarto.yml. - Run
quarto renderand verify page layout, links, and search behavior.
Search on the landing page is custom and intentionally searches article body content, not only titles.
How it works:
- Quarto generates
_book/search.jsonon each render. - The script in
index.qmdfetchessearch.json. - It merges indexed section/body text into each card's searchable corpus.
- The search input in the header filters visible cards in real time.
Implication: you do not manually maintain search.json. It refreshes when quarto render (or hosting build) runs.
global-header.htmlis included on every page.- Home page shows brand +
Aboutlink + search bar. - Article pages show brand only.
- Article pages render content column plus a right-side sticky TOC.
- TOC is intentionally plain text style (no widget box/border).
These behaviors are controlled by page-level CSS classes set at runtime in global-header.html:
is-homevsis-articlehas-tocvsno-toc
For Netlify (or similar static host):
- Build command:
quarto render - Publish directory:
_book - Local build/cache artifacts (
_book/,.quarto/,_freeze/,.ipynb_checkpoints/) are intentionally gitignored.
Because Quarto renders from source on each build, generated assets like search.json stay current automatically.
When changing layout or navigation:
- Check
index.html(home). - Check
about.html. - Check at least one long article page with TOC.
- Check desktop and mobile widths.
- Confirm header behavior matches expectations on home vs article pages.
- Confirm landing page search still returns expected content terms.
- Open a branch for your changes.
- Keep content and style changes scoped.
- Include screenshots for visual changes.
- Open a PR with summary, testing notes, and any follow-up items.