This document captures the **nuances, limitations,** and **caveats** of Obsidian tags, focusing on special characters and how Obsidian sorts and parses tags. It also includes references to community feature requests and known workarounds.
---
## 1. Overview of Tag Constraints
- **Obsidian tags** must start with `#` and can contain **letters, numbers, underscores, and many Unicode characters.**
- They **cannot** contain spaces, commas, or the more “special” punctuation typical in Markdown (e.g., `@`, `.`, `?`, `:`).
- **Periods (`.`)** are particularly problematic because they break the tag at the period.
- **Slash `/`** is allowed but triggers **nested/hierarchical tags** in Obsidian’s tag pane. (e.g., `#food/fruits/apple` is a nested tag.)
In other words, Obsidian “stops” parsing a tag once it encounters disallowed punctuation. Many of these design choices stem from wanting to avoid collisions with Markdown syntax and from how tags are typically parsed by other note-taking apps.
---
## 2. Why Are Certain Characters Disallowed?
1. **Markdown Conflicts:**
Characters like `@`, `:` and especially `.` or `\` can conflict with existing Markdown features (links, headings, image syntax, etc.).
2. **Parsing Ambiguity:**
Obsidian needs to know when a tag begins and ends. Allowing full punctuation can lead to tricky edge cases (e.g., `#some.tag` might appear like `#some` plus text `.tag`).
3. **Backward Compatibility & Ecosystem:**
Some community plugins assume certain delimiters. Expanding the character set can break or complicate plugin code.
4. **User Expectation (Hashtag Conventions):**
Many “hashtag” systems do not allow a period or more exotic punctuation. So Obsidian’s devs align with that general standard.
---
## 3. Supported vs. Unsupported Characters
### Commonly **Supported** for Tags
- Letters: `a–z`, `A–Z`
- Numbers: `0–9`
- Underscore: `_`
- Hyphen: `-`
- Slashes: `/` (for nested tags)
- Many **emojis** and extended **Unicode characters** are allowed
### Commonly **Not Supported** for Tags
- **Period** (`.`)
- **Colon** (`:`)
- **Semicolon** (`;`)
- **Comma** (`,`)
- **Question mark** (`?`)
- **Exclamation mark** (`!`)
- **At symbol** (`@`)
- **Reserved OS path characters** such as `\` on Windows
> **Note**: The exact set of disallowed characters can be gleaned from Obsidian’s parser. If Obsidian sees them as “end-of-tag” punctuation, the tag breaks there.
---
## 4. Workarounds for Unsupported Characters
Since “.” and certain other punctuation are off-limits, the community and Obsidian support have recommended several **alternative approaches**. Pick whichever suits your workflow best:
### 4.1 Replace With Unicode “Look-alikes”
If you truly **must** have an ampersand, slash, or period shape in your tag, you can:
- Use **fullwidth** or **Unicode** equivalents:
- For `&`: `&` (U+FF06 Fullwidth Ampersand)
- For `.`: `.` (U+FF0E Fullwidth Full Stop)
- For `@`: `@` (U+FF20 Fullwidth Commercial At)
- Pros:
- Visually similar to the ASCII character.
- Cons:
- Harder to type or remember, might cause confusion with search or plugin usage.
### 4.2 Nested Tags Instead of Periods
Since a period is frequently used to **denote subcategories** (e.g., `#version.1.4.2`), you can replicate that nesting via slashes:
arduino
CopyEdit
`#version/1/4/2`
- Pros:
- Obsidian’s **tag pane** gives you a nice hierarchy.
- Searching is straightforward: `tag:#version/1/4/2`.
- Cons:
- Each sub-level becomes its own nested tag. You can’t treat `#version/1` and `#version/1/4` as exactly the same entity.
### 4.3 Use Properties or Frontmatter
If you need the notion of a semver or “tag with punctuation,” you can instead use **YAML frontmatter** or the **Properties UI** in Obsidian:
yaml
CopyEdit
`--- version: 1.4.2 category: my.software ---`
- Then query with [Dataview](https://github.com/blacksmithgu/obsidian-dataview) or the built-in Properties.
- Pros:
- Perfect for structured data (like versioning or DOIs).
- Cons:
- Not as convenient to filter in Obsidian’s built-in **Tag Pane**—you’ll need Dataview or advanced search.
### 4.4 Convert Tags to Note Links
Another approach is to treat “tags” as **wiki links** to dedicated notes:
- Example: Instead of `#g.skill`, you do `[[tag.g.skill]]`, a note titled `tag.g.skill.md`.
- You can store these “tag notes” in a `Tags` folder and then link to them anywhere.
- Pros:
- You can use **any** punctuation in a filename that Windows/your OS allows (besides `\ / : * ? " < > |`).
- Great for extremely robust “tag pages” (like MOCs).
- Cons:
- They no longer appear in the Tag Pane. Searching them is more like searching links.
### 4.5 Embrace Hyphens and Underscores
A simpler alternative is to just **replace periods** with `-` or `_`, e.g. `#version_1_4_2`.
- Pros:
- Easiest to remember/type (no Unicode look-alike).
- Plays nicely with typical coding or “snake-case” conventions.
- Cons:
- Visually less “semantic” if you specifically want a dot or slash.
---
## 5. Sorting & Collation Details
Obsidian sorts folders/files/tags using **Chromium’s `Intl.Collator`** JavaScript API. This means:
- Sorting can differ slightly from **Windows File Explorer** or your OS’s default.
- Unicode has extensive rules about accent marks, numeric sorting, etc.
- If you rely on a custom locale, you may see differences in alphabetical order.
#### Key Points on Sorting
- Typically, numbers (`0–9`) are sorted before letters in ASCII-based ordering.
- Fullwidth characters may appear at unexpected positions.
- Slashes cause hierarchical grouping in the **tag pane** specifically (not purely alphabetical).
---
## 6. Examples of Structured Tag Systems
1. **Nested Approach (Slashes)**
- `#project/alpha`, `#project/beta`
- `#version/1/4/2` for semver references
- `#people/john_smith` for a person
2. **Status Approach (Underscores)**
- `#todo_open`, `#todo_inProgress`, `#todo_done`
- `#draft_wip`, `#draft_final`
3. **Emoji Prefixing**
- `#📌pin`, `#⚠urgent`, `#✨idea`
- Offers quick visual scanning in the tag pane.
4. **Hybrid**
- `#people/john_smith` + `#role_developer` + `#🚀growth`
- Combining nested tags, underscores, and emojis as needed.
---
## 7. References & Forum Discussions
1. **Official Help Docs**
- Obsidian Tags
2. **Feature Requests**
- _“[Support special characters (like `.`, `@`) in tags](https://forum.obsidian.md/t/support-special-characters-in-tags-etc/71870)”_
- _“Request to allow periods for semver (`#v1.2.3`)”_
3. **Sorting Quirks**
- _[File order in Obsidian different from Windows File Explorer](https://forum.obsidian.md/t/file-order-in-obsidian-different-from-windows-file-explorer/93480)_
- _[Alphabetic sort depends on `Intl.Collator` (Chromium) locale settings](https://forum.obsidian.md/t/alphabetic-sort-order-should-be-dependent-on-system-input-language/11149)_
4. **Community Workarounds**
- Nested tags plugin: [obsidian-graph-nested-tags](https://github.com/drPilman/obsidian-graph-nested-tags)
- Using frontmatter or Dataview properties for DOIs / semver
- Replacing `.` with `_` or `-`, or using fullwidth `.`
---
## Conclusion
Because **Obsidian tags** are designed to remain compatible with standard hashtag conventions, many special punctuation characters (periods, `@`, `:`) are treated as the **end** of a tag. While this **limits** certain naming schemes (like `#v1.2.3`), the community has devised **several workarounds**:
- Use **slashes** for nesting
- Swap special symbols with underscores or **fullwidth Unicode** equivalents
- Store version/dois in **frontmatter** or **wiki links**
- Adopt a more flexible approach to tag naming (snake_case, hyphen-case, etc.)
Ultimately, how you handle these constraints will depend on your **workflow**, **search habits**, and **automation** needs. This reference aims to clarify the **“why”** behind these limitations and to provide workable solutions so you can build an **efficient** and **sustainable** tag system in Obsidian.