17.02.2026
This article documents a fully automated publishing system that turns a single Markdown source into a responsive website and a professionally styled PDF, hosted on a custom domain with integrity verification.
The system follows one core rule: Markdown is the single source of truth. Everything else is generated. This means version control works naturally, diffs are readable, and there is zero risk of format drift between outputs.
Every article lives in its own repository under the
articles-lpmwfx GitHub organization. Each repository
produces three outputs from one source:
All three formats link to each other and to a SHA256 checksum file for integrity verification.
Each article passes through these stages:
| Component | Tool | Role |
|---|---|---|
| Source format | Markdown + YAML | Single source of truth |
| PDF engine | pandoc + xelatex | Typeset output with Lato font |
| HTML engine | pandoc + Mermaid JS | Responsive web with client-side diagrams |
| Diagrams | Mermaid (.mmd) + drawsvg | Flowcharts and programmatic SVG |
| Translation | Mistral Small API | Danish to English, proofreading |
| Formatting | Claude | Structure, consistency, front matter |
| Hosting | GitHub Pages | Static site per article |
| Domain | Njal.la DNS | CNAME per article subdomain |
| Language check | language-check.py | AI detection shield (burstiness, vocabulary, AI phrases) |
| Integrity | SHA256SUMS | Checksum for every output format |
| Feedback | GitHub Issues | Public, traceable, email-notified |
European characters render correctly across all formats:
<article>/
├── article/
│ └── <name>.md ← source of truth
├── assets/
│ ├── pipeline.mmd ← Mermaid source
│ ├── pipeline.png ← pre-rendered for PDF
│ └── badge.svg ← drawsvg output
├── docs/
│ ├── index.html ← generated HTML
│ ├── style.css ← responsive CSS with dark mode
│ ├── CNAME ← custom domain
│ └── SHA256SUMS ← checksums
├── README.md
└── SHA256SUMS
The entire system runs from the command line with four scripts:
python3 app/mistral-proofread.py article/<name>.md
python3 app/language-check.py article/<name>.md
python3 app/build-html.py <article-dir>
python3 app/build-pdf.py <article-dir>
python3 app/build-checksums.py <article-dir>No CMS, no database, no build server. Just Markdown, Git, and automation.
Also available as: HTML (.com) | HTML (.eu) | PDF | GitHub | Codeberg | SHA256 | Feedback