Wes Ellis./ a personal notebook
Technology. Stories. Side projects.
A few things worth writing down.
← Back to Design & Identity

Design & Identity

The Vignelli Document Engine: Every PDF I Make, in One House Style

Three printed reference pages in a strict black-and-white serif layout, fanned out on a beige background.

Part 8 of the thread The design notebook

PROJECT AT A GLANCEPersonal tool, shared as-is
What it is
Python library
My role
Creator
Year
2026
Built with
  • Python
  • python-docx
  • matplotlib
THE SHORT VERSION4 points
  • One Python class, DocBuilder, turns plain data into a finished Word document in a strict Vignelli-style house look.
  • Serif type, a hard grid, thick and thin rules, black-and-white charts and not one drop of color. It prints perfectly on a cheap laser.
  • Recipes, reference sheets, catalogs and checklists all come out looking like they belong to the same set.
  • The engine and a working example are a free download.

I print a lot of reference sheets. Kitchen conversions for the fridge, a catalog of things to 3D print, recipe cards, checklists. For years every one looked different, because every one started as a blank Word document and whatever mood I was in.

So I wrote the house style down, in code. The rules come from Massimo Vignelli, whose design rules I've written about before: a grid you don't break, a couple of typefaces used well, rules that mean something, and no decoration that isn't doing a job. The result is a small Python library, and every document I've made since goes through it.

The style proof: every element the engine can draw, on one page

What it does

You describe a document in plain Python, and DocBuilder turns it into a finished .docx:

from vignelli import DocBuilder

d = DocBuilder(title="Kitchen Reference",
               subtitle="Conversions · Ratios · Storage",
               descriptor="The look-it-up kitchen page.",
               footer_descriptor="Kitchen reference")
d.section(1, "Measurement Conversions")
d.table(["Measure", "Equals"],
        [["1 tablespoon", "3 teaspoons = 15 ml"],
         ["1 cup", "16 tbsp = 240 ml"]],
        widths=[3000, 6936])
d.callout("Note", "Pack brown sugar; spoon and level flour.")
d.save("output/Kitchen Reference.docx")

That's the whole interface: sections, paragraphs, tables, callouts, checklists, forms, recipes, figures. You never touch a font size, a margin or a border. The engine owns all of that, which is the point.

Building block What you get
section() A numbered heading under a heavy rule
table() Horizontal-rule tables, no vertical lines, no fills
callout() A note with a thin rule, or a caution with a thick one
checklist(), form(), log_grid() Printable pages you fill in with a pen
recipe() Ingredients, steps and optional nutrition in one block
figure() Any chart or image with a hairline caption
grade_table() Scores marked ▲ ◆ ● ▼ instead of traffic-light colors

The rules it enforces

The measurements are exact values pulled from a set of reference documents I was happy with. The code says, in so many words, not to round them off.

  • Two typefaces. Bodoni MT for display, Georgia for everything else.
  • A strict text width with margins wide enough for a hole punch, because these things end up in binders.
  • A hierarchy of rules. Thick rules open sections and flag cautions. Medium rules sit under table headers. Hairlines separate rows. You can read the structure of a page from its lines alone.
  • Zero color. Grayscale only, so it prints the same on a laser as it looks on screen.

Tip

Grayscale rules force better decisions. When you can't color-code a status, you have to design a shape or a label that means something, and that usually works better anyway.

Charts that match

The companion charts.py draws black-and-white graphics in the same spirit: solid black bars with the values on them, range bars, box-and-arrow flows, a number line with a hatched danger zone, and spider charts. There are no gridlines, no top or right axis lines, and no legend if a label can go on the mark itself.

Page two of the style proof: bars, a food-storage scale, a flow diagram and a graded table

What it makes

Most of what comes out of it is personal: household references, project catalogs, trackers. Two that are safe to show:

A one-page kitchen quick reference: conversions and rice cooker ratios

A 3D print library catalog, grouped by category, with checkboxes

Get it

The engine is a free download: vignelli.py, charts.py, radar.py and a complete example that builds the kitchen reference above. It needs Python with python-docx and matplotlib.

Heads up

It's built around Bodoni MT and Georgia. Without Bodoni installed, Word quietly substitutes another font and the mastheads lose a lot of their character. Install the fonts first, or change the two font constants at the top of vignelli.py.

It's a personal tool, shared as-is, not a polished package. If you like the Obsidian theme that grew out of the same obsession, this is its print-shop cousin.