All use cases
Documents

Generate Excel, Word and PowerPoint files from your app

Real xlsx/docx/pptx, written headlessly — no Office, no headless browser.

The problem

Someone needs the report as a real file: a spreadsheet their finance team can open, a document their lawyer can track changes in, a deck they can present.

The usual options are all bad. A PDF is not editable. CSV loses everything. A headless browser rendering to PDF adds a fragile binary to your deploy. And most libraries either generate something Office opens with a repair prompt, or require Office itself to be installed on your server.

What you are building

Live surfaces, not screenshots — every one composed from the same components you would install.

Generated documents

The writers are headless — this is what the app has on disk after an agent builds the quarterly pack.

Generated this morning4 files
Board-review.pptx180 KB
Q3-forecast.xlsx47.1 KB
Revenue-by-region.xlsx31.2 KB
Statement-of-work.docx27 KB
.xlsx

holy-sheet

.pptx

dark-slide

.docx

last-word

Each ships a PHP and a Node twin, same API.

The code

Write a real spreadsheetphp
use HolySheet\Workbook;

// A declarative sheet, not a cell-by-cell API -- which is what makes it
// something an AGENT can emit in one shot rather than drive imperatively.
$workbook = Workbook::make()
    ->sheet('Forecast', function ($sheet) use ($rows) {
        $sheet->headers(['Region', 'Q3', 'Q4']);
        $sheet->rows($rows);
        $sheet->format('B:C', ['numberFormat' => '#,##0']);
    });

$workbook->write(storage_path('app/reports/Q3-forecast.xlsx'));
The same call from Nodets
// holy-sheet-js is a PORT, not a binding -- same shapes, same output, no PHP
// in the process. Pick the one that matches the runtime you are already in.
import { Workbook } from "@particle-academy/holy-sheet";

await Workbook.make()
  .sheet("Forecast", (sheet) => {
    sheet.headers(["Region", "Q3", "Q4"]);
    sheet.rows(rows);
  })
  .write("storage/reports/Q3-forecast.xlsx");

How to solve it

  1. Pick the writer for the format

    Three headless writers: xlsx, docx and pptx. No Office dependency and no browser — they write the file format directly.

    Run thisbash
    composer require particle-academy/holy-sheet    # xlsx
    composer require particle-academy/last-word     # docx
    composer require particle-academy/dark-slide    # pptx
  2. Or the same thing on Node

    Each has a matched port. Same contract, same output — pick the one matching the runtime you are in rather than standing up a service in the other language.

    Run thisbash
    npm install @particle-academy/holy-sheet
    npm install @particle-academy/last-word
    npm install @particle-academy/dark-slide
  3. Build the document from data, not markup

    The writers take plain structures, which is what makes them usable by an agent as well as by your code — the input is JSON-shaped rather than a template language.

  4. Round-trip when you need to read one back

    The docx and pptx packages read as well as write, and docx carries markdown bridges in both directions — useful when a model produced markdown and the deliverable is a Word file.