Build searchable, maintainable knowledge bases that your team actually uses — turning tribal knowledge into organizational assets.
Core Principles
1. Knowledge Bases Are Products, Not Projects
A knowledge base is never "done." It requires ongoing investment: content creation, curation, cleanup, and promotion. Treat it like a product with a roadmap, owners, and metrics.
2. Search Is the Primary Interface
If users can't find what they need in 2-3 searches, the knowledge base has failed. Invest in search quality, metadata, tagging, and cross-referencing before adding more content.
3. Lower the Barrier to Contribution
The easier it is to write and publish, the more content you'll get. Support markdown, provide templates, reduce review friction for minor edits, and celebrate contributors.
4. Structure for Discoverability, Write for Scannability
Organize content in categories users naturally think in. Use clear titles, descriptive summaries, consistent formatting, and plenty of internal links.
5. Measure What Matters
Track search success rates, popular content, stale pages, and user feedback. Use data to decide what to improve, archive, or create next.
Knowledge Base Maturity Model
Level
Content
Search
Maintenance
Contribution
Governance
1: Graveyard
Random docs, no structure
None (browse only)
Never updated
No process
No owners
2: Collection
Some structure, inconsistent
Basic text search
Updated reactively
A few contributors
Unclear ownership
3: Organized
Taxonomy defined, templates used
Tagged + full-text search
Regular reviews
Active contributors
Defined content owners
4: Curated
Reviewed content, versioned
Faceted + filtered search
Scheduled audits
Contributor workflows
Editorial board
5: Living
Feedback-driven, analytics-informed
Semantic + AI-assisted
Continuous improvement
Embedded in workflows
Metrics-driven governance
Target: Level 3 for most teams. Level 4 for customer-facing or compliance-relevant knowledge bases.
---
title: How to [Task Name]
description: Step-by-step guide for completing [task]
sidebar_position: 2
tags: [configuration, deployment, production]
---
# How to [Task Name]
> **Purpose**: [One-line description of what this accomplishes]
> **Prerequisites**: [List of prerequisites or links to them]
> **Estimated time**: [X minutes]
## Step 1: [First Step]
[Description of what to do]
```bash
[Command to run]
Expected result: [What should happen after this step]
---
### Taxonomy and Tagging
#### Tag Taxonomy Design
```yaml
# Tag taxonomy for a developer knowledge base
#
# Category-based tags follow this hierarchy:
# domain > area > topic
tags:
# By topic area
- backend
- frontend
- infrastructure
- security
- data
- mobile
# By content type
- tutorial
- guide
- reference
- troubleshooting
- faq
# By audience
- beginner
- intermediate
- advanced
- administrator
# By system/component
- authentication
- database
- deployment
- monitoring
- api
- cli
# By project/team
- team-alpha
- team-beta
- platform
Tagging Guidelines
## Tagging Guidelines### Rules1.**Every page needs at least 2 tags**: one content type + one topic
2.**Max 5 tags per page**: too many tags dilute search
3.**Use existing tags**: check existing tags before creating new ones
4.**Keep tags lowercase**: consistent casing improves search
5.**Use nouns, not verbs**: `deployment` not `deploying`### Tag Combinations
| Page Type | Required Tags | Recommended Tags |
|-----------|--------------|------------------|
| Getting started guide | `tutorial`, `beginner` | `setup`, `first-steps` |
| API reference | `reference`, `api` | `backend`, `integration` |
| Troubleshooting guide | `troubleshooting` | Component-related tags |
| Best practices | `guide`, `best-practices` | Domain-specific tags |
Automated Tag Suggestions
# Example: suggest tags based on page contentdefsuggest_tags(content: str, existing_tags: list) -> list:
"""
Suggest relevant tags based on page content analysis.
"""
keywords = {
"install": ["getting-started", "setup"],
"config": ["configuration", "setup"],
"deploy": ["deployment", "devops"],
"error": ["troubleshooting", "errors"],
"api": ["api", "integration"],
"security": ["security", "authentication"],
"database": ["database", "data"],
"monitor": ["monitoring", "observability"],
}
suggestions = set()
content_lower = content.lower()
for keyword, tags in keywords.items():
if keyword in content_lower:
suggestions.update(tags)
# Limit to most relevantreturnlist(suggestions)[:3]
Search Optimization
Content That Ranks in Internal Search
## Writing for Search Discovery### 1. Start with the Question
Use the question as the title so it matches what users search for:
✅ "How do I reset my password?"
✅ "Why is my deployment failing with error 503?"
❌ "Password Reset Procedure"
❌ "Deployment Error Analysis"
### 2. Include Synonyms in the First Paragraph
Users search with different vocabulary:
> "If your login fails or you can't sign in to the dashboard,> you may need to reset your password. This guide covers> password recovery, credential reset, and account access> restoration."### 3. Use Descriptive Headings
Headings are heavily weighted in search:
✅ "### Resolving Database Connection Timeouts"
❌ "### Issue Resolution"
### 4. Add a Summary Block```markdown
> **TL;DR**: If you see "Error 503 Service Unavailable" during
> deployment, your application server is overloaded. Scale up
> your instance or check for memory leaks before redeploying.
## Content Health Metrics
Track these monthly:
| Metric | Target | How to Measure |
|--------|--------|---------------|
| Stale pages (>6 months since update) | <10% | Git log / last modified dates |
| Orphaned pages (no inbound links) | <5% | Backlink analysis |
| Search failure rate | <15% | Search analytics |
| Pages with no tags | <2% | Tag metadata audit |
| Reader satisfaction | >4/5 | Feedback widget |
| Pages per contributor (monthly) | >2 | Contribution tracking |
Stale Content Detection
# GitHub Action: Find stale docsname:StaleContentCheckon:schedule:-cron:'0 6 1 * *'# First day of every monthjobs:stale-check:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v3with:fetch-depth:0-name:Findstalepagesrun:|
echo "## Stale Documentation (not updated in 6 months)" > stale-report.md
echo "" >> stale-report.md
forfilein$(finddocs-name"*.md"-typef);dolast_commit=$(gitlog-1--format="%cd"--date=short--"$file")if [[ $(date-d"$last_commit"+%s)-lt$(date-d"6 months ago"+%s) ]];thenecho"- [$file]($file) — last updated $last_commit">>stale-report.mdfidone-name:CreateIssueuses:actions/github-script@v6with:script:|
const fs = require('fs');
const body = fs.readFileSync('stale-report.md', 'utf8');
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: 'Monthly Stale Content Report',
body: body,
labels: ['documentation', 'maintenance']
});
Content Lifecycle
┌─────────────┐
│ DRAFT │ ← Created by contributor
└──────┬──────┘
│
┌──────┴──────┐
│ REVIEW │ ← Peer/SME review
└──────┬──────┘
│
┌──────┴──────┐
│ PUBLISHED │ ← Live in knowledge base
└──────┬──────┘
│
┌─────────┴─────────┐
│ │
┌──────┴──────┐ ┌──────┴──────┐
│ UPDATED │ │ ARCHIVED │
└──────┬──────┘ └─────────────┘
│
┌──────┴──────┐
│ REMOVED │
└─────────────┘
Cross-Referencing Strategy
## Cross-Referencing Best Practices### Types of References**Related guides**: Links to other how-to guides on related topics
> See also: [How to Configure Authentication](./authentication.md)**Prerequisites**: Links to content users need before starting
> **Prerequisites**: [Installation Guide](./installation.md), [Account Setup](./account-setup.md)**Deeper dives**: Links from overviews to detailed content
> For more detail, see [API Reference](../reference/api.md)**Troubleshooting links**: Connect error messages to solutions
> If you see "Error 403: Forbidden", see [Troubleshooting Access Issues](./troubleshooting.md#403)### Implementation```markdown
## Resetting a User Password
> **Prerequisites**:
> - [Admin access setup](./admin-access.md)
> - User's email address or user ID
1. Log into the [Admin Dashboard](https://admin.example.com)
2. Navigate to **Users > Search**
3. Find the user and click **Reset Password**
4. The system sends a password reset email
> **Related**: [Bulk User Management](./bulk-user-management.md) |
> [Troubleshooting: Reset email not received](./troubleshooting.md#reset-email)
---
### Contribution Workflows
#### CONTRIBUTING.md for Knowledge Base
```markdown
# Contributing to the Knowledge Base
We welcome contributions from everyone. Here's how to add or improve content.
## Quick Start
1. Fork the knowledge base repository
2. Create a branch: `git checkout -b docs/my-new-guide`
3. Write your content in Markdown
4. Submit a Pull Request
## Content Standards
- **Title**: Clear, question-based or task-based title
- **Description**: One-line summary in frontmatter
- **Tags**: At least 2 tags (content type + topic)
- **Structure**: Prerequisites → Steps → Verification → Troubleshooting
- **Examples**: Include at least one runnable command or code snippet
## Templates
Use the template at `docs/_templates/guide.md` for new guides.
## Review Process
1. **Automated checks**: Markdown linting, link checking, spell check
2. **Peer review**: At least one team member reviews for accuracy
3. **Editorial review**: Content style and structure check (for major additions)
4. **Merge**: Squash and merge to main
## What Gets Accepted
| Type | Accepted? | Review Level |
|------|-----------|-------------|
| New guide | ✅ Yes | Full review |
| Typos/corrections | ✅ Yes | Quick review |
| Code example updates | ✅ Yes | SME review |
| Major rewrites | ✅ Yes | Full review |
| Duplicate content | ❌ No | — |
| Personal opinions | ❌ No | — |
| Outdated information | ⚠️ Requires update | Full review |
<!-- Add to every page -->
## Was this page helpful?- [✅ Yes] [❌ No]
<!-- If No -->
**What could we improve?**
[Free text field]
<!-- Footer -->
Last updated: {{ git_revision_date }}
[Edit this page]({{ edit_url }})