Artifacts

An artifact is a single deliverable produced for a module (or for the whole course): a slide deck, a handout, an assignment, notes, a syllabus, etc.

Artifacts are declared in course.yaml under a module’s artifacts: list or at the top-level artifacts: list for course-wide documents.


Artifact fields

Field Default Description
id {type}-{index} Unique identifier within the scope (module or course)
type — Drives template resolution and subdirectory placement
enabled true Whether to generate a stub and include it in Quarto configs
overwrite defaults.overwrite or on-force Existing file overwrite policy: on-force, always, or never
status planned Lifecycle status metadata; in the default templates, published and archived are treated as release-ready
visibility public Whether the artifact is included in the public course website and navigation; hidden items are omitted from public links even when generated
file computed Explicit output path; overrides the computed default
output_formats — List of render formats: revealjs, beamer, pdf, website
stub_template auto-resolved Jinja2 template name: string or per-format dict

enabled, overwrite, visibility, and status

These three fields are intentionally independent:

  • enabled: false skips generation entirely.
  • overwrite: on-force allows generate --force to replace an existing stub.
  • overwrite: always replaces an existing stub on every run.
  • overwrite: never preserves an existing stub even when generate --force is used.
  • enabled: true with visibility: hidden still generates the stub file, but it is omitted from the public website navigation and module links.
  • status is informational metadata. The default templates use it mainly to decide whether a document is treated as published or still in progress.

Default file paths

When file: is not set, the generator computes:

content/{subdir}/{scope_id}-{artifact_type}.qmd

where {subdir} is determined by artifact type:

Artifact type Subdirectory
slides content/slides/
handout content/handouts/
notes content/notes/
assignment content/assignments/
syllabus content/
any other content/{type}/

Example: module id: intro with artifact type: slides produces content/slides/intro-slides.qmd.


Output formats

Each artifact declares which Quarto render formats it participates in via the output_formats list. The generator uses this to include the artifact in the correct sub-project _quarto.yml and to emit matching format blocks in the stub front matter.

Format Sub-project Output
revealjs content/slides/ reveal.js HTML slides
beamer content/slides/ Beamer PDF slides
pdf content/handouts/ or content/assignments/ PDF document
website root website project HTML page embedded in course website

Examples

Slides with Beamer PDF

artifacts:
  - id: intro-slides
    type: slides
    enabled: true
    output_formats: [revealjs, beamer]

Handout with website page and PDF download

artifacts:
  - id: intro-handout
    type: handout
    enabled: true
    output_formats: [website, pdf]

Assignment (website + PDF)

artifacts:
  - id: ex01
    type: assignment
    enabled: true
    output_formats: [website, pdf]
    lms:
      release: 2026-10-05
      due: 2026-10-19

Disabled artifact (placeholder for future use)

artifacts:
  - id: project-brief
    type: assignment
    enabled: false

Never overwrite a hand-edited artifact stub

artifacts:
  - id: intro-slides
    type: slides
    overwrite: never
    output_formats: [revealjs, beamer]

Always regenerate a derived artifact stub

artifacts:
  - id: schedule-overview
    type: notes
    overwrite: always
    output_formats: [website]

Pinning a custom template

artifacts:
  - id: my-poster
    type: slides
    output_formats: [revealjs]
    stub_template: poster.qmd.j2              # single template for all formats

  - id: lecture-slides
    type: slides
    output_formats: [revealjs, beamer]
    stub_template:
      default: slides.qmd.j2
      beamer:  slides-beamer.qmd.j2          # per-format override

See Templates & Filters for full template resolution rules.