namhyun ko4 downloadsExplore a tag hierarchy defined in a JSON dictionary inside the core graph view, with note counts and a dictionary check.
English | 한국어
Tag Ontology turns Obsidian's core Graph view into a map of your tag hierarchy. You describe your tags in a JSON dictionary (definition, aliases, parents, related tags). The plugin draws that hierarchy with the built-in graph renderer and attaches your notes to the tags they use.
It is read-only. It never edits your notes or your dictionary.

| Tag panel | Dictionary check |
|---|---|
![]() |
![]() |
While the plugin is enabled, every core Graph view tab shows the tag ontology instead of the normal note graph. The local graph is not affected. Disable the plugin and the core Graph view goes back to normal: its data, click behavior and textures are restored.
Tag usage comes from Obsidian's metadata cache, which includes frontmatter tags and inline #tags in every Markdown note. Files and folders whose names start with . are skipped.
Open Settings → Community plugins → Browse, search for "Tag Ontology", then install and enable it. You can also install it from its directory page.
NamhyeonKo/obsidian-tag-ontology.main.js, manifest.json and styles.css from the latest release..obsidian/plugins/tag-ontology/ inside your vault. If you changed the config folder in Obsidian, use that folder instead of .obsidian.The core Graph view plugin must be enabled.
The repository includes a small vault in examples/sample-vault: a 12-tag dictionary and six notes.
examples/sample-vault.You should see two roots, computer-science and security. cryptography and ai-security have two parents each. The dictionary check lists #to-read as unregistered.
By default the plugin reads Tag-Dictionary.json at the vault root. You can change the path in the plugin settings.
The file is a single JSON object. Each key is a tag without #, written exactly as it appears in your notes (matching is case-sensitive, so lowercase keys are recommended). A nested tag such as #lang/python uses the key lang/python.
{
"machine-learning": {
"aliases": ["ML"],
"description": "Algorithms that improve at a task by learning from data.",
"broader": ["computer-science"]
},
"dropout": {
"description": "Randomly disabling units during training to reduce overfitting.",
"broader": ["deep-learning"],
"related": ["overfitting"],
"facet": "technique"
},
"computer-science": {
"description": "The study of computation, information and automation.",
"broader": []
}
}
| Field | Required | Type | Meaning |
|---|---|---|---|
description |
yes | string | Shown in the tag panel. |
aliases |
no | string[] | Other names. Used by search and by the dictionary check to suggest a match for an unregistered tag. |
broader |
no | string[] | Parent tags. [] marks a root tag. |
related |
no | string[] | Non-hierarchical links, drawn as dashed lines. |
facet |
no | string | Free-form category. Validated but not displayed yet. |
Rules:
"broader": []. A tag with no broader key at all is treated as not yet placed and does not appear in the graph.broader or related must exist in the dictionary.broader links cannot form a cycle.See examples/sample-vault/Tag-Dictionary.json for a complete example.
| Command | Description |
|---|---|
| Tag Ontology: Open graph | Open the ontology in the core Graph view. Reuses an open graph tab. |
| Tag Ontology: Reload dictionary | Reload the dictionary and the note index. |
| Tag Ontology: Open compatibility viewer | A standalone Cytoscape-based viewer kept for compatibility. Slower on large vaults. |
| Setting | Description |
|---|---|
| Dictionary path | Vault-relative path to a .json file. Default: Tag-Dictionary.json. Paths inside the vault's config folder (usually .obsidian/) or .git/ are rejected. |
| Layout | Force, Tree or Radial. |
At low zoom levels the core graph hides labels and arrows. Zoom in to see them.
plugins/tag-ontology/data.json in the config folder, usually .obsidian/), which holds dictionaryPath and layout.Bug reports and feature requests are welcome in Issues. Please include your Obsidian version and OS for bugs.
Requires Node.js 22.18 or later. The tests run TypeScript directly with Node's built-in type stripping.
npm ci
npm run lint # Obsidian review rules (eslint-plugin-obsidianmd)
npm test # unit tests, no vault needed
npm run build # type-check + bundle to main.js
npm run deploy -- "/path/to/vault" # copy main.js, manifest.json, styles.css into the vault
deploy requires an existing .obsidian/ folder in the target vault and preserves an existing data.json. Reload the plugin in Obsidian afterwards.
npm run test:vault is the maintainer's integration test against a private vault (OBSIDIAN_VAULT_PATH). Other contributors don't need to run it.
src/
├── main.ts # Plugin entry: commands, settings tab, vault/metadata events
├── ontology.ts # Dictionary validation, hierarchy, note roll-up, dictionary check
├── native.ts # Hooks the core Graph view renderer (toolbar, panel, layouts)
├── native-data.ts # Converts the visible ontology into the core graph's data format
├── layout.ts # Tree/Radial positions (headless Cytoscape)
├── view.ts # Compatibility viewer (standalone Cytoscape view)
├── renderer.ts # Cytoscape setup for the compatibility viewer
└── settings.ts # Settings shape and path validation
tests/ # node:test unit tests (tests/integration is maintainer-only)
examples/ # Sample vault with a Tag-Dictionary.json
scripts/deploy.mjs # Copies the build into a local vault
version in manifest.json and package.json (and package-lock.json, e.g. with npm version <x.y.z> --no-git-tag-version), and add the new version to versions.json (mapped to minAppVersion).main, then push a tag that matches the version exactly, with no v prefix: git tag <x.y.z> && git push origin <x.y.z>.main.js, manifest.json and styles.css, and creates a draft release with them.