The schema file
.vault/schema.yml in the vault sets its rules. It is deep-merged over the preset it names (preset: para), or over the built-in layout when it names none, so it only needs to carry what differs. preset: custom starts from nothing. VAULT_SCHEMA points at a local file that overrides the one in the vault. Notes and layouts explains the folders and kinds.
Changing the built-in rules
- Add a kind by adding an entry:
research: "reading notes on a topic; no task, no decision". - Rewrite a rule by restating it.
- Drop a kind or a folder by setting it to
null. - Nest folders by path:
Work/Logs: { kind: log }.
The frontmatter contract
The built-in layout's contract:
frontmatter:
required: [title, date, updated, tags, status]
optional: [kind, area, summary, path, superseded_by, priority, source, kebbie]
area_required_in: [Projects, Resources, Log]
status_values: [draft, active, backlog, complete, superseded]
kind_values: [system, task, trap, howto, decision, reference, log]
priority_values: [urgent, high, medium, low]
path ties a note to code: a comma-separated list of directories (~ is kept as written and also indexed expanded). context and the session-start hook match the working directory against it.
Kinds
Each kind carries a one-line rule, and the server puts the rules in its instructions so every client picks kinds the same way:
kinds:
trap: "a gotcha that bit once and will bite again; nothing to do, nothing was chosen"
decision: "a choice and its reasons; something was chosen, alternatives were dropped"
howto: "steps that are known to work; nothing chosen, nothing open"
Folders
folders:
Areas: { kind: system, weight: 3.0, description: "One living note per system or subsystem." }
Archive: { kind: archive, weight: 0.3, searched: false, description: "History." }
| Key | Default | Meaning |
|---|---|---|
kind |
reference |
system, reference, task, log or archive: which tools write there. |
weight |
1.0 |
How much a note in the folder weighs in search, 0 or more. |
searched |
true |
false hides the folder from search unless asked for. |
description |
The folder's line in the server's instructions. |
root_description is the vault root's line in the same list. backlog.folder names which folder of kind task holds the backlog when there are several.
Other keys
| Key | Built-in default | Meaning |
|---|---|---|
language |
en |
The vault's language, as an ISO code. Picks the stemmer and the task headings. |
other_languages |
[] |
More languages to stem, such as [sv]. Changing either rebuilds the index. |
tags.vocabulary |
[] |
The vault's tags, named in the server's instructions. |
tags.strict |
false |
true refuses a write with a tag outside the vocabulary, and lint reports such tags. |
synonyms |
[] |
Groups of words search treats as one, such as [[bokning, booking]]. |
stale_after_days |
30 |
When an open task note counts as stale. |
search.recency_half_life_days |
90 |
How fast an old note's rank decays. |
search.title_weight, summary_weight, tags_weight, body_weight, stem_weight |
10.0, 5.0, 3.0, 1.0, 20.0 |
How much a match in the title, summary, tags, body and file name weighs. |
search.stemmed_weight |
0.5 |
How much a match on a word's stem alone weighs, so the exact form ranks first. |
Repo log
log:
folder: Log
file_format: "{repo}-log.md"
period_format: "{repo}-{period}.md"
entry_format: "- [{date}] {line} | branch: {branch} | commits: {commits} | {area}"
The default -log suffix keeps Log/myapp-log.md from colliding with the hub note Areas/myapp.md, which Obsidian could not tell apart as [[myapp]]. Every place that builds the log path reads file_format, so changing it moves all of them at once; rename the existing files to match.
Task sections
The headings task check looks for, picked by the vault's language:
task:
sections:
en: { problem: Problem, solution: Solution, decisions: Decisions, tests: Test decisions, scope: Out of scope }
sv: { problem: Problem, solution: Lösning, decisions: Beslut, tests: Testbeslut, scope: Utanför ramen }
When the schema does not hold
The schema is checked when it is loaded. A schema that does not hold leaves the vault on its preset, and context, lint and the vault's page on a server list each problem, for example folders.Inbox.kind 'todo' is not one of: system, reference, task, log, archive. A running server picks up an edited schema on its next refresh.
A vault whose schema names a preset this version does not ship is read as written, over the empty custom schema, and context, lint and the vault's page say so; init keeps that schema until --preset <name> --force switches it.