How to Write Note Frontmatter

Every note in the Obsidian vault starts with a YAML frontmatter block. The site reads it to decide whether a note is published, to build the Progress page, the learning library, courses and the competency map. This page is the reference for the fields: the build step validates notes against it.

Principle: write each note once. The frontmatter is what lets the site reuse it as a page, flashcards, a course chapter, a quiz and progress data.


Start From a Template

  • Point the Obsidian Templates core plugin at the templates folder (templates/ at the vault root, one template per note type).
  • Create a note with Insert template and pick the matching type.
  • Fill in the fields; delete optional fields you don't use instead of leaving them empty.

Fields

Required on every note

Field Format Meaning
title text Page title. Falls back to the first # heading, but set it explicitly.
type one value, see Types What the note is. Drives which other fields are required.
status planned | in-progress | done | dropped Where you are with it.
visibility public | private Only public notes are copied into this public repo. Default: private.
created YYYY-MM-DD Date the note was created.

Learning fields (source types and lab)

Field Format Meaning
source.title text Title of the course, video, article, podcast or book.
source.author text Author, speaker or instructor.
source.url URL Link to the source, if public.
source.provider text Platform or publisher (Coursera, IAPP, AWS Skill Builder, YouTube…).
started YYYY-MM-DD First study session.
finished YYYY-MM-DD Last session; leave out while status is not done.
time_spent_min integer (minutes) Total time spent. Rough is fine; round to 15 minutes.
sessions list of {date, min} Optional. Per-session log. When present, the site uses it instead of time_spent_min for hours per month.

source is required for course, video, article, podcast and book, optional for lab.

Classification (optional, all types)

Field Format Meaning
tags list Free tags, used by the graph and search.
frameworks list, see Frameworks Regulations and standards the note covers. Drives the library filters.
competencies list of VAE bloc IDs Competency-map evidence. Leave out until the RNCP blocs are known.
course slug Groups the note into a site course (e.g. aigp).
order integer Chapter position inside course.
aliases list Obsidian's alternative names for the note.

Types

type Use it for source
course A course module or certification chapter required
video A talk, webinar or video required
article An article, paper, regulation text or guideline required
podcast A podcast episode required
book A book or book chapter required
lab Hands-on work in the homelab / AI audit lab optional
note A concept note in your own words (permanent note) none, link to the source notes instead
moc A Map of Content: a hub linking related notes none
post A blog post (post-mortem format) none
how-to A step-by-step guide none
reference Reference material, glossaries none

Frameworks

Use these values only, so filters stay consistent. Add a value here before using it in a note.

Value Framework
ai-act EU AI Act
dora Digital Operational Resilience Act
gdpr General Data Protection Regulation
nist-ai-rmf NIST AI Risk Management Framework
owasp-llm OWASP Top 10 for LLM Applications
iso-42001 ISO/IEC 42001 (AI management system)
itil ITIL 4

Publish Public Notes

  • Set visibility: public on the notes to publish.
  • From crud-in-the-cloud, run make content-build.
  • Fix any reported errors: the build checks every public note first and copies nothing if one is invalid.
  • Commit the generated fastapi-app/content/ folder.

The build replaces fastapi-app/content/ entirely, so a note switched back to private (or deleted) disappears from the site on the next build. Never edit that folder by hand.

What the build rejects in a public note:

  • a missing required field, or a value outside the allowed lists (type, status, frameworks…)
  • unknown fields, which are usually typos (framework: instead of frameworks:)
  • a source type without source
  • finished while status is not done, or finished before started
  • order without course, or a course slug that isn't lowercase-with-dashes

Notes without frontmatter, without visibility, or with YAML that doesn't parse are treated as private and never published.

The schema is enforced by NoteFrontmatter in fastapi-app/services/content_service.py. Change both together.

Example

---
title: AIGP Domain 2 – Laws and standards that apply to AI
type: course
status: done
visibility: public
created: 2027-01-12
source:
  title: AIGP Body of Knowledge
  author: IAPP
  url: https://iapp.org/certify/aigp/
  provider: IAPP
started: 2027-01-12
finished: 2027-01-26
time_spent_min: 360
frameworks: [ai-act, gdpr, nist-ai-rmf]
course: aigp
order: 2
tags: [aigp, regulation]
---

Rules

  • Write notes in your own words: no transcripts, no copied passages.
  • Nothing from your employer in a public note: no internal names, incidents, figures or documents. Use the fictional "BankCo" for case studies.
  • When in doubt, keep visibility: private. Making a note public is a deliberate step.
  • Don't rename course slugs once notes are public: they become URLs.
  • End posts, how-tos, labs, notes and reference pages with a ## References section. List primary sources first (the regulation article, official docs, the upstream issue), with one line each on why the link is there. For anything that changes (issue status, guidance), say when you last checked it.