Works·launched

Assembly

Turning documents into one report

A web app that assembles formal client reports.

Building a report in Assembly: documents dropped into appendix slots A to E, with conversion and page-number status, the report summary and the page order
Building a report. Documents go into appendix slots; Word files convert, and old page numbers can be cleaned after a preview.
The generated report in Assembly: page thumbnails with appendix dividers, a divider page showing Page 48 of 81 in the footer, and download options
The finished report. One footer, "Page X of Y", runs unbroken across the cover and every appendix.

The problem

The team at a consulting firm assembled every formal client report by hand: a cover page, then appendix dividers, then the documents for each appendix, merged into one PDF. The same nine report structures, over and over, with different content each time.

Done by hand, it was slow and easy to get wrong: pages out of order, numbering that restarted halfway through, an appendix missing. Every project deliverable paid that cost again.

What I built

A web app that turns report assembly into a short flow:

Configure type → Create report → Upload documents → Generate → Download

Each report type is set up once with its cover pages. After that, someone creates a report, drops PDFs or Word documents into the appendix slots, reorders them if needed, and generates one finished PDF with continuous page numbering throughout.

How it works

Three services: a Next.js front end, a FastAPI back end, and Gotenberg, a document-conversion service that runs LibreOffice behind a clean HTTP API. The work happens in three flows, at three different times:

Assembly architecture. A user uploads documents through the web app to the API. Word files are converted to PDF by Gotenberg, old footers can be cleaned, cover pages are added, and everything is merged and stamped with page numbers into a PDF or ZIP returned straight to the user and never stored. Metadata lives in SQLite; the original uploads live on a file volume, where the pipeline reads them.PEOPLEENTRYSERVICESASYNCDATAUserWeb appAPISQLiteFile volumePDF · ZIP downloadUPLOADRETURNSMETADATAREADS ORIGINALSPIPELINEWord → PDFClean footersAdd coversMerge + stamp

The highlighted path follows a document from upload to the finished report.

A few of the decisions:

What was hard

Page numbering sounds trivial until the source documents already have their own. Stamping "Page 7 of 42" over a document that already says "Page 1" produces a mess, so cleaning exists as its own step, with a preview, for the documents that need it.

What I learned

The most valuable software isn't always the most complex. Assembly does one narrow job for one team, and it removed a task people repeated on every project. Understanding that job precisely was the real work; the build was small.