
Docx
Programmatically create and format Word .docx files in Node or the browser with the docx JS library without corrupting structure.
Overview
Docx is an agent skill most often used in Build (also Validate and Grow) that generates formatted .docx files with the JavaScript docx library in Node or the browser.
Install
npx skills add https://github.com/appautomaton/document-skills --skill docxWhat is this skill?
- Full docx JS API tour: Document, Packer, paragraphs, tables, headers, footers, TOC, footnotes, and images
- Critical formatting rule: never use \n in TextRun—use separate Paragraph elements to avoid corrupt files
- Node Packer.toBuffer and browser Packer.toBlob save paths documented
- Requires npm install in the skill directory before first run
- Covers alignment, spacing, hyperlinks, page breaks, and table styling primitives
- Documented rule: never use \n inside TextRun—use separate Paragraph elements
Adoption & trust: 1.1k installs on skills.sh; 107 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need a real Word document from your agent but ad-hoc scripts keep producing corrupted files or broken line breaks.
Who is it for?
Indie builders automating proposals, SOWs, spec exports, or printable docs from Node/TS agent workflows.
Skip if: Teams that only need markdown or PDF pipelines with no Word requirement, or environments that cannot run npm install.
When should I use this skill?
Creating or formatting .docx files with JavaScript/TypeScript, fixing corrupted Word output, or automating document deliverables.
What do I get? / Deliverables
You get valid .docx output using Document and Packer patterns with paragraph-safe formatting rules your pipeline can repeat.
- .docx files from Packer.toBuffer or Packer.toBlob
- Structured paragraphs, tables, and optional TOC/footnotes
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Primary shelf is Build docs because the skill teaches generating formal document deliverables alongside product work. Docs subphase covers proposals, specs, and exports that ship as Office files rather than markdown-only repos.
Where it fits
Export a scoped statement of work as .docx for a client signature before build starts.
Generate a technical spec with TOC, footnotes, and page breaks from repo notes.
Batch downloadable reports for email campaigns that must open in Microsoft Word.
How it compares
Library-backed .docx generator skill, not a WYSIWYG template marketplace or Google Docs API integration.
Common Questions / FAQ
Who is docx for?
Solo developers and operators who must ship Word-compatible documents from automated or agent-driven JavaScript TypeScript jobs.
When should I use docx?
Use it in Build docs when exporting specs; in Validate when generating proposal or scope Word files; and in Grow content when batching formatted downloadable reports.
Is docx safe to install?
Review the Security Audits panel on this Prism page; the skill expects local npm install and filesystem writes when saving buffers, so scope those permissions in your agent setup.
SKILL.md
READMESKILL.md - Docx
# DOCX Library Tutorial Generate .docx files with JavaScript/TypeScript. **Important: Read this entire document before starting.** Critical formatting rules and common pitfalls are covered throughout - skipping sections may result in corrupted files or rendering issues. ## Setup Run `npm install` in the docx skill directory to install `node_modules/`. ```javascript const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, ImageRun, Media, Header, Footer, AlignmentType, PageOrientation, LevelFormat, ExternalHyperlink, InternalHyperlink, TableOfContents, HeadingLevel, BorderStyle, WidthType, TabStopType, TabStopPosition, UnderlineType, ShadingType, VerticalAlign, SymbolRun, PageNumber, FootnoteReferenceRun, Footnote, PageBreak } = require('docx'); // Create & Save const doc = new Document({ sections: [{ children: [/* content */] }] }); Packer.toBuffer(doc).then(buffer => fs.writeFileSync("doc.docx", buffer)); // Node.js Packer.toBlob(doc).then(blob => { /* download logic */ }); // Browser ``` ## Text & Formatting ```javascript // IMPORTANT: Never use \n for line breaks - always use separate Paragraph elements // ❌ WRONG: new TextRun("Line 1\nLine 2") // ✅ CORRECT: new Paragraph({ children: [new TextRun("Line 1")] }), new Paragraph({ children: [new TextRun("Line 2")] }) // Basic text with all formatting options new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 200, after: 200 }, indent: { left: 720, right: 720 }, children: [ new TextRun({ text: "Bold", bold: true }), new TextRun({ text: "Italic", italics: true }), new TextRun({ text: "Underlined", underline: { type: UnderlineType.DOUBLE, color: "FF0000" } }), new TextRun({ text: "Colored", color: "FF0000", size: 28, font: "Arial" }), // Arial default new TextRun({ text: "Highlighted", highlight: "yellow" }), new TextRun({ text: "Strikethrough", strike: true }), new TextRun({ text: "x2", superScript: true }), new TextRun({ text: "H2O", subScript: true }), new TextRun({ text: "SMALL CAPS", smallCaps: true }), new SymbolRun({ char: "2022", font: "Symbol" }), // Bullet • new SymbolRun({ char: "00A9", font: "Arial" }) // Copyright © - Arial for symbols ] }) ``` ## Styles & Professional Formatting ```javascript const doc = new Document({ styles: { default: { document: { run: { font: "Arial", size: 24 } } }, // 12pt default paragraphStyles: [ // Document title style - override built-in Title style { id: "Title", name: "Title", basedOn: "Normal", run: { size: 56, bold: true, color: "000000", font: "Arial" }, paragraph: { spacing: { before: 240, after: 120 }, alignment: AlignmentType.CENTER } }, // IMPORTANT: Override built-in heading styles by using their exact IDs { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true, run: { size: 32, bold: true, color: "000000", font: "Arial" }, // 16pt paragraph: { spacing: { before: 240, after: 240 }, outlineLevel: 0 } }, // Required for TOC { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true, run: { size: 28, bold: true, color: "000000", font: "Arial" }, // 14pt paragraph: { spacing: { before: 180, after: 180 }, outlineLevel: 1 } }, // Custom styles use your own IDs { id: "myStyle", name: "My Style", basedOn: "Normal", run: { size: 28, bold: true, color: "000000" }, paragraph: { spacing: { after: 120 }, alignment: AlignmentType.CENTER } } ], characterStyles: [{ id: "myCharStyle", name: "My Char Style", run: { color: "FF0000", bold: true, underline: { type: UnderlineType.SINGLE } } }] }, sections: [{ properties: { page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } }, children: [ new Paragraph({ heading: HeadingLevel.TITLE, children: [new TextRun("Document Title")] }), // Uses overr