# Feature Request before PR: Document Tagging System #11603
Replies: 4 comments 15 replies
-
|
+1. |
Beta Was this translation helpful? Give feedback.
-
|
It looks great, but I hope tags can be created directly on the content page, and not only in the admin panel |
Beta Was this translation helpful? Give feedback.
-
|
Maybe you can create a PR at first? |
Beta Was this translation helpful? Give feedback.
-
|
Overall it's close to what I would be build and the high level architectural and design decisions are good, some concerns and questions that we'd need to work through. Top of mind for discussion: UI
Performance
API
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Summary
I would like to propose a tagging system for Outline that allows documents to be classified with tags as an orthogonal dimension alongside the existing collection hierarchy. One of the most requested features I found here in the community are tags.
I will be running Outline as the primary knowledge base and have found that the collection structure alone is not sufficient to express the full semantic context of documents, particularly across team boundaries and topic domains that naturally span multiple collections.
I am opening this discussion to align with the core team before submitting a PR.
The Problem
Outline's current document organization relies exclusively on collections and nested documents. This works well for hierarchical structure, but it creates friction in two common scenarios:
1. Cross-cutting topics that don't belong in a single collection
A document about "Q1 Budget Review" lives in the Finance collection — but it is equally relevant to the Strategy team, the Marketing team, and the Operations team. There is no lightweight way to express this relevance without duplicating the document, creating awkward cross-collection links, or building a deeply nested hierarchy that doesn't reflect how people actually think about topics.
Tags solve this cleanly: a document stays where it belongs structurally and gains orthogonal classification metadata.
2. Discoverability at scale
As a knowledge base grows past a few hundred documents, finding related content becomes increasingly difficult if the only navigation is the collection tree. Search helps, but it requires knowing what to search for. Tags allow users to browse by topic, status, project, or any other dimension the team finds valuable without restructuring the entire collection hierarchy.
More convient to tools like FSNotes and Obsidian.
I maintain an Obsidian vault alongside our Outline instance and have built a plugin that synchronizes Obsidian notes into Outline. Obsidian documents carry tags as YAML frontmatter (
tags: [project, client-xyz]). Today, those tags are silently dropped when documents are pushed to Outline, losing valuable classification metadata that the vault relies on.Proposed Design
After thorough analysis of existing approaches (including Obsidian, Notion, and Confluence), I propose a pure metadata classification system — not inline hashtags in document content.
Core principle
Tags are document-level metadata, stored separately from document content. This is the key decision that differentiates our proposal from a naive hashtag implementation:
Data model
Two new tables:
Tags are team-scoped for normalization (one canonical "marketing" tag per team, not one per document), but they are delivered as part of the document response — so any user with document read access sees them, independent of team membership.
Permission model
addTagby name)Deletion safety mechanism
Deleting a global tag removes it from every document in the team. This is a destructive, team-wide operation.I propose a two-step confirmation:
POST /api/tags.usagereturns the document count per tagPOST /api/tags.deleterequires{ confirm: true }in the request body — a request without the confirmation flag returns HTTP 400API surface
Following the existing RPC-style POST pattern used throughout the Outline API:
The
documents.addTagendpoint accepts a tag by name (not just ID), and upserts the tag if it does not yet exist. This is essential for programmatic use cases like our Obsidian sync plugin.Document response extension
Tags are included in
presentDocumentfor both authenticated and public (share-link) responses. In the public case,idis omitted to prevent enumeration of internal resources.Markdown import / export (YAML frontmatter)
YAML frontmatter
tags:is a widely used open standard (Jekyll, Hugo, Pandoc, Ghost not Obsidian-specific). I propose:tags:in its YAML frontmatter, those values are automatically set as Outline tags on the documenttags:in the YAML frontmatterThis makes Outline a first-class citizen in Markdown-based workflows and enables round-trip compatibility with tools like Obsidian.
What I'm explicitly NOT proposing
To keep the scope focused and the implementation maintainable:
[[Doc]]). Inline tags would create a second, weaker navigation system with significant editor complexity (ProseMirror extension required) and bidirectional sync problems in collaborative sessions.#project/sub). Flat tags are sufficient and far simpler to implement and maintain.marketingmeans the same thing for everyone on the team.Implementation Status
I have a working implementation in a local fork covering:
tagsanddocument_tagsBelongsToManyrelation onDocumentcancanpatternspresentDocumentextension (with and withoutidfor public responses)TagBadgeandTagInputcomponents (with autocomplete, click-to-assign, and colored dot indicators), sidebar integration, admin settings page with color picker, rename, and two-step deleteI'm are happy to submit a PR once there is alignment from the core team on the approach. I'm also open to adjustments particularly around the API naming conventions and where tag management surfaces in the Settings UI.
Prior Art / Related Discussions
Tags have been discussed in Outline's community before. This proposal attempts to synthesize those discussions into a concrete, fully specified design that is ready for implementation. Key decisions that differentiate this proposal from previous ones:
Questions for the Core Team
documents.addTag,documents.removeTag) consistent with your conventions, or would you prefer a different pattern?I'm looking forward to the discussion. Happy to provide detailed technical informations or a demo on request.
Some Screenshots:
Beta Was this translation helpful? Give feedback.
All reactions