Skip to content
🚧 Early alpha — building the foundation. See the roadmap →

Link metadata syntax specification

Updated

This is the formal specification for Crosswalker’s typed-link syntax. For the conceptual overview, see link metadata system.

[framework_here.applies_to:: [[AC-2]] {"sufficient": true}]
 ├─ wrapper ──────────────────────────────────────────────┤
  ├─ dotKey ────────────┤  ├─ dest ┤  ├─ metadata ───────┤
ComponentRequiredDescription
WrapperOptional[...], (...), or none
dotKeyRequiredNamespace + relationship type (dot notation)
::RequiredDataview inline field separator
DestinationOptionalWikiLink, Markdown link, or plain text
MetadataOptionalJSON object or quoted string
StyleSyntaxObsidian reading modeObsidian live previewUse case
Nonekey:: valueVisible as blockVisible as blockExplicit, always visible
Square brackets[key:: value]Hidden (shows link only)Partially hiddenClean reading experience
Parentheses(key:: value)Inline, less intrusiveInlineCompact inline annotations

All three are valid Dataview inline fields. The choice is purely presentational — all are parsed identically.

framework_here.applies_to:: [[AC-2]]
framework_here.applies_to:: [[AC-2|Account Management]]
  • Standard Obsidian internal link
  • Optional alias after |
  • Resolves via Obsidian’s link resolution
framework_here.applies_to:: [AC-2](Frameworks/NIST-800-53/AC-2.md)
framework_here.applies_to:: [AC-2](ID%2012.md)
  • Standard markdown link syntax
  • Path may be URL-encoded
  • Works with external URLs too
framework_here.reviewer:: "Person_1"
framework_here.score:: 9
framework_here.approved:: True
  • No link destination — just a value
  • Sets a default property for all links from this note
TypeSyntaxExample
JSON object{...} after destination[[AC-2]] {"sufficient": true, "reviewer": "Alice"}
Quoted string"...""Person_1"
BooleanImplied by link presence[[AC-2]] (no metadata = boolean true)
NumberBare number9
SyntaxLink typeWrapperMetadata
framework_here.reviewer:: "Person_1"Plain (default for page)NoneQuoted string
[framework_here.applies_to:: [AC-2](AC-2.md)]Markdown link (boolean flag)[]Implied true
(framework_here.applies_to:: [[AC-2]] {"sufficient": true})WikiLink + JSON()JSON object
framework_here.reviewed:: [[AC-2]]WikiLink (boolean flag)NoneImplied true
[framework_here.approved:: True]Plain (default for page)[]Boolean
(framework_here.score:: 9)Plain (default for page)()Number
[framework_here.score:: [[AC-2]] {9}]WikiLink + number[]Number

The following regex extracts all components from any valid typed-link syntax:

/^(?:\[|\()?(?<dotKey>framework_here(?:\.\w+)*)::\s*(?:\[\[(?<wikilink>[^|\]]+)(?:\|(?<wikiAlias>[^\]]+))?\]\]|\[(?<mdText>[^\]]+?)\]\((?<mdLink>[^)]+?)\)|(?<plainLink>[^"\[\]\(\)\s{}]+))?\s*(?:(?<json>\{[^}]*\})|"(?<quotedValue>[^"]+)")?(?=\]|\)|$)/
GroupMatchesExample capture
dotKeyFull dot-notation keyframework_here.applies_to
wikilinkWikiLink target (without alias)AC-2
wikiAliasWikiLink alias (after |)Account Management
mdTextMarkdown link display textAC-2
mdLinkMarkdown link path/URLFrameworks/NIST-800-53/AC-2.md
plainLinkPlain text link or valuePerson_1
jsonJSON object string{"sufficient": true}
quotedValueQuoted string valuePerson_1
  • Optional wrapper: [, (, or nothing at start
  • Dot-notation keys of any depth: fw, fw.type, fw.type.subtype
  • All three link types: WikiLink (with optional alias), Markdown, plain
  • Optional trailing metadata: JSON object or quoted string
  • Closing wrapper lookahead: ], ), or end of line

When multiple inline fields reference the same framework, a priority system determines how metadata merges. The system has two tiers based on whether an explicit link destination is present.

From highest to lowest:

  1. Inline tag (dot notation) + link + explicit value/JSON framework_here.applies_to:: [[AC-2]] {"sufficient": true}
  2. Inline tag (dot notation) + link + implied boolean framework_here.applies_to:: [[AC-2]]
  3. Inline tag (leaf/child dot key) + link + JSON framework_here.applies_to.coverage:: [[AC-2]] {"full": true}
  4. Inline tag (root/parent dot key) + link + JSON framework_here:: [[AC-2]] {"reviewer": "Alice"}
  1. Inline tag (dot notation) + explicit value framework_here.reviewer:: "Person_1"
  2. Inline tag (dot notation) + implied boolean framework_here.approved:: True
  3. Inline tag (leaf/child) + JSON framework_here.defaults.coverage:: {"threshold": 80}
  4. Inline tag (root/parent) + JSON framework_here:: {"reviewer": "Bob", "status": "draft"}

After inline fields, lower-priority sources fill in remaining properties:

  1. YAML frontmatterframework_here keys in the note’s frontmatter
  2. Folder-level defaults — inherited from parent folder notes (if implemented)
  3. Global defaults — plugin settings
ComponentProperties (native)DataviewBasesDatacore
dotKey parsingNoYes (inline fields)NoTBD
WikiLink resolutionYes (backlinks)YesYes (backlinks)TBD
JSON metadata extractionNoVia DataviewJSNoTBD
Priority mergingNoVia DataviewJSNoTBD
Tabular display of resultsNoTABLE/DataviewJSYes (native)TBD

Key insight: The full typed-link system requires DataviewJS (or future Datacore) for parsing and priority resolution. Obsidian Bases can surface notes based on frontmatter properties but cannot process inline field syntax or edge metadata.

This is an intentional design trade-off: frontmatter for queryable flat metadata, inline fields for relationship-level metadata that needs custom processing.