Yuhang

Notes/evergreen

How notes work here

The conventions this knowledge base runs on — frontmatter, wikilinks, topics and maturity. Read this one first.

Noted

Every file in src/content/notes/ becomes a page, a node in the graph, and a row in the index. Nothing else needs to be registered anywhere.

Frontmatter

Only title and date are required. Everything else earns its place:

FieldWhy it exists
summaryShown in the index and the graph tooltip. Write it for a stranger.
topicsCanonical slugs. Aliases fold automatically — nn lands on neural-networks.
statusseed, growing or evergreen. Honesty about maturity, not a promise.
sourceWhat was consumed. A paper, a podcast, a report — or own for original thinking.
draftVisible in npm run dev, never in a deploy.
translationOnly on a translation. Written by npm run stamp — see below.

Write [[slug]] or [[slug|any label you like]] and it becomes both a link and an edge. Topic links work the same way: [[topic:skiing]] tags this note with Skiing mid-sentence, with no frontmatter echo needed.

The same syntax is what Obsidian uses, deliberately — a note body renders correctly in a vault and on this site, so the editor stays swappable.

A link to a note that does not exist yet is not an error, it is a to-do: npm run check lists every dangling link and every topic without a hub page.

Two languages, one note

foo.md and foo.zh.md are the same note. One slug, one set of topics, one node in the graph; the page offers a switch between them. A note written only in Chinese keeps the bare URL rather than being pushed to a sub-path.

The hard part is not having two files, it is keeping them saying the same thing. Editing the English leaves the Chinese quietly wrong, and a stale translation is worse than a missing one, because it reads as current.

So a translation records a hash of the version it was translated from:

translation:
  of: en
  rev: f38473579e4b

Recomputing that hash at build time makes drift a fact rather than a feeling. Not dates, which depend on remembering, and not file timestamps, which git does not preserve. The hash ignores rewrapping — these notes are hard-wrapped, so a one-word edit reflows a paragraph — and ignores topics, status and date entirely, so reorganising the garden never invalidates a translation.

npm run stamp lists what has drifted; -- --diff <slug> shows what moved in the source since. Stamping is always a command, never automatic: it asserts that someone read both versions and they agree, and a stamp applied by a build step would assert that without anyone having checked.

A reader who lands on a translation that has fallen behind is told so, at the top of the page, with a link to the source.

Maturity over polish

A seed is allowed to be one sentence. The alternative — only writing things once they are finished — is how a knowledge base dies. See Terrain as a first filter for one that is still thin on purpose.