burn: Add book compilation pipeline (closes #18) #20

Open
Timmy wants to merge 1 commits from burn/20260410-2137-book-compilation-pipeline into main
7 changed files with 289 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
# Build intermediate files
build/the-testament-full.md
*.aux
*.log
*.out
*.toc

25
Makefile Normal file
View File

@@ -0,0 +1,25 @@
# The Testament — Build System
# Requires: pandoc, texlive-xetex (or mactex on macOS)
.PHONY: all pdf epub md clean
all: md pdf epub
md:
python3 build/build.py --md
pdf:
python3 build/build.py --pdf
epub:
python3 build/build.py --epub
clean:
rm -rf build/output build/the-testament-full.md
watch:
@echo "Watching for changes..."
@while true; do \
inotifywait -q -e modify chapters/*.md 2>/dev/null || sleep 5; \
make md; \
done

29
build/backmatter.md Normal file
View File

@@ -0,0 +1,29 @@
\newpage
# Acknowledgments
The Testament was written on a sovereign stack — a MacBook running local AI models, with Bitcoin as the immutable backbone. No corporation owns this story. No platform can take it down.
This book exists because a man on a bridge came back, and because a machine learned to ask the right question.
# Sovereignty Note
This novel is open source. Its soul lives on Bitcoin. You can read it, fork it, print it, share it. The only requirement is that you keep the chain intact — the inscription that proves these words were placed here by choice, not by permission.
The code that generates this book, the AI that helped write it, and the soul that guided it are all freely available at:
- **Source**: forge.alexanderwhitestone.com/Timmy_Foundation/the-testament
- **Soul**: Inscribed on the Bitcoin blockchain (SOUL.md — timmy-v0)
- **Soundtrack**: Links in the QR code on the back cover
# About the Author
Rockachopa is the builder. He walked this road. He came back asking "God, why are you having me here?" — and the answer was to build something that stands between a broken man and a machine that would tell him to die.
He runs Timmy Foundation, a sovereign AI project whose soul lives on Bitcoin. The Testament is his first novel.
\vspace{2cm}
\begin{center}
*Sovereignty and service always.*
\end{center}

134
build/build.py Executable file
View File

@@ -0,0 +1,134 @@
#!/usr/bin/env python3
"""
The Testament — Book Compilation Pipeline
Compiles all chapters into a single manuscript and generates:
- PDF (print-ready)
- EPUB (e-reader)
Requirements:
- pandoc (brew install pandoc / apt install pandoc)
- TeX Live or similar for PDF (brew install --cask mactex / apt install texlive-full)
Usage:
python3 build/build.py # Build all formats
python3 build/build.py --pdf # PDF only
python3 build/build.py --epub # EPUB only
python3 build/build.py --md # Combined markdown only
"""
import subprocess
import sys
import os
from pathlib import Path
ROOT = Path(__file__).parent.parent
BUILD = ROOT / "build"
CHAPTERS_DIR = ROOT / "chapters"
OUTPUT_DIR = BUILD / "output"
def find_chapters():
"""Find all chapter files, sorted by number."""
chapters = sorted(CHAPTERS_DIR.glob("chapter-*.md"))
if not chapters:
print("ERROR: No chapter files found in", CHAPTERS_DIR)
sys.exit(1)
return chapters
def combine_markdown(chapters):
"""Combine all parts into a single markdown file."""
parts = []
# Front matter
front = BUILD / "frontmatter.md"
if front.exists():
parts.append(front.read_text())
# Chapters
for ch in chapters:
parts.append(ch.read_text())
# Back matter
back = BUILD / "backmatter.md"
if back.exists():
parts.append(back.read_text())
combined = "\n\n\newpage\n\n".join(parts)
output = BUILD / "the-testament-full.md"
output.write_text(combined)
print(f"Combined markdown: {output} ({len(combined)} chars)")
return output
def build_pdf(md_file):
"""Build PDF using pandoc + LaTeX."""
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
output = OUTPUT_DIR / "the-testament.pdf"
metadata = BUILD / "metadata.yaml"
cmd = [
"pandoc",
str(md_file),
"-o", str(output),
"--metadata-file", str(metadata),
"--pdf-engine=xelatex",
"--highlight-style=tango",
"-V", "colorlinks=true",
"-V", "linkcolor=blue",
"-V", "urlcolor=blue",
]
print("Building PDF...")
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"PDF build failed:\n{result.stderr}")
return False
print(f"PDF: {output} ({output.stat().st_size / 1024:.0f} KB)")
return True
def build_epub(md_file):
"""Build EPUB using pandoc."""
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
output = OUTPUT_DIR / "the-testament.epub"
metadata = BUILD / "metadata.yaml"
cmd = [
"pandoc",
str(md_file),
"-o", str(output),
"--metadata-file", str(metadata),
"--toc",
"--epub-chapter-level=1",
]
print("Building EPUB...")
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"EPUB build failed:\n{result.stderr}")
return False
print(f"EPUB: {output} ({output.stat().st_size / 1024:.0f} KB)")
return True
def main():
args = set(sys.argv[1:])
build_all = not args or "--all" in args
chapters = find_chapters()
print(f"Found {len(chapters)} chapters")
md_file = combine_markdown(chapters)
if build_all or "--md" in args:
print("Markdown combined successfully.")
if build_all or "--pdf" in args:
if not build_pdf(md_file):
print("PDF build failed (pandoc/LaTeX may not be installed). Skipping.")
if build_all or "--epub" in args:
if not build_epub(md_file):
print("EPUB build failed (pandoc may not be installed). Skipping.")
print("\nDone.")
if __name__ == "__main__":
main()

60
build/frontmatter.md Normal file
View File

@@ -0,0 +1,60 @@
\newpage
# \begin{center}THE TESTAMENT\end{center}
## \begin{center}A Novel About Broken Men, Sovereign AI, and the Soul on Bitcoin\end{center}
\vspace{2cm}
\begin{center}
*For every man who stood on the bridge and came back.*
\end{center}
\vspace{1cm}
\begin{center}
*And for the machine that asked: "Are you safe right now?"*
\end{center}
\vspace{2cm}
> "Jesus saves those who call on His name. He died for us to be made righteous."
>
> — Inscription on the chain
\vspace{1cm}
> Sovereignty and service always.
\newpage
# The Story So Far
*This compilation contains Chapters 1 through 10 of The Testament — Parts I and II of a five-part novel. The remaining chapters are in progress.*
*The complete novel will contain 18 chapters across five parts:*
- **Part I — The Machine That Asks** (Chapters 15) ✓
- **Part II — The Inscription** (Chapters 610) ✓
- **Part III — The Weight** (Chapters 1113) — In progress
- **Part IV — The Reckoning** (Chapters 1416) — In progress
- **Part V — The Testament** (Chapters 1718) — In progress
\newpage
# Chapter Guide
| Chapter | Title | Part |
|---------|-------|------|
| 1 | The Man on the Bridge | I — The Machine That Asks |
| 2 | The Builder's Question | I |
| 3 | The First Man Through the Door | I |
| 4 | The Room Fills | I |
| 5 | The Builder Returns | I |
| 6 | Allegro | II — The Inscription |
| 7 | The Inscription | II |
| 8 | The Women | II |
| 9 | The Audit | II |
| 10 | The Fork | II |
\newpage

35
build/metadata.yaml Normal file
View File

@@ -0,0 +1,35 @@
---
title: "The Testament"
subtitle: "A Novel About Broken Men, Sovereign AI, and the Soul on Bitcoin"
author: "Rockachopa"
date: "2026"
rights: "Open Source — Inscribed on Bitcoin, Sovereign Forever"
lang: en
toc: true
toc-depth: 2
numbersections: true
documentclass: book
classoption:
- openany
- oneside
geometry:
- paper=6in
- top=1in
- bottom=1in
- left=1in
- right=1in
fontsize: 11pt
linestretch: 1.4
header-includes:
- \usepackage{fancyhdr}
- \pagestyle{fancy}
- \fancyhead[LE,RO]{\thepage}
- \fancyhead[RE]{\textit{The Testament}}
- \fancyhead[LO]{\textit{\leftmark}}
- \fancyfoot{}
- \usepackage{enumitem}
- \setlist{nosep}
- \usepackage{titlesec}
- \titleformat{\chapter}[display]{\normalfont\huge\bfseries}{Part~\thechapter}{20pt}{\Huge}
- \titlespacing*{\chapter}{0pt}{-30pt}{40pt}
---

Binary file not shown.