Cryptic Build Chain
Since my last post here, I've set my first puzzle. Concurrent with writing the puzzle I also created an author-build-publish infrastructure, within my idiosyncratic computing constraints:
- No Windows or Macintosh computers
- No cloud-based tools, storage, or publishing
- Free
Authoring Tools
Mine has been a Chromebook-only household for at the past least 10 years. I use the released Linux container on an Intel-based Asus Chromebook Plus for my desktop environment, and I have a small Linux server running on a fanless Atom-based PC.
Qxw for Grids
Qxw is a Linux-native application with a nice GUI and helpful grid-filling tools. It exports grid images in PNG or SVG as well as an XML grid description in a file format that might be used by the proprietary Crossword Compiler for Windows tool.
It does not support the entry of clues, however.
XML for Clues
I defined a simple XML format for puzzle clues, and I simply edit this file using VS Code.
<puzzle>
<title>Keep on Trucking</title>
<date>2026-01-22</date>
<across>
<entry>
<index>1</index>
<clue>Cabot was taken aback by the company; it left a bad taste in the mouth.</clue>
<length>7</length>
<answer>TOBACCO</answer>
</entry>
...
I find the process of playing around with clues much easier using pen and paper, so I built a simple XSL transform that generates a triple-spaced list of clues and answers for me to print.
First Build Chain: Static HTML and PDF
I wrote a small XSL transform that generates a non-interactive HTML page and a printable-PDF from the XML file.
As I prefer to solve puzzles on paper, this seemed workable to me.

But after posting my first puzzle to r/crosswords, a kind commenter directed me to Exolve, a remarkably easy-to-use (for both setters and solvers) Javascript-based tool to create interactive crosswords.
Second Build Chain: Interactive HTML
To use XSL to generate a complete Exolve document, I wrote a short script to combine the Qxw-generated XML with my clues XML into a single XML input file. I then created a second XSL transform to generate the Exolve file.
Testing Shortcomings
The goal for any automation is to ... automate. Unfortunately, the export of grid images and XML files from Qxw must be done through the UI. There is a CLI, but it doesn't support those operations, so I need to take care not to make grid updates without re-exporting the grid XML file.
Deployment
Currently, at least until my ISP catches up with me, the puzzles are deployed from the Atom-based server sitting on my desk. I use Cloudflare to handle DDNS chores and Google Analytics and GoAccess to monitor traffic.
Next Up: .PUZ File Export
While the Exolve is great, the most popular tooling for crosswords is based on the .PUZ file format. Across Lite offers a free application to generate .PUZ files, but that's not a solution for me (see idiosyncratic constraint #1, above).
Time permitting, I hope to leverage the code in exet, from the author of Exolve, to add this to my build chain.
Older Posts
Touristfahren
From the archive: A lap around the Nürburgring in 2015.
Two for One
Cryptic crossword of the day.
Edge Case
A programming fail.
Cryptic Crossword 'Solving Aid'
Cryptic crossword of the day.
Targetrage
Market arbitrage for bakers yeast.
Chuck and Michael
Koching out.
Bagelnomics
Making bagels to save money.
Google Domains, We Hardly Knew Ya
Burned by a Google beta, again.
Magic
Optimizing the cell service.
Stolperstein
Historic echoes in a European city.
Saturday
Competitive crosswording.
Illustration
Fooling around with illustrations for a shop project.
User Error
Tracking down a network outage.
Quality of Life
Optimizing VS Code on a Chromebook.
Free hosting (multiple domains, SSL, subdomains)
Taking care of domains
vi
Editing the old-fashioned way
Icy Morning
Nürburgring Nordschleife
Going fast in Deutschland
Top of the World, New England Edition
Hiking Mt. Washington