header image news page

Structuring layouts with the new Section element

Layout files in the speedata Publisher can get long. Really long. A product catalog with conditional page types, fallback logic, index generation, and a dozen different record types easily grows to a few hundred lines of XML. And at that point, scrolling through the file becomes a chore.

I have been wanting a way to organize layout code into logical groups for a while — something like regions or sections that you can collapse and navigate. The problem: any new element in the layout language usually does something. It affects the output, it changes behavior, it needs to be documented and tested and maintained.

So I added an element that does nothing.

from Patrick Gundlach |

I benchmarked 6 PDF engines — the fastest is not the one I’d pick

I’m building a typesetting engine for a living (speedata Publisher). People keep asking me “why not just use Typst?” or “isn’t WeasyPrint good enough?” and I never had a good answer with real numbers. Just gut feeling. So I decided to actually measure it.

I set up a simple benchmark, same document with all six tools. And what I learned was maybe not what I expected.

The setup

The task is simple: a mail merge. You have an XML file with name and address records, you fill in a letter template, and you get a PDF out. One page per letter, with a logo, sender info, recipient address, and some body text. Nothing special, really every tool should be able to do this.

from Patrick Gundlach |

Fixing macOS notarization issues in the speedata Publisher 5.2.0

I have rebuilt the macOS packages of the speedata Publisher and released them as version 5.2.1. The Windows and Linux packages remain at 5.2.0, because the changes are macOS-specific.

This post is a short write-up of what broke, how I debugged it, and which tools I used along the way. If you ever need to get a macOS command line tool notarized, this might save you some time (or at least a bit of frustration).

from Patrick Gundlach |

Version 5.2 released

Big Improvements Under the Hood

We’re happy to announce a new development snapshot of the speedata Publisher! This release comes with major internal improvements, cleaner architecture, and a bunch of small but meaningful user-facing enhancements.


Rewritten XML Parser

The XML parser has been completely reimplemented in Go, with a stronger focus on correctness, performance, and test coverage. It now keeps track of the originating file when using XInclude, which makes debugging and error reporting much easier.

from Patrick Gundlach |

billingcat – invoicing software powered by the speedata Publisher

It has been a while since my last post on this blog. This time I would like to introduce a project that is a bit different in scope but technically closely related to the speedata Publisher: billingcat – an open-source application for invoicing and simple customer relationship management.

from Patrick Gundlach |

High speed PDF generation with boxes and glue

This article is not up to date anymore, I will leave it online. Risor is not supported anymore Lua is now the choice of scripting language. I will post a follow-up soon.

I have been playing with electronic invoices (especially the German and French ZUGFeRD/Factur-X format) for a while now. The speedata Publisher has support for ZUGFeRD since 2017.

The next step is to make (my other PDF generation software) boxes and glue work with electronic invoices. For that, I use the new command line interface for boxes and glue (which I will describe in a future blog post).

There only a few things that need to be done to make this work:

from Patrick Gundlach |

Version 5 Released

Almost five years after releasing version 4.0 of the speedata Publisher, it is time for version 5.0. This is a short announcement, since most changes have been covered before.

The speedata Publisher looks the same since its beginning, but there have been major changes under the hood since version 4:

  • Integration of HarfBuzz for left to right and right to left text layout, even mixed (bidirectional) typesetting. Support for all kinds of fonts and font features.
  • Full accessibility support.
  • A rewritten XML and XPath 2.0 parser.
  • Attachment of ZUGFeRD invoices.
  • Greatly enhance enhance various subsystems such as HTML, MetaPost integration and paragraph builder.
  • SAAS available with the speedata Pro plan.

There have been a few entries here in the blog (4.16, 4.18, 4.20)

from Patrick Gundlach |

speedata Publisher and AI

Don’t worry, the speedata Publisher will not gain any half-baked, annoying artificial intelligence features. This post is about chatting with some of the more famous AI chats (ChatGPT, Google Gemini, DeepSeek). I have tried to find out how good these AI chats know the speedata Publisher and if they can help users to generate a layout.

There is still a long road ahead, but read on. A big warning upfront: None the following outputs work. Do not use them. I post abbreviated transcripts of the chats.

from Patrick Gundlach |

Electronic invoices

The following text is written from a German perspective. This should apply to all parts of the European Union, although with likely differences in other countries.

Since the beginning of 2025, all companies in Germany have had to send and receive electronic invoices (with overriding deadlines and a few exceptions). This affects me too, so I asked myself (out of curiosity), what is an electronic invoice and how can I process it?

from Patrick Gundlach |

Release stable version 4.20

After more than half a year, 150 commits and 40 minor releases, I have now published version 4.20, which is hopefully the last stable version before the “big five”.

from Patrick Gundlach |