Skip to content

DocsHub Technical Design Document

Version: 2.0 Last Updated: 2026-02-11 Author: iSu Technologies Engineering Status: Production — Living Document


DocsHub is iSu Technologies’ self-hosted, Git-backed static documentation platform serving as the central knowledge hub for the entire organisation. It currently serves 250+ markdown documents across 21 content categories covering products, prospects, operations, marketing, sales enablement, and internal processes.

This document is the single source of truth for DocsHub’s complete technical architecture, feature inventory, and functional specifications. It is designed to be platform-agnostic — if iSu Technologies migrates from MkDocs Material to Docusaurus, Sphinx, GitBook, or any alternative, this document provides everything needed to replicate the system without starting from scratch.


┌─────────────────────────────────────────────────────────┐
│ USERS (Browser) │
│ https://docs.isutech.co.za │
└──────────────────────┬──────────────────────────────────┘
│ HTTPS (Let's Encrypt)
┌──────────────────────────────────────────────────────────┐
│ NGINX (Reverse Proxy) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • Static file serving from /var/www/docs/repo/site │ │
│ │ • Gzip compression (level 6) │ │
│ │ • 1-year static asset caching │ │
│ │ • Security headers (XSS, clickjack, MIME) │ │
│ │ • Hidden file blocking (dotfiles) │ │
│ │ • Optional: Basic auth per-section │ │
│ └─────────────────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────────────┘
│ Reads from filesystem
┌──────────────────────────────────────────────────────────┐
│ STATIC SITE (Built HTML/CSS/JS) │
│ /var/www/docs/repo/site/ │
│ ~44 MB generated output │
└──────────────────────┬──────────────────────────────────┘
│ Built by
┌──────────────────────────────────────────────────────────┐
│ BUILD PIPELINE (Cron) │
│ │
│ ┌─ Every 10 minutes ──────────────────────────────────┐ │
│ │ 1. git pull origin main │ │
│ │ 2. python3 update-frontpage.py │ │
│ │ ├─ Count docs → hero stats │ │
│ │ └─ Parse git log → What's New cards │ │
│ │ 3. mkdocs build --clean │ │
│ │ 4. chown -R docs:docs site/ && chmod 755 │ │
│ └─────────────────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────────────┘
│ Pulls from
┌──────────────────────────────────────────────────────────┐
│ GIT REPOSITORY (GitHub) │
│ github.com/gedeza/isutech-knowledge-hub │
│ Branch: main │ Visibility: Private │
└──────────────────────────────────────────────────────────┘
ComponentLocationDetails
ServerHetzner VPS (46.224.40.5)Ubuntu/Debian, 5.15.0 kernel
Web ServerNginxServes static HTML from site/
SSLLet’s Encrypt via CertbotAuto-renewal enabled
Repository/var/www/docs/repo/Git clone of main branch
Python venv/var/www/docs/venv/Isolated MkDocs environment
Cron script/var/www/docs/scripts/update-docs.shSymlink to deployment/update-docs.sh
Build output/var/www/docs/repo/site/Nginx document root
Logs/var/log/docs-update.logBuild pipeline logs
Nginx logs/var/log/nginx/docs-{access,error}.logHTTP request logs

LayerTechnologyVersionPurpose
Static Site GeneratorMkDocs1.6.1Markdown → HTML build engine
ThemeMaterial for MkDocs9.6.23UI framework, components, search
SearchLunr.js (built-in)Client-side full-text search
Git datesmkdocs-git-revision-date-localized-plugin1.3.0”Last updated” timestamps from git
Minificationmkdocs-minify-plugin0.8.0HTML/CSS/JS minification
GitGitPython3.1.45Python git operations (transitive dep)
LanguagePython3.x (system)Build toolchain runtime
Web ServerNginxSystemStatic file serving + TLS termination
SSLLet’s Encrypt / CertbotHTTPS certificate management
Version ControlGit / GitHubSource control, collaboration
CI/CDCron (server-side)10-minute auto-pull + rebuild
Custom Automationupdate-frontpage.pyDynamic hero stats & changelog
DNSExternal DNS providerdocs.isutech.co.za → 46.224.40.5

3.2 Python Dependencies (requirements.txt)

Section titled “3.2 Python Dependencies (requirements.txt)”
mkdocs-material==9.6.23
mkdocs-git-revision-date-localized-plugin==1.3.0
mkdocs-minify-plugin==0.8.0

Transitive dependencies installed automatically: mkdocs, mkdocs-material-extensions, gitpython, gitdb, Jinja2, Markdown, PyYAML, Pygments, pymdown-extensions, etc.

DecisionWhy
MkDocs over DocusaurusPython ecosystem matches team skills; simpler config than React-based alternatives
Material themeBest-in-class documentation theme; built-in search, dark mode, responsive design, 8000+ icons
Self-hosted over SaaSData sovereignty for sensitive business documents; no per-seat pricing
Cron over webhooksSimpler infrastructure; 10-min latency acceptable for internal docs
Static site over CMSNo database, no auth server, no session management — just files

Every feature below is implemented and production-active. Each includes the implementation mechanism so it can be replicated on any platform.


AttributeValue
StatusActive
MechanismLunr.js index built at compile time, served as JSON
Configurationseparator: '[\s\-\.]+' for hyphenated/dotted terms
FeaturesSearch suggestions, result highlighting, shareable search URLs
UXAccessible via / keyboard shortcut or search bar

Platform Migration Notes:

  • Docusaurus: Use @docusaurus/plugin-content-docs with Algolia DocSearch or local search plugin
  • Starlight: Pagefind built-in — zero configuration, runs at build time, ~5KB client bundle
  • Sphinx: Use sphinx.ext.autosummary + sphinx_search or Algolia
  • Any: Client-side search requires a JSON index; server-side search requires Elasticsearch/Meilisearch

AttributeValue
StatusActive
MechanismMaterial theme palette config with toggle icons
Light schemedefault with custom gold primary
Dark schemeslate with custom gold primary
PersistenceBrowser localStorage (handled by Material JS)

Implementation:

palette:
- scheme: default
toggle:
icon: material/brightness-7
name: Switch to dark mode
- scheme: slate
toggle:
icon: material/brightness-4
name: Switch to light mode

Platform Migration Notes:

  • Docusaurus: Built-in colorMode in docusaurus.config.js
  • Starlight: Built-in with OS auto-detection + manual toggle; dark/light CSS vars in --sl-color-*
  • Sphinx: Use furo or sphinx-book-theme with dark mode support
  • Any: Requires CSS custom properties switching + JS toggle + localStorage

AttributeValue
StatusActive
MechanismMaterial navigation.instant with XHR page fetching
PrefetchPages prefetched on hover (navigation.instant.prefetch)
ProgressLoading bar shown during navigation (navigation.instant.progress)
URL trackingURL updates as user scrolls (navigation.tracking)

Platform Migration Notes:

  • Docusaurus: Built-in SPA (React Router)
  • Starlight: Built-in via Astro’s View Transitions API (optional, zero-JS by default); prefetch on hover
  • Sphinx: Not native; requires custom JS or sphinx-immaterial
  • Any: Implement with fetch() + history.pushState() + DOM diffing

AttributeValue
StatusActive
Top-level tabs13 sections (Home, About, Marketing, BD, Projects, Case Studies, Prospects, Sales, Operations, Knowledge Base, Products, Templates)
Sticky tabsTabs remain visible on scroll
Section indexesDirectory README.md files serve as section landing pages
Expandable sectionsAll sections expanded by default
BreadcrumbsPath navigation shown (navigation.path)
Back to topFloating button on long pages

Complete Navigation Tree (13 top-level sections, 100+ pages):

Home
├── Getting Started
├── User Guide
├── Admin Guide
├── Document Standards
└── Phase 2 Deployment
About
├── Company Overview
├── Metrics & Impact
└── Technology Stack
Marketing
├── Overview, Quick Start, Cheat Sheet, Tracking, Examples
└── Email Templates (Event, Follow-up, Prospecting, Partnerships)
Business Development → Overview
Projects → Overview
Case Studies
├── Template
├── MGSLG, ThriveSend, Moses Kotane
Prospects & Opportunities
├── Sepfluor (12 docs)
├── SPAR (6 docs)
├── SACE (6 docs)
├── HPCSA (6 docs)
├── NSTF (13 docs)
└── SANSA (14 docs, grouped by phase)
Sales Enablement
├── ThriveSend B2B2G (One-Pager, ROI, Demo Script)
└── AssessFlow (One-Pager, ROI)
Operations
├── Server Management (Hetzner, Monitoring, Dev Workflow)
├── PLG Stack (8 docs: Install, Config, Alerting, Operations, Troubleshooting, Queries, Runbooks, Onboarding)
├── Security (5 docs: Overview, fail2ban, SSH, Kernel, Firewall)
├── DocuHub CLI Reference
├── HR (Onboarding, Remote Work)
└── Development (Code Review Standards)
Knowledge Base → Overview
Products
├── Product Comparison Matrix
├── ThriveSend B2B2G (8 docs + 3 use cases)
├── ThriveSend Technical (Getting Started, User Guide, Developer Guide, Architecture, API, Compliance, Deployment)
├── AssessFlow (8 docs + 3 use cases)
├── DocsHub Market Research (5 docs)
├── DocsHub Sales (6 docs)
├── AutoSlip Sales (6 docs)
└── Strategic Plan
Templates
├── BD Templates (Proposal, Business Case, Opportunity Assessment)
└── Project Templates (Project Charter)

Platform Migration Notes:

  • Docusaurus: sidebars.js with category and doc items
  • Starlight: sidebar array in astro.config.mjs; supports autogenerate: { directory: 'path' } for auto-nav from folders
  • Sphinx: toctree directives in index.rst files
  • Any: Requires sidebar generation from directory structure or explicit config

AttributeValue
StatusActive
Scriptdeployment/update-frontpage.py
TriggerRuns before every mkdocs build via cron pipeline
Marker systemHTML comments: <!-- AUTO:SECTION -->...<!-- /AUTO:SECTION -->

Sub-features:

ComponentSourceLogic
Document countFilesystem docs/**/*.mdCount excluding index.md, README.md, assets/; round down to nearest 5 with ”+“
Category countTop-level dirs under docs/Exclude 00-INDEX, assets, stylesheets, archive
Product countSubdirs under docs/products/Direct count
What’s New cardsgit log --since=90daysFilter significant commits (feat/fix/docs/redesign/style prefixes), skip noise (Merge/WIP/Sync), group by (date, primary_subdir), render top 3 as Material grid cards
Manual overridesdeployment/changelog-overrides.jsonOptional JSON array; overrides prepended before auto cards, total capped at 3

Icon Mapping (28 directory → icon mappings):

Directory PatternIcon
prospects/sansa:material-satellite-variant:
operations/infrastructure/security:material-shield-lock:
operations/infrastructure/plg-stack:material-chart-areaspline:
products/thrive-send-b2b2g:material-send:
products/thrivesend-technical:material-send:
products/autoslip:material-receipt:
products/docshub:material-book-open-variant:
products/assess-flow:material-clipboard-check:
marketing:material-email-outline:
case-studies:material-trophy:
operations:material-cog:
(fallback by prefix)feat→:material-star-four-points:, fix→:material-wrench:, docs→:material-file-document-edit:

Platform Migration Notes:

  • The marker-comment splice pattern is platform-agnostic (works with any markdown/HTML file)
  • The Python script is independent of MkDocs — it manipulates markdown text, not MkDocs APIs
  • For Docusaurus: modify script to target src/pages/index.tsx or docs/intro.md
  • For Starlight: modify script to target src/content/docs/index.md or src/content/docs/index.mdx
  • For Sphinx: modify script to target docs/index.rst (adapt markdown → RST rendering)

AttributeValue
StatusActive
Plugingit-revision-date-localized
ShowsLast modified date + creation date per page
FormatDate only (no time)
SourceGit commit history (not filesystem mtime)

Platform Migration Notes:

  • Docusaurus: showLastUpdateTime: true in plugin options (uses git natively)
  • Starlight: lastUpdated: true in config (built-in, uses git — zero configuration)
  • Sphinx: sphinx-last-updated-by-git extension
  • Any: Run git log -1 --format=%ai -- <file> per document

AttributeValue
StatusActive
Mechanismpymdownx.superfences with Mermaid custom fence
Syntax```mermaid ... ``` code blocks
RenderingClient-side via Mermaid.js (bundled by Material)

Configuration:

- pymdownx.superfences:
custom_fences:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format

Platform Migration Notes:

  • Docusaurus: @docusaurus/theme-mermaid plugin
  • Starlight: @astrojs/starlight-mermaid integration or remark-mermaidjs remark plugin
  • Sphinx: sphinxcontrib-mermaid extension
  • Any: Include mermaid.js CDN + render <div class="mermaid"> blocks

AttributeValue
StatusActive
EnginePygments (server-side at build time)
FeaturesLine numbers, line anchors, language auto-detection, copy button
InlineInline code highlighting via pymdownx.inlinehilite

Platform Migration Notes:

  • Docusaurus: Prism.js (client-side) — built-in
  • Starlight: Shiki (build-time, zero client JS) — built-in with line numbers, copy button, diff highlighting
  • Sphinx: Pygments (built-in)
  • Any: Prism.js or highlight.js for client-side; Pygments or Shiki for build-time

AttributeValue
StatusActive
Syntax!!! note "Title" / ??? note "Title" (collapsible)
Typesnote, abstract, info, tip, success, question, warning, failure, danger, bug, example, quote
Custom stylingGold left border via CSS

Platform Migration Notes:

  • Docusaurus: :::note / :::tip etc. (built-in)
  • Starlight: :::note / :::tip / :::caution / :::danger (built-in Asides) — same syntax as Docusaurus
  • Sphinx: .. note:: / .. warning:: directives (built-in)
  • Any: Requires markdown-it plugin or custom HTML <div class="admonition"> blocks

AttributeValue
StatusActive
Syntax=== "Tab 1" / === "Tab 2" blocks
Cross-linkingTabs sync across pages (content.tabs.link)
StyleAlternate (Material-specific)

Platform Migration Notes:

  • Docusaurus: <Tabs> / <TabItem> JSX components
  • Starlight: <Tabs> / <TabItem> (built-in components, same API as Docusaurus)
  • Sphinx: sphinx-tabs extension
  • Any: Custom JS tabs component

AttributeValue
StatusActive
Syntax<div class="grid cards" markdown> with - list items
Layout3-column default; 4-column on 1400px+; 2-column tablet; 1-column mobile
StylingColored left borders (blue, purple, green, orange cycling), glassmorphism icons, hover transforms
Icons8000+ Material Design icons via :material-icon-name: syntax

Custom CSS Components for Cards:

CSS ClassPurpose
.grid.cardsCard container grid
.grid.cards > ul > li:nth-child(N)Per-card accent colors (4-color rotation)
.lg.middleGlassmorphism icon container (backdrop-filter blur, border, shadow)
.grid.cards svgIcon sizing (2rem) and color matching

Platform Migration Notes:

  • Docusaurus: Custom React component or @docusaurus/plugin-content-docs with MDX cards
  • Starlight: <Card> + <CardGrid> + <LinkCard> built-in components — zero extra packages needed
  • Sphinx: sphinx-design extension for card directives
  • Any: CSS grid + custom HTML/markdown components

AttributeValue
StatusActive
Syntax- [x] Done / - [ ] Todo
StyleCustom checkboxes (Material-themed)

AttributeValue
StatusActive
Syntax++ctrl+alt+del++ renders as styled keyboard keys
Extensionpymdownx.keys

AttributeValue
StatusActive (configured)
Syntax$...$ inline, $$...$$ block
EngineMathJax (generic mode via pymdownx.arithmatex)

AttributeValue
StatusActive
Syntax*[abbr]: Full text at end of document
BehaviorHover tooltip shows full text on abbreviation occurrences

AttributeValue
StatusActive
Syntax[^1] reference, [^1]: Text definition
BehaviorClick to jump; back-reference link

AttributeValue
StatusActive
Edit URIhttps://github.com/gedeza/isutech-knowledge-hub/edit/main/docs/
ButtonsPencil icon (edit), Eye icon (view source) on every page

AttributeValue
StatusActive
LinksGitHub repository, iSu Technologies website
PositionSite footer

AttributeValue
StatusConfigured, not actively used
Providermike (MkDocs versioning tool)
PurposeWhen ready, supports multiple doc versions (v1, v2, latest)

AttributeValue
StatusActive
Pluginmkdocs-minify-plugin
ScopeHTML, JS, CSS minified; HTML comments removed

AttributeValue
StatusActive
Mechanism@media print CSS rules
BehaviorHides header, tabs, sidebar, footer; white background

These are custom-built visual components defined in extra.css that content authors use via HTML classes in markdown documents:

ComponentCSS Class(es)Usage
Hero Section.hero-section, .hero-title, .hero-subtitle, .hero-buttonsLanding page hero banner with grid overlay
Hero Stats.hero-stats, .hero-stat, .hero-stat-value, .hero-stat-labelStat counters in hero (auto-updated)
Service Cards.service-cardBordered cards with gold hover glow
Metric Cards.metric-card, .metric-large, .metric-label, .metric-badgeKPI display cards with gold gradient badges
Status Badges.badge, .badge-success, .badge-warning, .badge-info, .badge-goldColored pill badges
Stat Boxes.stat-boxGold-bordered stat callouts
Timeline.timeline, .timeline-itemVertical gold timeline with circular markers
Feature Grid.feature-grid, .feature-item, .feature-iconAuto-fit responsive feature showcase
Screenshots.screenshot, .screenshot-captionBordered image containers with captions
Diagrams.diagramBordered containers for ASCII/code diagrams
Highlight Boxes.highlight-boxGold-bordered emphasis containers
Progress Bars.progress-bar, .progress-fillGold gradient animated bars
ROI Calculator.roi-calculator, .roi-result, .big-numberGold gradient result displays
Tech Stack Pills.tech-stack, .tech-itemRounded pill layout for technology lists
Comparison Tables.comparison-tableGold gradient header tables
Testimonials.testimonial, .testimonial-author, .testimonial-roleGold-bordered italic quote blocks
CTA Boxes.cta-boxGold gradient call-to-action sections
Quick Access Tables.quick-linksSide-by-side reference tables
Section Headers.section-headerFlex headers with gold underline

TokenHexUsage
--isu-gold#B8860BPrimary brand color, links, accents
--isu-gold-light#DAA520Hover states, gradients
--isu-gold-dark#996515Active states, gradient endpoints
--isu-black#1a1a1aText, headers
--isu-gray#6b7280Subtitles, secondary text
--isu-gray-light#f3f4f6Backgrounds, code blocks

Card Accent Colors (4-color rotation):

PositionColorHex
Card 1Blue#3b82f6
Card 2Purple#8b5cf6
Card 3Green#10b981
Card 4Orange#f59e0b
ElementFontWeightSize
Body textRoboto4001rem (16px)
CodeRoboto Mono400
Hero titleRoboto7002.25rem desktop, 1.5rem mobile
H1Roboto1.75rem mobile
H2Roboto1.5rem mobile
ButtonsRoboto500
PropertyValue
Content max-width1800px
Grid max-width95% of viewport
Card border-radius12px
Button border-radius50px (pill)
Grid background50px gold grid overlay (3% opacity)
Card gap1.5rem
Section spacing<hr> with 1.5rem margin
BreakpointBehavior
1400px+4-column card grid
1000–1399px3-column card grid
769–900px2-column card grid, 2-column features
768px (tablet)1-column cards, stacked hero buttons, scrollable tables
480px (phone)Tighter spacing, smaller icons (3rem), smaller fonts
Landscape phones1.5rem content padding
Touch devicesDisabled hover transforms, 44px min touch targets
EffectImplementation
Glassmorphism iconsbackdrop-filter: blur(10px), semi-transparent white background, subtle border
Card hovertranslateY(-4px), colored box-shadow (matching accent), background gradient intensification
Icon hoverscale(1.08) rotate(-3deg), intensified colored shadow
Button hovertranslateY(-2px), gold box-shadow
Gold grid overlayCSS linear-gradient background-image on body and .hero-section::before
AssetPathUsage
iSu Logodocs/assets/images/isutech-logo.pngHeader logo + favicon

MetricValue
Total markdown files251
Active content files~240 (excluding index/README)
Content categories21 top-level directories
Products documented6 (ThriveSend B2B2G, ThriveSend Technical, AssessFlow, DocsHub, AutoSlip, DocsHub Market Research)
Prospect tracks7 (Sepfluor, SPAR, SACE, HPCSA, NSTF, NSF Skills Dev, SANSA)
Total content size~9.5 MB markdown
Built site size~44 MB HTML/CSS/JS/assets
docs/
├── 00-INDEX/ # Standards, guides, getting started (7 files)
├── about/ # Company overview, metrics, tech stack (3 files)
├── archive/ # Deprecated content
├── assets/images/ # Logo and static images
├── business-analysis/ # Opportunity assessments, stakeholder mapping
├── business-development/ # BD overview
├── case-studies/ # MGSLG, ThriveSend, Moses Kotane (4 files)
├── compliance-governance/ # Compliance docs
├── demo-presentation/ # Demo materials
├── deployment/ # Deployment docs (meta)
├── development/ # Development journal
├── document-templates/ # BD templates, project templates (4 files)
├── infrastructure/ # Hetzner server management
├── knowledge-base/ # Organisational knowledge
├── marketing/ # Email templates, campaigns (10+ files)
├── operations/ # Server, HR, dev workflow, security, PLG stack (20+ files)
├── products/ # 6 product lines (50+ files)
├── project-planning/ # Cost breakdowns, financial analysis
├── projects/ # Active projects overview
├── prospects/ # 7 prospect tracks (60+ files)
├── prototype/ # Data models, MVP features, requirements
├── sales-enablement/ # ThriveSend + AssessFlow sales materials (5 files)
├── stakeholder-materials/ # Demos, presentations, ROI analysis
├── stylesheets/ # extra.css (custom branding)
└── technical-architecture/ # Architecture docs

Defined in 00-INDEX/DOCUMENT_STANDARDS.md:

StandardRule
File naminglowercase-with-hyphens.md
Dated docsYYYY-MM-DD-name.md
Client docsclient-name-document-type-vX.md
Templatesdocument-type-template.md
Directory indexREADME.md in each directory
MetadataFrontmatter with title, date, author, status
LifecycleDraft → Review → Published → Archived
HeadingsH1 for title, H2 for sections, H3 for subsections

Each prospect follows a standardised document set (varies by maturity):

DocumentPurpose
executive-summary-one-pager.md1-page overview for decision-makers
pricing-investment-options.mdTiered pricing proposals
demo-script.mdStructured demo walkthrough
objection-handling-guide.mdCommon objections + responses
competitive-positioning.mdCompetitive analysis
implementation-roadmap.mdPhased delivery plan
technical-overview.mdArchitecture & integration details
first-outreach-message.mdInitial email templates
discovery-meeting-preparation.mdMeeting prep guide
case-studies-proof-points.mdRelevant proof points

┌─────────┐ ┌──────────┐ ┌──────────────────┐ ┌─────────────┐ ┌──────────┐
│ Cron │───►│ git pull │───►│ update-frontpage │───►│ mkdocs build│───►│ chmod │
│ (10 min) │ │ origin │ │ .py │ │ --clean │ │ docs:docs│
└─────────┘ │ main │ │ │ │ │ │ 755 │
└──────────┘ └──────────────────┘ └─────────────┘ └──────────┘

Location: deployment/update-docs.sh Cron: */10 * * * * /var/www/docs/scripts/update-docs.sh

#!/bin/bash
LOG_FILE="/var/log/docs-update.log"
REPO_DIR="/var/www/docs/repo"
VENV_DIR="/var/www/docs/venv"
# 1. Navigate to repo
cd $REPO_DIR
# 2. Pull latest
git pull origin main
# 3. Activate venv
source $VENV_DIR/bin/activate
# 4. Auto-update front page (hero stats + What's New)
python3 $REPO_DIR/deployment/update-frontpage.py
# 5. Build
mkdocs build --clean
# 6. Set permissions
chown -R docs:docs $REPO_DIR/site
chmod -R 755 $REPO_DIR/site

7.3 update-frontpage.py (Dynamic Content Generator)

Section titled “7.3 update-frontpage.py (Dynamic Content Generator)”

Location: deployment/update-frontpage.py CLI flags: --dry-run (stdout only), --verbose (debug logging)

FunctionPurpose
count_docs()Counts .md files under docs/ excluding index, README, assets
count_categories()Counts content directories (excludes 00-INDEX, assets, stylesheets, archive)
count_products()Counts subdirectories under docs/products/
round_down_to_5()Displays doc count as 250+ style
get_git_log()Runs git log --since=90days --name-only -- docs/
parse_git_log()Structures raw log into {hash, date, message, files}
get_primary_subdir()Maps file list to primary content directory
group_commits()Groups by (date, subdir), filters noise, selects significant
render_card()Generates Material grid card markdown
splice_content()Replaces content between <!-- AUTO:SECTION --> markers
load_overrides()Reads optional changelog-overrides.json

Safety guarantees:

  • Never crashes the build (all errors caught, exit 0)
  • Idempotent (skips unchanged files)
  • Falls back gracefully if git is unavailable

Optional file: deployment/changelog-overrides.json

[
{
"icon": ":material-rocket:",
"title": "Major Product Launch",
"month_year": "March 2026",
"bullets": [
"Feature A released",
"Feature B released"
],
"link": "products/new-product/README.md",
"subdir": "products/new-product"
}
]

HeaderValuePurpose
X-Frame-OptionsSAMEORIGINPrevents clickjacking
X-Content-Type-OptionsnosniffPrevents MIME sniffing
X-XSS-Protection1; mode=blockXSS attack prevention
Referrer-Policyno-referrer-when-downgradeReferrer leakage control
ControlStatusDetails
HTTPSEnforcedLet’s Encrypt via Certbot, auto-renewal
Dotfile blockingActiveNginx denies location ~ /\.
Basic authConfigured (inactive)Per-section .htpasswd ready in nginx config
IP whitelistConfigured (inactive)Per-section IP restriction ready
RepositoryPrivateGitHub private repo with token auth
Asset TypeCache DurationHeaders
Images (jpg, png, gif, ico, svg)1 yearCache-Control: public, immutable
CSS, JS1 yearCache-Control: public, immutable
Fonts (woff, woff2, ttf, eot)1 yearCache-Control: public, immutable
HTML pagesNo cache headerServed fresh (nginx default)
SettingValue
GzipEnabled
Compression level6
Content typestext/plain, text/css, text/xml, text/javascript, application/json, application/javascript, application/xml+rss, application/atom+xml, image/svg+xml

Complete inventory of enabled markdown extensions and their syntax:

ExtensionSyntax ExamplePurpose
abbr*[HTML]: HyperText Markup LanguageAbbreviation tooltips
admonition!!! note "Title"Callout boxes
attr_list{ .class #id }HTML attributes on elements
def_listTerm\n: DefinitionDefinition lists
footnotes[^1] / [^1]: TextFootnote references
md_in_html<div markdown>Markdown inside HTML blocks
tables`col
tocAuto-generatedTable of contents (3-level, permalink anchors)
ExtensionSyntax ExamplePurpose
arithmatex$E = mc^2$LaTeX math rendering
betterem**bold** _italic_Improved emphasis handling
caret^^superscript^^Superscript text
details??? note "Click"Collapsible sections
emoji:material-home: :octicons-arrow-right-24:8000+ icons (Material + Octicons)
highlight```python ... ```Syntax highlighting (Pygments)
inlinehilite`#!python 3+4`Inline code highlighting
keys++ctrl+c++Keyboard key display
mark==highlighted==Text highlighting
smartsymbols(c) (tm) -->Smart typography
superfences```mermaid ... ```Fenced code + Mermaid diagrams
tabbed=== "Tab 1"Content tabs
tasklist- [x] DoneCheckbox task lists
tilde~~strikethrough~~ / ~subscript~Strikethrough + subscript

# Site metadata
site_name: "iSu Technologies Documentation"
site_url: "https://docs.isutech.co.za"
site_author: "iSu Technologies Team"
site_description: "Central documentation hub..."
repo_url: "https://github.com/gedeza/isutech-knowledge-hub"
repo_name: "gedeza/isutech-knowledge-hub"
edit_uri: "edit/main/docs/"
copyright: "Copyright © 2025 iSu Technologies (Pty) Ltd"
docs_dir: "docs"
site_dir: "site"
strict: false
# Theme
theme:
name: material
language: en
palette: [light + dark with toggle]
font: {text: Roboto, code: Roboto Mono}
features: [21 features enabled — see Section 4]
logo: assets/images/isutech-logo.png
favicon: assets/images/isutech-logo.png
icon: {repo: github, edit: pencil, view: eye}
# Navigation: 13 top-level sections (see Section 4.4)
# Plugins
plugins:
- search: {lang: en, separator: '[\s\-\.]+'}
- git-revision-date-localized: {enable_creation_date: true, type: date}
- minify: {minify_html: true, minify_js: true, minify_css: true, htmlmin_opts: {remove_comments: true}}
# Extensions: 20+ markdown extensions (see Section 9)
# Extra
extra:
social: [{github}, {website}]
version: {provider: mike}
extra_css: [stylesheets/extra.css]
venv/ __pycache__/ *.py[cod] *.so *.egg dist/ build/
site/ .cache/
.vscode/ .idea/ *.swp *.swo *~ .DS_Store
.env .env.local
*.log *.tmp *.temp .temp/
*.bak *.backup
Thumbs.db

10.3 Nginx Configuration (nginx-docs.conf)

Section titled “10.3 Nginx Configuration (nginx-docs.conf)”

See Section 8 for full security and caching details.

Key directives:

server_name docs.isutech.co.za;
root /var/www/docs/repo/site;
try_files $uri $uri/ =404;
# + security headers, gzip, caching, dotfile blocking

FactorMkDocs MaterialDocusaurusStarlight (Astro)SphinxGitBook
LanguagePythonJavaScript/ReactJavaScript/AstroPythonSaaS
Content formatMarkdownMDX (Markdown + JSX)Markdown + MDXreStructuredText + MarkdownMarkdown
SearchLunr.js (client)Algolia or localPagefind (client, zero-config)Sphinx searchBuilt-in
Dark modeBuilt-in toggleBuilt-in toggleBuilt-in toggle (auto)Theme-dependentBuilt-in
DiagramsMermaidMermaidMermaid (via plugin)Mermaid/GraphvizMermaid
Custom componentsCSS + HTML-in-MDReact componentsAstro components (HTML+JS islands)DirectivesLimited
VersioningmikeBuilt-inManual (multi-deploy)Built-inBuilt-in
Build speed~55s for 251 docsFaster (incremental)Fastest (partial hydration, ~15-25s)SimilarN/A (SaaS)
Self-hostedYesYesYesYesNo (SaaS)
Hosting cost$0 (static files)$0 (static files)$0 (static files)$0 (static files)$8+/user/mo
JS shipped to clientMinimal (theme JS)Heavy (~300KB React runtime)Near-zero (islands architecture)MinimalN/A
i18nPlugin-basedBuilt-inBuilt-in (first-class)Built-inBuilt-in
TypeScript supportN/AFullFull (type-safe config)N/AN/A
Component frameworkNoneReact onlyAny (React, Vue, Svelte, Solid, none)NoneNone
Ecosystem maturityMature (2014+)Mature (2017+)Growing (2023+)Very mature (2008+)Mature (SaaS)

Effort estimate: 2-3 days

Step 1: Project Setup

Terminal window
npx create-docusaurus@latest docshub classic --typescript

Step 2: Content Migration

  • Copy docs/ directory as-is (Docusaurus reads .md natively)
  • Rename README.md files to index.md (Docusaurus convention)
  • Convert mkdocs.yml nav to sidebars.js:
// sidebars.js (generated from mkdocs.yml nav)
module.exports = {
docs: [
{type: 'category', label: 'Home', items: [
'index', '00-INDEX/GETTING_STARTED', '00-INDEX/USER_GUIDE',
'00-INDEX/ADMIN_GUIDE', '00-INDEX/DOCUMENT_STANDARDS',
]},
{type: 'category', label: 'About', items: [
'about/company-overview', 'about/metrics-showcase', 'about/tech-stack',
]},
// ... continue for all 13 sections
],
};

Step 3: Feature Parity Mapping

MkDocs FeatureDocusaurus Equivalent
!!! note admonitions:::note / :::tip etc.
=== "Tab" content tabs<Tabs> + <TabItem> components
:material-icon: iconsInstall @iconify/react or use emojis
<div class="grid cards">Custom React <CardGrid> component
pymdownx.superfences mermaid@docusaurus/theme-mermaid
git-revision-dateshowLastUpdateTime: true
extra.css custom stylessrc/css/custom.css
Marker-comment auto-updateModify update-frontpage.py to target src/pages/index.tsx

Step 4: Theme/Branding

  • Port CSS variables to src/css/custom.css
  • Recreate glassmorphism cards as React component
  • Port responsive breakpoints

Step 5: Build Integration

  • Replace mkdocs build --clean with npm run build in update-docs.sh
  • Adjust nginx.conf root to build/ instead of site/

Effort estimate: 2-3 days

Why consider Starlight: Starlight is Astro’s purpose-built documentation framework. It ships near-zero JavaScript to the client (islands architecture), has built-in i18n, Pagefind search (no external service), and the fastest build times of any SSG. It’s the strongest modern alternative to MkDocs Material for content-heavy documentation sites.

Step 1: Project Setup

Terminal window
npm create astro@latest -- --template starlight docshub
cd docshub

This scaffolds a complete Starlight project with:

  • astro.config.mjs — site config (equivalent to mkdocs.yml)
  • src/content/docs/ — content directory (equivalent to docs/)
  • src/assets/ — images and static files
  • src/styles/ — custom CSS

Step 2: Content Migration

  • Copy all docs/**/*.md files to src/content/docs/
  • Rename README.md files to index.md (Starlight convention)
  • Add frontmatter to each file (Starlight requires title: at minimum):
---
title: Company Overview
description: iSu Technologies company overview and metrics
---
# existing content here...
  • Convert mkdocs.yml nav to astro.config.mjs sidebar:
astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
export default defineConfig({
integrations: [
starlight({
title: 'iSu Technologies Documentation',
logo: {
src: './src/assets/isutech-logo.png',
},
social: {
github: 'https://github.com/gedeza/isutech-knowledge-hub',
},
editLink: {
baseUrl: 'https://github.com/gedeza/isutech-knowledge-hub/edit/main/docs/',
},
sidebar: [
{
label: 'Home',
items: [
{ label: 'Getting Started', slug: '00-index/getting-started' },
{ label: 'User Guide', slug: '00-index/user-guide' },
{ label: 'Admin Guide', slug: '00-index/admin-guide' },
{ label: 'Document Standards', slug: '00-index/document-standards' },
],
},
{
label: 'About',
items: [
{ label: 'Company Overview', slug: 'about/company-overview' },
{ label: 'Metrics & Impact', slug: 'about/metrics-showcase' },
{ label: 'Technology Stack', slug: 'about/tech-stack' },
],
},
// ... continue for all 13 sections
{
label: 'Products',
autogenerate: { directory: 'products' },
},
{
label: 'Prospects',
autogenerate: { directory: 'prospects' },
},
],
customCss: ['./src/styles/custom.css'],
}),
],
});

Step 3: Feature Parity Mapping

MkDocs FeatureStarlight Equivalent
!!! note admonitions:::note / :::tip / :::caution / :::danger (built-in Asides)
=== "Tab" content tabs<Tabs> + <TabItem> components (built-in)
:material-icon: icons<Icon name="star" /> component (built-in, uses @iconify) or install starlight-icon-badges
<div class="grid cards"><CardGrid> + <Card> components (built-in)
pymdownx.superfences mermaidastro-diagram integration or <Code> with custom renderer
git-revision-datelastUpdated: true in config (built-in, uses git)
extra.css custom stylescustomCss: ['./src/styles/custom.css'] in config
Dark/light toggleBuilt-in (auto-detects OS preference + manual toggle)
Full-text searchPagefind — zero-config, built-in, no external service
Marker-comment auto-updateModify update-frontpage.py to target src/content/docs/index.md
md_in_htmlUse .mdx extension — full component support in markdown
Code copy buttonBuilt-in with <Code> component
Table of contentsBuilt-in right sidebar TOC
BreadcrumbsBuilt-in
Edit on GitHubeditLink.baseUrl in config

Step 4: Built-in Components (No Plugins Needed)

Starlight ships these components out of the box — no extra packages:

---
title: Example Page
---
import { Card, CardGrid, Tabs, TabItem, LinkCard, Aside, Badge, Icon, Steps } from '@astrojs/starlight/components';
<CardGrid>
<Card title="ThriveSend B2B2G" icon="rocket">
7 production-ready marketing channels.
[View Docs →](/products/thrive-send-b2b2g/)
</Card>
<Card title="Security Hardening" icon="shield">
Comprehensive server security documentation.
</Card>
</CardGrid>
<Tabs>
<TabItem label="Email">Resend integration...</TabItem>
<TabItem label="SMS">Twilio integration...</TabItem>
</Tabs>
:::note[Important]
This is a built-in aside/admonition — no plugin required.
:::
<Steps>
1. Clone the repository
2. Install dependencies
3. Run the build
</Steps>

Step 5: Theme/Branding

Port CSS variables to src/styles/custom.css:

src/styles/custom.css
:root {
--sl-color-accent-low: #996515;
--sl-color-accent: #B8860B;
--sl-color-accent-high: #DAA520;
--sl-color-white: #ffffff;
--sl-color-gray-1: #f3f4f6;
--sl-color-gray-5: #1a1a1a;
--sl-font: 'Roboto', sans-serif;
--sl-font-mono: 'Roboto Mono', monospace;
}
/* Starlight uses CSS custom properties extensively — */
/* override these instead of writing selectors from scratch */
:root[data-theme='dark'] {
--sl-color-accent-low: #DAA520;
--sl-color-accent: #B8860B;
--sl-color-accent-high: #996515;
}

Starlight’s theming is simpler than Material — most visual customisation is done through ~20 CSS custom properties rather than 1,256 lines of selector overrides.

Step 6: Custom Astro Components for Advanced UI

For DocsHub’s custom components (hero, timeline, ROI calculator, etc.), create Astro components:

src/
├── components/
│ ├── Hero.astro # Hero section with auto-stats
│ ├── MetricCard.astro # KPI display cards
│ ├── Timeline.astro # Gold timeline component
│ ├── ROICalculator.astro # Interactive ROI display
│ ├── TechStack.astro # Tech pill badges
│ └── Testimonial.astro # Quote blocks

Astro components are pure HTML + CSS + scoped JS — no framework runtime shipped to the client:

src/components/MetricCard.astro
---
const { value, label } = Astro.props;
---
<div class="metric-card">
<span class="metric-large">{value}</span>
<span class="metric-label">{label}</span>
</div>
<style>
.metric-card {
text-align: center;
padding: 1.5rem;
border: 2px solid #e5e7eb;
border-radius: 12px;
}
.metric-large {
font-size: 2.5rem;
font-weight: 700;
color: var(--sl-color-accent);
}
</style>

Step 7: Build Integration

  • Replace mkdocs build --clean with npm run build in update-docs.sh
  • Adjust nginx.conf root to dist/ instead of site/
  • Add package.json to repo root with build scripts
  • Starlight build output is in dist/ by default
Terminal window
# update-docs.sh changes
npm ci --production # install deps (cached, fast)
npm run build # astro build → dist/

Step 8: Mermaid Diagrams

Install the Mermaid integration:

Terminal window
npx astro add @astrojs/starlight-mermaid

Or use the community remark-mermaidjs plugin in astro.config.mjs.

Starlight Advantages over MkDocs Material:

AdvantageDetail
Build speedAstro’s partial hydration = ~15-25s for 250+ docs vs ~55s
Client JSShips ~0KB JS by default (islands opt-in) vs ~150KB
SearchPagefind runs at build time, no external service, ~5KB client
i18nFirst-class multi-language with route-based locale prefixes
ComponentsUse any framework (React, Vue, Svelte) or none — Astro components are zero-JS
Type safetyContent collections with Zod schema validation for frontmatter
Modern toolingVite-based dev server with HMR, TypeScript throughout

Starlight Limitations vs MkDocs Material:

LimitationDetail
Ecosystem maturityNewer (2023) — fewer plugins than MkDocs or Docusaurus
Icon libraryDoesn’t ship 8000+ Material icons by default — use @iconify
VersioningNo built-in doc versioning (requires multi-deploy strategy)
Python ecosystemRequires Node.js — different stack from current setup
Community sizeSmaller community than Docusaurus or MkDocs (but growing fast)

Effort estimate: 3-5 days (RST conversion is the main cost)

Step 1: Project Setup

Terminal window
pip install sphinx sphinx-immaterial myst-parser
sphinx-quickstart

Step 2: Content Migration

  • Option A: Use myst-parser to keep Markdown files (recommended)
  • Option B: Convert .md to .rst using pandoc --from=markdown --to=rst
  • Convert mkdocs.yml nav to toctree directives in each index.rst

Step 3: Feature Parity

MkDocs FeatureSphinx Equivalent
Material themesphinx-immaterial theme
Admonitions.. note:: directives (native)
Mermaidsphinxcontrib-mermaid
SearchBuilt-in Sphinx search
Git datessphinx-last-updated-by-git
Tabssphinx-tabs or sphinx-design
Cardssphinx-design card directive

Step 4: Build Integration

  • Replace mkdocs build with sphinx-build -b html docs/ site/

Use this checklist regardless of target platform:

  • Content: Copy all 251 .md files preserving directory structure
  • Navigation: Recreate 13-section, 100+ page nav tree from mkdocs.yml
  • Search: Enable full-text search with [\s\-\.]+ separator
  • Dark mode: Configure light/dark toggle with localStorage persistence
  • Branding: Port 6 CSS custom properties (gold palette) + 50+ custom classes
  • Responsive: Implement 6 breakpoints (480, 768, 900, 1000, 1200, 1400px)
  • Cards: Recreate 3/4-column grid with colored accents and glassmorphism icons
  • Admonitions: Map !!! syntax to target platform’s callout syntax
  • Mermaid: Enable Mermaid.js diagram rendering
  • Code highlighting: Enable syntax highlighting with line numbers and copy button
  • Git dates: Show “last updated” from git history on each page
  • Auto-update script: Adapt update-frontpage.py for new index file format
  • Nginx: Update root directive to new build output directory
  • Cron: Update update-docs.sh with new build command
  • Security headers: Carry forward all 4 security headers
  • SSL: Certbot config is site-agnostic (no changes needed)
  • Icons: Map 28 :material-*: icons to target platform’s icon system
  • Custom components: Port hero, timeline, metrics, testimonials, CTA, ROI, tech-stack, comparison table, screenshots, diagrams, progress bars, badges, stat boxes, highlight boxes, quick-links
  • Print stylesheet: Port @media print rules
  • Minification: Enable HTML/CSS/JS minification
  • Footer: Recreate social links (GitHub, website)
  • Edit links: Configure “Edit on GitHub” links with correct URI pattern

  1. Create .md file in appropriate docs/ subdirectory
  2. Follow naming convention: lowercase-with-hyphens.md
  3. Add to nav: section in mkdocs.yml
  4. Commit and push to main
  5. Wait up to 10 minutes for auto-deploy (or trigger manually)
  1. Create directory: docs/products/<product-name>/
  2. Create README.md as section index
  3. Add product documents (product-brief, demo-script, etc.)
  4. Add nav section under Products: in mkdocs.yml
  5. Add directory mapping to update-frontpage.py (DIR_ICON_MAP, DIR_TITLE_MAP)
  6. Product count on front page auto-updates on next build
  1. Create directory: docs/prospects/<prospect-name>/
  2. Copy standard document set (see Section 6.4)
  3. Add nav section under Prospects & Opportunities: in mkdocs.yml
  4. Add directory mapping to update-frontpage.py
Terminal window
cd /var/www/docs/repo
source /var/www/docs/venv/bin/activate
python3 deployment/update-frontpage.py --verbose
mkdocs build --clean
CheckCommandExpected
Site accessiblecurl -sI https://docs.isutech.co.zaHTTP 200
SSL validecho | openssl s_client -connect docs.isutech.co.za:443 2>/dev/null | openssl x509 -datesNot expired
Build logstail -20 /var/log/docs-update.log”Completed Successfully”
Nginx logstail -20 /var/log/nginx/docs-error.logNo errors
Disk usagedu -sh /var/www/docs/repo/site/~44 MB
SymptomLikely CauseFix
Site shows old contentCron not runningCheck crontab -l, verify script path
Build failsBroken markdown/YAMLCheck tail -50 /var/log/docs-update.log
404 on pagesPage not in navAdd to mkdocs.yml nav section
Search not workingIndex staleRun mkdocs build --clean
SSL expiredCertbot renewal failedcertbot renew --dry-run, check timer
Slow page loadsCache misconfiguredVerify nginx cache headers

Complete inventory of every configuration and infrastructure file:

FilePurposeLines
mkdocs.ymlSite generator configuration429
requirements.txtPython dependencies3
.gitignoreGit exclusion rules41
docs/stylesheets/extra.cssCustom branding and components1,256
docs/index.mdFront page with auto-update markers~407
docs/assets/images/isutech-logo.pngBrand logo
deployment/update-docs.shCron build script56
deployment/update-frontpage.pyDynamic front page generator~400
deployment/nginx-docs.confNginx site configuration73
deployment/DEPLOYMENT_CHECKLIST.md16-section deployment checklist
deployment/MAINTENANCE_GUIDE.mdMonthly maintenance procedures515
deployment/README.mdDeployment overview

MetricTargetCurrent
Page load time< 2 secondsMet (static site + CDN-capable)
Build time< 120 seconds~55 seconds
Uptime> 99.9%Met (static files, minimal failure modes)
Auto-update latency< 10 minutes10-minute cron cycle
Search response< 200msMet (client-side Lunr.js)

EnhancementComplexityNotes
GitHub Actions CI/CDLowReplace cron with webhook-triggered builds
Algolia DocSearchLowBetter search UX with server-side index
Google AnalyticsLowUncomment analytics: in mkdocs.yml
Doc versioningMediumActivate mike for v1/v2/latest
PDF exportMediummkdocs-pdf-export-plugin
Auth per sectionLowUncomment nginx basic auth blocks
Multi-repo syncMediumExtend ThriveSend sync pattern to other products
Automated testingMediumLink checker, markdown linting in CI
i18nHighMulti-language support (Material supports it)

This document is maintained alongside the DocsHub codebase. When infrastructure changes, update this document to keep it accurate for future migrations.