professional-word-output/SKILL.md
Generate world-class, professionally designed Microsoft Word (.docx) documents that look like a designer and communications specialist worked on them together — not AI output. Use when producing any .docx file: reports, proposals, manuals...
npx skillsauth add peterbamuhigire/skills-web-dev professional-word-outputInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
professional-word-output or would be better handled by a more specific companion skill.references only as needed.SKILL.md first, then load only the referenced deep-dive files that are necessary for the task.references/ directory for deep detail after reading the core workflow below.Two things kill document quality equally: bad design and bad writing. A document must pass both tests. This skill addresses both.
Reference files (read when needed):
references/typography-layout.md — fonts, spacing, margins, colour palettes, visual hierarchyreferences/written-communication.md — structure, clarity, tone, anti-patternsreferences/word-features.md — styles, TOC, tables, images, sections, cover pages, watermarksreferences/quality-checklist.md — pre-delivery checklist (run before every delivery)Every document produced must pass this bar: a professional communications specialist and a document designer would both be satisfied. This means:
Documents are produced via Pandoc + python-docx + reference.docx template:
Markdown source (structured content)
↓ pandoc --reference-doc=templates/reference.docx
.docx (styles applied from reference.docx)
↓ manual python-docx post-processing (cover page, TOC, header/footer)
Final .docx → PDF export
# Single document
pandoc source.md -o output.docx --reference-doc=templates/reference.docx
# With table of contents
pandoc source.md -o output.docx --reference-doc=templates/reference.docx --toc --toc-depth=3
# Rebuild reference.docx from scratch
python scripts/create-reference-docx.py
Pandoc maps Markdown elements to named Word styles in reference.docx. Never bypass this with direct formatting.
| Markdown element | Word style |
|---|---|
| # Heading | Heading 1 |
| ## Heading | Heading 2 |
| ### Heading | Heading 3 |
| #### Heading | Heading 4 |
| Body paragraph | Normal |
| ```code block``` | Source Code / Verbatim |
| `inline code` | Verbatim Char |
| > blockquote | Block Text |
| Table | Table Grid |
| YAML title: | Title |
| YAML subtitle: | Subtitle |
| *Caption* below figure/table | Caption |
If a style needs to change, change it in reference.docx — never in the document directly.
These rules are mandatory. They determine how the document breathes across pages and whether the reader can follow the structure without effort.
Every # Heading 1 forces a page break before it. Major sections never share a page with the section that precedes them. This makes the document scannable: readers flipping through pages immediately see where each chapter/section begins.
Word setting: Paragraph → Line and Page Breaks → Page break before = ON
python-docx:
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
h1 = doc.styles['Heading 1']
h1.paragraph_format.page_break_before = True
h1.paragraph_format.keep_with_next = True # heading never orphaned alone
If the heading plus its first following paragraph do not entirely fit on the current page, the whole unit moves to the next page. A heading that appears at the bottom of a page with its content on the next page is a design failure.
Word settings on Heading 2 and Heading 3:
Word setting on Normal / body paragraphs:
This combination means: the heading is glued to the paragraph that follows it, and that paragraph will not be split across pages. If the pair doesn't fit, both move to the next page.
python-docx:
for style_name in ['Heading 2', 'Heading 3']:
style = doc.styles[style_name]
style.paragraph_format.keep_with_next = True
style.paragraph_format.keep_together = True
# Body paragraphs: never split mid-paragraph
doc.styles['Normal'].paragraph_format.keep_together = True
No paragraph's first line appears alone at the bottom of a page (orphan), and no paragraph's last line appears alone at the top of a page (widow).
Word setting: Paragraph → Line and Page Breaks → Widow/Orphan control = ON (this is the Word default but must be confirmed in reference.docx).
doc.styles['Normal'].paragraph_format.widow_control = True
| Style | Page break before | Keep with next | Keep lines together | Widow/orphan | |---|---|---|---|---| | Heading 1 | ON | ON | — | — | | Heading 2 | OFF | ON | ON | — | | Heading 3 | OFF | ON | ON | — | | Heading 4 | OFF | ON | ON | — | | Normal | OFF | OFF | ON | ON | | Body Text | OFF | OFF | ON | ON | | Caption | OFF | OFF | OFF | OFF |
Read references/typography-layout.md for full font stacks and spacing tables. The standard corporate stack:
| Element | Font | Size | Colour | |---|---|---|---| | Title | Calibri Light | 28pt Bold | #1F3864 | | Heading 1 | Calibri Light | 16pt Bold | #1F3864 | | Heading 2 | Calibri Light | 13pt Bold | #2E5D8A | | Heading 3 | Calibri | 11pt Bold | #4472C4 | | Body / Normal | Calibri | 11pt Regular | #262626 | | Code | Consolas | 9.5pt Regular | #1A1A1A | | Caption | Calibri | 9pt Regular | #595959 | | Header/Footer | Calibri | 9pt Regular | #595959 |
Heading 1 visual anchor: 4.5pt navy left border bar — applied via style paragraph border, not manual formatting.
Never press Enter twice to create space. Use style space-after settings.
| Style | Before | After | Line | |---|---|---|---| | Heading 1 | 20pt | 6pt | Single | | Heading 2 | 14pt | 4pt | Single | | Heading 3 | 10pt | 3pt | Single | | Normal | 0pt | 6pt | 1.15× |
---
title: "Project Name — Document Title"
subtitle: "Document Type — Category"
date: "YYYY-MM-DD"
version: "1.0"
status: "Draft | Review | Final"
---
Followed immediately by an ownership table:
| | |
|---|---|
| **Project** | Project Name |
| **Owner** | Organisation Name |
| **Author** | Author Name |
| **Version** | 1.0 Draft |
| **Date** | 2026-04-05 |
| **Classification** | Confidential — Internal Use Only |
Cover page has no header/footer (set different_first_page_header_footer = True).
Required for all documents longer than 5 pages. Generated automatically from Heading 1/2/3 styles.
Three-part structure at every level:
Header: Document title (field) right-aligned, thin grey rule below.
Footer: "Page X of Y" centred, confidentiality notice left, print date right.
Tables must look designed, not dumped. Read references/word-features.md → Tables section.
| Column A | Column B | Column C |
|---|---|---|
| Data | Data | Data |
Standard table spec:
Read references/written-communication.md for full guidance. Core rules:
Structure: Inverted pyramid — most important information first, at every level (document, section, paragraph, sentence).
Sentences: 15–20 words average. One idea per sentence. Active voice.
Never use:
Always include:
A professional cover page contains:
Apply when document status requires it:
Insert: Design → Page Background → Watermark → Custom Watermark.
These patterns degrade Word output — do not use them:
| Bad pattern | Why | Fix |
|---|---|---|
| * for bullet lists | Inconsistent in some Pandoc builds | Use - only |
| Setext headings (--- underline) | Ambiguous, not parsed correctly | Use # ATX only |
| Code blocks inside table cells | Breaks table rendering | Move code outside tables |
| Raw HTML tags | Does not render in .docx | Use Markdown equivalents |
| **bold** + *italic* combined | Inconsistent output | Use one or the other |
| Blank lines instead of spacing | Creates erratic spacing | Let styles handle space |
Before every delivery, run references/quality-checklist.md in full. The minimum final actions:
Ctrl+A → F9 — update all fields (TOC, page numbers, dates)ProjectName_DocumentType_v1.0_YYYY-MM-DD.docxTo change global document styling, edit scripts/create-reference-docx.py:
| What to change | Location in script |
|---|---|
| Heading colours | NAVY, STEEL, ACCENT constants |
| Body/heading font | FONT_BODY, FONT_HEADING constants |
| Code font | FONT_CODE constant |
| Heading 1 border weight | sz attribute in pBdr block |
| Footer content | footer section |
| Page size and margins | section.left_margin etc. |
Rebuild after changes:
python scripts/create-reference-docx.py
bash scripts/build-doc.sh <doc-dir> <output-name>
data-ai
Use when adding AI-powered analytics to a SaaS platform — semantic search over business data, natural language queries, trend detection, anomaly alerts, and AI-generated insights for dashboards. Covers embeddings, NL2SQL, and per-tenant analytics...
data-ai
Design AI-powered analytics dashboards — what metrics to show, how to display AI predictions and confidence, drill-down patterns, KPI cards, trend visualisation, AI Insights panels, export design, and role-based dashboard variants. Invoke when...
development
Use when designing, building, reviewing, or upgrading production software systems that must be secure, performant, maintainable, scalable, and user-centered. Apply before writing specs, code, architecture, APIs, databases, mobile apps, SaaS platforms, or ERP systems.
development
Professional web app UI using commercial templates (Tabler/Bootstrap 5) with strong frontend design direction when needed. Use for CRUD interfaces, dashboards, admin panels with SweetAlert2, DataTables, Flatpickr. Clone seeder-page.php, use...