The first useful demonstration of a graph is not a force-directed visualization. It is changing a fact once and seeing every expression agree.

Separate content from its presentation

An expression on this site lives in a Markdown file. Its root node contains its identity and relationships. The surrounding front matter controls publication. The Markdown body carries the article.

The page template can render a node name with:

<h1>{{ .Params.node.name }}</h1>

Hugo’s HTML templates escape ordinary text. Do not bypass that protection with safeHTML for untrusted fields.

Ask for another output

Hugo supports multiple output formats. The site’s home configuration includes:

[outputs]
  home = ['HTML', 'RSS', 'JSON']

The HTML home welcomes a reader. The JSON template builds records from the same node collection. No second authoring workflow is needed.

In a JSON template, serialize data rather than assembling JSON by hand:

{{ dict "id" .Params.node.id "name" .Params.node.name | jsonify }}

That snippet demonstrates serialization for one page; the home export iterates over the graph and includes resolved URLs and reading context.

Inspect the actual outputs

Open this page’s Node data disclosure to inspect its source metadata. Then open the public graph export. Find publish-one-source-two-ways. Its ID and name originate from the same record you are reading now.

Protect the publication boundary

One source does not mean every field belongs in every output. Review the input and choose the export schema deliberately. Draft status is not access control. Do not place confidential knowledge in a public content repository.

Try it: in a local copy, change an expression’s node name. Rebuild and inspect both its data disclosure and the JSON export. Verify the shared fact changed without editing either template.