Architecture
awesome-md-to-pdf is a small, synchronous pipeline per file: read Markdown, parse design tokens, render HTML, drive Chromium, write PDF. The only concurrency is the optional per-file worker pool.
Table of contents
Module map
flowchart LR
cli[cli.ts] --> repl[repl.ts]
cli --> converter[converter.ts]
converter --> markdown[markdown.ts]
converter --> design[design.ts]
converter --> template[template.ts]
converter --> pdf[pdf.ts]
template --> mermaidRt[mermaid-runtime.ts]
converter --> progress[progress.ts]
cli --> banner[banner.ts]
cli --> prompt[prompt.ts]
converter --> logger[logger.ts]
Modules at a glance
| Module | Responsibility |
|---|---|
cli.ts |
Commander setup, flag parsing, routing to REPL or one-shot. |
converter.ts |
Glob inputs, worker pool, per-file orchestration. |
markdown.ts |
markdown-it instance + every plugin (anchor, attrs, container, emoji, footnote, task-lists, toc, katex). |
design.ts |
DESIGN.md parser. Synonyms + regex, dark-mode synthesis. |
template.ts |
HTML shell, embeds CSS, injects the :root { --brand: ...; } overrides per design. |
pdf.ts |
Puppeteer lifecycle – launch, new page, setContent, page.pdf(...), close. |
mermaid-runtime.ts |
Client-side mermaid init that picks up the design’s palette. |
repl.ts |
Interactive chat loop, slash commands, ghost hints, dropdown. |
progress.ts |
cli-progress wrapper (per-file bar with stage text). |
banner.ts |
The 3D gradient welcome banner. |
prompt.ts |
prompts-based light/dark picker. |
logger.ts |
ora + chalk helpers. |
tty-colors.ts |
True-color / 256-color / no-color detection. |
themes/ |
CSS – tokens, base, print, highlight (light + dark). |
designs/claude.md |
Bundled default design. |
Per-file pipeline
sequenceDiagram
participant Conv as converter.ts
participant MD as markdown.ts
participant DS as design.ts
participant Tpl as template.ts
participant PDF as pdf.ts
Conv->>MD: parse(source)
MD-->>Conv: html + toc + meta
Conv->>DS: tokens(design?)
DS-->>Conv: palette + fonts
Conv->>Tpl: render(html, tokens, mode)
Tpl-->>Conv: full document (HTML + CSS)
Conv->>PDF: toPdf(doc)
PDF-->>Conv: Buffer
Conv-->>Conv: write to outputDir
Build output
src/**/*.tscompiles todist/**/*.jsviatscwith source maps off.scripts/copy-assets.jscopiessrc/themes/*.cssandsrc/designs/*.mdintodist/so the published package is self-contained.bin/awesome-md-to-pdf.jsis a thin CJS shim thatrequiresdist/cli.js.bin/md-to-pdf.jsis the legacy alias shim, identical behavior.
Build & publish flow
flowchart LR
src[src/*.ts] -->|tsc| dist[dist/*.js]
themes[src/themes/*.css] -->|copy-assets| dist
designs[src/designs/*.md] -->|copy-assets| dist
dist --> pkg[package.json files allowlist]
pkg -->|npm publish --provenance| npm["npm registry<br/>(+ attestation)"]