Feature · Four file formats

Documents agents can write and read

Spreadsheets, decks and Word documents from plain JSON, in PHP, Node and Python, plus PDF in PHP. Every file can be read back into the same model.

PHPPythonNode / TypeScript
  • .xlsxHoly Sheet
  • .pptxDark Slide
  • .docxLast Word
  • .pdfFinePrint
Generate a file in your browserLive demo
Agent JSON@particle-academy/last-word
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
What the Agent saysvalid
Agent.describe()
Doc: Community garden: spring plan
Blocks: 6
Kinds: 2 heading, 1 paragraph, 1 list, 1 table, 1 quote
Words: 54

The markdown bridge

fromMarkdown / toMarkdown

Last Word turns markdown into its document model and back. Convert this into the Word JSON above, or pull the current Word JSON out as markdown.

1
2
3
4
5
6
7
8
9
10
11

Edit the JSON on the left: validate, describe and lint run as you type. Download writes the file with the npm package in this page, then reads it back with that package's reader.

What it does

Four product families, one way of working: an agent emits JSON, the package checks it, writes the file and reads files back.

One Agent, plain JSON in

Each format is a JSON document an agent can emit, and each package exposes a static Agent: validate and validateAndRepair, a schema to register as a tool, guide() for what a professional file looks like, and toBytes. Last Word and Dark Slide describe() a document as text; Holy Sheet's describe() reads a file back into its schema instead, and FinePrint has no describe. Sheets, decks and PDFs add lint().

PHP, Node and Python mirrors

Holy Sheet, Dark Slide and Last Word each ship for PHP, Node / TypeScript and Python, on the same schema. The Node writers are universal, which is why the demo above runs in your browser. FinePrint is PHP.

Readers as well as writers

Files come back into the same model: Last Word reads .docx, legacy .doc, .odt and .rtf; Dark Slide reads .pptx, deterministically; Holy Sheet reads .xlsx and .ods; FinePrint reads PDF text in reading order.

Markdown bridges

Last Word converts between its document model and GitHub-flavoured markdown in both directions: headings, emphasis, links, nested lists, tables, code and quotes. It is lossy only where markdown has no syntax, such as underline, colour and page breaks.

Untrusted archives, read safely

The PHP and Node releases of 26 October 2026 bound every archive read before allocating: zip bombs, unsafe or duplicate member names, CRC and size mismatches and truncated files are refused with a typed ArchiveRefused, without echoing document content.

PDFs with a prompt-injection guard

FinePrint parses PDFs in pure PHP, reports active content such as scripts and launch actions without running it, and passes extracted text through a guard that can flag, redact or discard. It writes PDFs from Last Word's JSON model.

How it fits

Pick the package for the runtime you are in; the schema is the same in each. Holy Sheet, Dark Slide and Last Word each have a PHP, Node and Python mirror, and FinePrint is PHP.

Install a Node writer

Holy Sheet, Dark Slide and Last Word for Node. The demo above runs the last two; the PHP and Python mirrors are listed below.

  1. @particle-academy/holy-sheetNode / TypeScript
    npm install @particle-academy/holy-sheet
  2. @particle-academy/dark-slideNode / TypeScript
    npm install @particle-academy/dark-slide
  3. @particle-academy/last-wordNode / TypeScript
    npm install @particle-academy/last-word

The packages

particle-academy/holy-sheetPHP

PHP 8.4+ xlsx writer for agentic document creation. Headless — top-level Agent write/describe/lint API, optional Laravel adapter.

fancy-holy-sheetPython

Python port of holy-sheet -- xlsx writer/reader for agentic documents. Headless; no UI.

@particle-academy/holy-sheetNode / TypeScript

Node/TS port of holy-sheet — xlsx writer/reader + formula linter, isomorphic. Headless Agent API; no UI.

particle-academy/dark-slidePHP

PHP 8.4+ pptx writer/reader for agentic deck creation — markdown headings, highlighted code, tables, gradients, high-fidelity reader. Sister to holy-sheet.

fancy-dark-slidePython

Python port of dark-slide -- pptx writer/reader for agentic documents. Headless; no UI.

@particle-academy/dark-slideNode / TypeScript

Node/TS port of dark-slide — pptx writer/reader for agentic decks, isomorphic (browser or Node). Headless Agent API; no UI.

particle-academy/last-wordPHP

PHP 8.4+ docx writer/reader for agentic word-processing documents — a JSON Doc model (headings / styled runs / nested lists / tables / code / quotes / images), markdown bridges both ways, and Agent read/write/describe. Sister to holy-sheet (xlsx) and dark-slide (pptx).

fancy-last-wordPython

Python port of last-word -- docx writer/reader for agentic documents, with markdown bridges. Headless; no UI.

@particle-academy/last-wordNode / TypeScript

Node/TS mirror of particle-academy/last-word — zero-dependency, isomorphic docx writer/reader with the same JSON Doc model + markdown bridges, so react-fancy Editor consumers round-trip Word files without a mammoth/turndown/docx converter sandwich. Headless; no UI.

particle-academy/fine-printPHP

Pure-PHP PDF reader, writer and page renderer for agents, with guarded reads, active-content reporting and bounded input handling. Optional Laravel routes serve private watermarked PNG pages behind the app's own authorisation.

Hand your agent a file format

Start with the format you need. Each package page has the install command for every language and the full schema.