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: publicon the notes to publish. - From
crud-in-the-cloud, runmake 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 offrameworks:) - a source type without
source finishedwhilestatusis notdone, orfinishedbeforestartedorderwithoutcourse, or acourseslug 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
publicnote: 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
courseslugs once notes are public: they become URLs. - End posts, how-tos, labs, notes and reference pages with a
## Referencessection. 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.