Installs into .claude/skills of the current project.
Are you the author of Sandbox Docx?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/nodetool-ai-sandbox-docx)
---
name: sandbox-docx
description: Build a Word document in a Code node or CodeAct action, with docx running on the host
---
# Word documents in the sandbox
Specifier: `@nodetool-ai/sandbox-docx`. Import it at the top of the body.
`docx` builds a document out of class instances (`Paragraph`, `TextRun`,
`Table`, …) that cannot cross the guest boundary as plain data. This pack is a
**host module**: you describe the document as a JSON element list and the host
builds the real `.docx` bytes.
## build — element list to `.docx` bytes
```js
import { build } from "@nodetool-ai/sandbox-docx";
const bytes = await build({
properties: { title: "Q3 Report", author: "NodeTool" },
elements: [
{ type: "heading", text: "Q3 Report", level: 1 },
{ type: "paragraph", text: "Revenue grew 12% quarter over quarter.", bold: true },
{ type: "table", rows: [["Month", "Revenue"], ["Jul", "120k"], ["Aug", "134k"]] },
{ type: "pageBreak" },
{ type: "paragraph", text: "See appendix for methodology.", alignment: "CENTER" }
]
});
await workspace.writeBytes("report.docx", bytes);
```
Element types:
- `heading` — `text`, `level` (1–6, default 1)
- `paragraph` — `text`, `alignment` (`LEFT`/`CENTER`/`RIGHT`/`JUSTIFY`, default
`LEFT`), `bold`, `italic`, `fontSize` (points, default 12)
- `table` — `rows`, a 2D array; every cell is stringified
- `image` — `data` (a `Uint8Array`), `width`/`height` in inches
- `pageBreak` — no fields
`properties.title`/`author`/`subject`/`keywords` set the document's metadata.
## Gotchas
- **`build` is async** and returns a `Uint8Array`.
- **Writing only.** To read an existing `.docx`, use
`@nodetool-ai/sandbox-mammoth` instead — these are two different libraries on
two different sides of the format.
- **Images are inches, not pixels.** `width`/`height` follow docx's own
convention; omit them and the image renders at a fixed placeholder size.
- **10 MB per image.** The shared host-module input cap applies to each
`data` field.