Web / Desktop · Released
DdDesignReport
A reporting library with a drag-and-drop designer, so clients change their own invoice, payslip or report-card layouts.

Why it matters
What makes it stand out.
Clients edit their own layouts
The designer sits inside your application. A client's admin moves the logo, adds a column or changes the letterhead without a ticket to the developers.
One template, many formats
The same template prints to PDF, HTML, XLSX, XLS, CSV, or straight to 58 and 80 mm thermal receipt printers.
From any backend
A Go library, npm packages, Maven Central for Java and Kotlin, and an HTTP server and Docker image for PHP, Python and .NET.
Indonesian documents included
Receipts with amounts in words (terbilang), F4 paper, Indonesian month names, payslips, delivery notes and school reports come as templates.
The problem
At a software house every client wants a slightly different invoice, payslip or report-card layout, and every small change such as moving a logo becomes a ticket for a developer. Existing reporting tools are usually tied to one language, like JasperReports to Java, or have no designer that can be embedded in a web app and used by people who do not program.
Who it is for
Software houses and development teams building business applications that print documents, and the client admins and staff who need to adjust document layouts without writing code.
Key features
An embeddable drag-and-drop designer
A dependency-free web component (`ddreport-designer` on npm) with a Word-style ribbon, an easy mode for first-time users, hideable buttons and replaceable interface text. Also available as a standalone app.
One render core for every language
A Go core renders JSON templates to PDF, HTML, XLSX, XLS, CSV, ESC/POS and text. The Node.js and Java/Kotlin wrappers run the same binary, and other languages use the HTTP server or Docker image.
Complete report elements
Text, tables, images, charts, QR and Code 128, sub-reports, crosstabs, grouping up to six levels, and expressions such as `sum()`, `if()` and `terbilang()`.
JasperReports export and import
Templates export to `.jrxml` and import back, including charts, lists and crosstabs, so teams already on Jasper can move gradually.
Ready for production
PDF/A-2b, digitally signed PDFs, a row limit, a health check, a render queue, a strict mode for misspelt fields, and one log line per request.
Friendly to AI assistants
llms.txt, a JSON Schema, and an MCP server with tools to read the guide, check a template and render it.
The same approach can be adapted for
- Invoices, receipts and delivery notes in business applications
- Payslips and HR reports whose layout differs per client
- School reports and certificates
- Cashier receipts to USB, Bluetooth or network thermal printers
- Moving away from JasperReports
Architecture
DdDesignReport has three parts:
- The template format. One JSON file described by a JSON Schema: paper size, bands (header, detail, groups, summary, footer), and elements with placeholders such as
{{customer.name}}or{{sum(total)}}. - The render core in Go. One implementation reads a template and data and writes PDF, HTML, XLSX, XLS, CSV, JRXML, ESC/POS or text. The Node.js and Java wrappers run the same binary as a long-lived process, so output is identical in every language.
- The designer in the browser. A dependency-free JavaScript component that edits the same template format. The standalone app serves it together with template storage and a history of the last 20 versions.
With a single core, a new format or a bug fix lands once for every language.
Implementation details
Pages are drawn as soon as they are ready. PDF and HTML are written page by page rather than after the whole report is laid out, which roughly halves peak memory for 100,000 rows.
Receipt printers. The escpos format places text in the character columns its box covers in the design, has the printer draw QR and Code 128, prints pictures as dots, then cuts the paper. The example app prints to network printers on port 9100 and to USB or Bluetooth printers straight from the browser through Web Serial.
Misspelt fields. A placeholder the data lacks prints empty. The designer preview names the field, and DDREPORT_STRICT=1 refuses the render, so typos do not reach a client’s documents.
Real Excel. Bold text, number formats, cell colours, borders and merged cells carry over to XLSX. Charts become native Excel charts with their data, so they can still be edited in Excel.
Server safety. Without a token, the render server only answers localhost and IP addresses, so another site cannot use it through DNS rebinding. With DDREPORT_TOKEN set, it can be reached by a domain name.
What can be verified
- Released as MIT-licensed open source, with packages on npm (`ddreport`, `ddreport-designer`), Maven Central, a Docker image on GHCR, and binaries for Linux, macOS and Windows on GitHub Releases.
- 13 ready-made templates, from invoices to a profit-and-loss statement, all tested in JasperReports 6.21. PDF/A output passes veraPDF validation.
- 100,000 rows print to PDF in about 12 seconds on a 2017 laptop.
- The designer is tested automatically in Chromium, Firefox and WebKit.
Screenshots




