2026-09-23·by Sijie Wang#standmeet#obsidian#contract

protocol

Protocol — frontmatter field-source contract

Parent: obsidian-sync-mechanism · audited against backend/internal/corpus/obsidian/import.go (the package moved out of usecases/ on 2026-07-29, 9f1ffcf13; re-audited 2026-09-07)

For every field, two questions: where does its value really come from, and who reads it — Obsidian, StandMeet, both, or neither. Anything whose source is more trustworthy than "you typing it" (the filename, system time, the body, the importer) shouldn't be in the template. Checked field-by-field against buildSaveInputFromVault (import.go:286) — this is the writings branch; the wiki/subjectivity branch parses its own smaller set (corpFM, sync_note.go:15), noted per row where it differs.

The matrix

✅ = used / read · ✕ = no native behavior — Obsidian still stores & shows every property (excerpt/status/… appear in the picker only because your own notes use them, not because Obsidian acts on them).

FieldSourceObsidianStandMeetNote
publishyou (the gate)✅ Obsidian Publish✅ import gate (writings) · visibility gate (wiki/subjectivity)writings: true → import; corp notes: always persisted, publish only sets published and an absent key keeps the current value (F-L-8 / F-L-22); renders as a Checkbox
tagsyou✅ tag pane / searchshared native key
excerptyousummary
cover_headline / cover_subyoucover copy
cover_hueyouamber(def) / violet / acid
cover_imageyou / a body imageresolved to an asset
visibilityyoupublic(def) / private
locked_bodyspecialnot normal authoring
titlefilename✅ filename is the title — same as Obsidian✅ override-only (pickTitle)set only to override the display name
slugfilename✅ filename = the note identity — like Obsidian✅ reads fm.slug else filename (pickSlug)don't set it; ⚠️ no folder-note collapse yet
aliasesyou✅ alt names / [[alias]] / search✕ writings: parsed, ignored · ✅ wiki/subjectivity: stored in corpus_notes.aliases, resolves [[alias]] links (463411b48, 2026-08-05)shared key for corp notes
cssclassesyou✅ per-note CSS✕ writings · ✅ wiki/subjectivity: stored as css_classes, added to the note container at render (f147b1e8f, 2026-07-06)shared key for corp notes
lang / lang-labelsyou✅ wiki/subjectivity only: identity language + switcher labels for > [!lang] notes (corpus_notes.lang, lang_labels)not read on the writings branch
createdsystem✕ (fs time is separate)✕ DB created_at winsneither needs it typed
cross_refsbody [[links]]✕ hardcoded emptyrelationships come from body wikilinks
path / parent_idvault path / folder tree(the file's location)✅ autonot a frontmatter key
read_minutescomputed from body✅ computednot a frontmatter key
published_at · obsidian_source_path · obsidian_imported_at · updated_atimporter / DB✅ autonot frontmatter keys
Note

publish is intentionally Obsidian's native key publish is one of the property keys Obsidian recognizes natively (it's what Obsidian Publish reads). So StandMeet's import gate and Obsidian share one flag with one meaningpublish: true = "make this public" — instead of inventing a custom field. Upshots: it renders as a real Checkbox in the Properties panel, and if you ever also run Obsidian Publish, the same publish: true triggers both (intended — both mean public; use two keys only if you want them to diverge).

Two counterintuitive traps

  1. cross_refs does nothing: you might think listing related articles in frontmatter creates relationships — the importer hardcodes it empty. Relationships come only from [[wikilinks]] in the body.
  2. One key, two audiences: created/aliases are useless to the StandMeet import, but aliases is useful to Obsidian and created is covered by fs time. Neither needs to be hand-typed.

The slimmed template (i.e. the standmeet-article template)

---
publish: false
excerpt:
tags: []
# add visibility / cover_hue / cover_headline / cover_sub when needed
---

title, slug, created, cross_refs, path are all absent — left to the filename, system time, body wikilinks, and the importer.

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →