Running make locally is one thing. Guaranteeing that every contributor’s push or YAML edit on GitHub produces the same press-ready artifact on a clean machine with a pinned toolchain is another. How two print projects implement that guarantee with GitHub Actions.
The prepare_images.py walkthrough: converting every source image to CMYK using the FOGRA39 ICC profile via Pillow and LittleCMS, with black-point compensation. Resolution is checked at placed size: never faked, never upscaled.
events.yaml holds no labels. traduction.yaml holds no facts. The generator resolves them at build time with --lang fr, --lang en, or --lang es. What enforcing this constraint looks like in practice, and why the discipline is worth the friction it creates.
Claude’s LaTeX output frequently didn’t compile. The fix wasn’t to prompt better — it was to close the feedback loop. What looked like a reliability problem turned out to be a latency problem.
One hard stop, five soft failures, a renamed file, and a report alongside it. The design philosophy behind a preflight that never aborts — plus the pikepdf/PyMuPDF six-check implementation and the --strict flag for CI.
A 370-cell calendar that shifts every year. A lead’s name in three places. An IBAN in an invisible text box. These are not unusual InDesign problems — they are what InDesign files become when they accumulate facts with no single home. Two projects show what the alternative looks like — and where InDesign’s own global tools stop short.
How we transformed unstructured Word 97/2000 files into a decade-long web publication of conferences-using Markdown, Python, and GPT-powered automation for just $30.