294 lines
8.4 KiB
Markdown
294 lines
8.4 KiB
Markdown
|
|
# Das Kaleidoskop der Schlummerwelten
|
|||
|
|
|
|||
|
|
A German children's bedtime anthology — 12 independent stories with AI-generated watercolor illustrations — built for [Amazon KDP](https://kdp.amazon.com) (8.5 × 8.5 in, premium color print).
|
|||
|
|
|
|||
|
|
The entire book is written in Markdown and styled with CSS. Running `pnpm book` produces a print-ready PDF.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Project structure
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
kaleidoskop/
|
|||
|
|
├── content/ # One Markdown file per story (+ front matter & finale)
|
|||
|
|
│ ├── 00-front-matter.md
|
|||
|
|
│ ├── 01-der-glaeserne-sternenwald.md
|
|||
|
|
│ ├── ...
|
|||
|
|
│ └── 13-finale-kaleidoskop.md
|
|||
|
|
│
|
|||
|
|
├── images/ # AI-generated illustrations (300 DPI PNG/JPG)
|
|||
|
|
│ ├── cover/
|
|||
|
|
│ │ └── cover.png
|
|||
|
|
│ ├── 01/
|
|||
|
|
│ │ ├── scene-1.png # One image per scene
|
|||
|
|
│ │ ├── scene-2.png
|
|||
|
|
│ │ ├── scene-3.png
|
|||
|
|
│ │ └── scene-4.png
|
|||
|
|
│ └── ... (02/ through 12/)
|
|||
|
|
│
|
|||
|
|
├── templates/
|
|||
|
|
│ ├── book.html # Master Nunjucks template (title page, TOC, stories)
|
|||
|
|
│ └── story-spread.html # Per-story layout (image page + text page per scene)
|
|||
|
|
│
|
|||
|
|
├── styles/
|
|||
|
|
│ ├── print.css # @page rules, bleed, page dimensions
|
|||
|
|
│ ├── layout.css # Page structure, image/text positioning
|
|||
|
|
│ └── typography.css # Fonts, colors, story-specific theming
|
|||
|
|
│
|
|||
|
|
├── scripts/
|
|||
|
|
│ ├── build.js # Markdown → HTML (via Nunjucks + marked)
|
|||
|
|
│ └── pdf.js # HTML → PDF (via Puppeteer)
|
|||
|
|
│
|
|||
|
|
└── output/
|
|||
|
|
├── book.html # Intermediate build artifact (gitignored)
|
|||
|
|
└── kaleidoskop.pdf # Final print-ready PDF
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Prerequisites
|
|||
|
|
|
|||
|
|
- **Node.js** ≥ 18
|
|||
|
|
- **pnpm** — `npm install -g pnpm`
|
|||
|
|
- **Chromium** (ARM64 / WSL2 only — Puppeteer's bundled Chrome is x86-64)
|
|||
|
|
```bash
|
|||
|
|
sudo apt-get install -y chromium
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Setup
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
pnpm install
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Build commands
|
|||
|
|
|
|||
|
|
| Command | What it does |
|
|||
|
|
|---|---|
|
|||
|
|
| `pnpm build` | Converts Markdown → `output/book.html` |
|
|||
|
|
| `pnpm pdf` | Renders `output/book.html` → `output/kaleidoskop.pdf` |
|
|||
|
|
| `pnpm book` | Both steps in sequence |
|
|||
|
|
| `pnpm watch` | Auto-rebuilds HTML on file changes (no PDF) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Writing a story
|
|||
|
|
|
|||
|
|
Each story lives in `content/XX-story-name.md`. The file has two parts:
|
|||
|
|
|
|||
|
|
### 1. Frontmatter (YAML)
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
---
|
|||
|
|
number: 1
|
|||
|
|
title: "Der gläserne Sternenwald"
|
|||
|
|
character: Leo
|
|||
|
|
palette:
|
|||
|
|
primary: "#1a3a6b" # Main accent color (used for headings, borders)
|
|||
|
|
secondary: "#c0c0c0" # Secondary accent (ornaments, dividers)
|
|||
|
|
text: "#1a3a6b" # Body text color
|
|||
|
|
background: "#f0f4ff" # Text page background color
|
|||
|
|
scenes:
|
|||
|
|
- image: images/01/scene-1.png
|
|||
|
|
alt: "Das Glühwürmchen am Fenster"
|
|||
|
|
- image: images/01/scene-2.png
|
|||
|
|
alt: "Der Mondlichtpfad"
|
|||
|
|
- image: images/01/scene-3.png
|
|||
|
|
alt: "Der gläserne Sternenwald"
|
|||
|
|
- image: images/01/scene-4.png
|
|||
|
|
alt: "Das schlafende Kind"
|
|||
|
|
---
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Body text
|
|||
|
|
|
|||
|
|
Four scene paragraphs separated by `---`. They map to the four scenes in order:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
Leo lag in seinem gemütlichen Bett... ← Scene 1 text
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
Leo schlüpfte in seine Hausschuhe... ← Scene 2 text
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
Am Ende des Pfades blieben sie stehen... ← Scene 3 text
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
„Es ist Zeit zum Träumen", raunte die Eule. ← Scene 4 text
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Adding illustrations
|
|||
|
|
|
|||
|
|
Place AI-generated images at the paths listed in the story's frontmatter:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
images/01/scene-1.png
|
|||
|
|
images/01/scene-2.png
|
|||
|
|
images/01/scene-3.png
|
|||
|
|
images/01/scene-4.png
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Before you have images:** The build automatically shows a colored placeholder box (using the story's primary palette color) so you can work on text and layout without waiting for all 48 illustrations.
|
|||
|
|
|
|||
|
|
**Image requirements for KDP:**
|
|||
|
|
- **Resolution:** 300 DPI minimum — upscale AI output with [Upscayl](https://upscayl.org) (free) or Topaz Gigapixel AI
|
|||
|
|
- **Dimensions:** At least 2550 × 2550 px (= 8.5 in × 300 DPI)
|
|||
|
|
- **Format:** PNG or JPG
|
|||
|
|
- **Color space:** RGB (KDP accepts RGB — no CMYK conversion needed)
|
|||
|
|
|
|||
|
|
> See `DOSSIER.md` for the complete AI image prompts for all 48 scenes.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Page layout
|
|||
|
|
|
|||
|
|
Each scene produces two facing pages:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌──────────────┬──────────────┐
|
|||
|
|
│ │ │
|
|||
|
|
│ Full-bleed │ Story text │
|
|||
|
|
│ illustration │ (right pg) │
|
|||
|
|
│ (left pg) │ │
|
|||
|
|
└──────────────┴──────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- 4 scenes × 2 pages = **8 pages per story**
|
|||
|
|
- 12 stories = **96 interior pages**
|
|||
|
|
- Plus title page, copyright, table of contents, and finale = ~**101 pages total**
|
|||
|
|
|
|||
|
|
The story title appears at the top of the first text page. The story-specific color palette is applied via CSS custom properties injected from the frontmatter.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Customizing the design
|
|||
|
|
|
|||
|
|
### Changing fonts
|
|||
|
|
|
|||
|
|
Add a `@font-face` declaration to `styles/typography.css` and update the `font-family` on `body`. Puppeteer will embed the font in the PDF automatically.
|
|||
|
|
|
|||
|
|
```css
|
|||
|
|
@font-face {
|
|||
|
|
font-family: 'MyFont';
|
|||
|
|
src: url('../fonts/MyFont-Regular.woff2') format('woff2');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
body {
|
|||
|
|
font-family: 'MyFont', Georgia, serif;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Changing per-story colors
|
|||
|
|
|
|||
|
|
Edit the `palette` block in the story's frontmatter. Available properties:
|
|||
|
|
|
|||
|
|
| Key | Applied to |
|
|||
|
|
|---|---|
|
|||
|
|
| `primary` | Story title heading, text color, accent borders |
|
|||
|
|
| `secondary` | Ornament `✦`, dividers |
|
|||
|
|
| `text` | Scene body text |
|
|||
|
|
| `background` | Text page background |
|
|||
|
|
|
|||
|
|
### Dark text pages (e.g. story 9)
|
|||
|
|
|
|||
|
|
Story 9 (*Das Ballett der Nachtfalter*) uses a near-black background. Its text page is overridden in `styles/typography.css`:
|
|||
|
|
|
|||
|
|
```css
|
|||
|
|
[data-story="9"].page--text { background: #0a0a2a; }
|
|||
|
|
[data-story="9"] .scene-text { color: #ffffff; }
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Add similar overrides for any story that needs special treatment.
|
|||
|
|
|
|||
|
|
### Page size / bleed
|
|||
|
|
|
|||
|
|
Defined in `styles/print.css`:
|
|||
|
|
|
|||
|
|
```css
|
|||
|
|
@page {
|
|||
|
|
size: 8.75in 8.75in; /* 8.5in trim + 0.125in bleed on each side */
|
|||
|
|
margin: 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.page {
|
|||
|
|
width: 8.75in;
|
|||
|
|
height: 8.75in;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
To change trim size, update both values here and the matching `width`/`height` in `scripts/pdf.js`.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## KDP submission checklist
|
|||
|
|
|
|||
|
|
1. **Run `pnpm book`** to generate `output/kaleidoskop.pdf`
|
|||
|
|
2. **Verify page count** is correct in your PDF viewer
|
|||
|
|
3. **Check fonts are embedded:**
|
|||
|
|
```bash
|
|||
|
|
pdfinfo output/kaleidoskop.pdf | grep -i font
|
|||
|
|
# or: pdffonts output/kaleidoskop.pdf
|
|||
|
|
```
|
|||
|
|
4. **Upload to KDP:**
|
|||
|
|
- Log in → Your Books → Create → Paperback
|
|||
|
|
- Trim size: **8.5 × 8.5 inches**
|
|||
|
|
- Interior: **Premium Color**, 100 gsm
|
|||
|
|
- Bleed: **Yes (with bleed)**
|
|||
|
|
- Upload `output/kaleidoskop.pdf` as the interior file
|
|||
|
|
5. **Use the KDP online previewer** to check layout before ordering a proof
|
|||
|
|
6. **Order a proof copy** before publishing — real print color may differ from screen
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## AI image prompts
|
|||
|
|
|
|||
|
|
All prompts are in [`DOSSIER.md`](./DOSSIER.md) under each story's `KI-Bild-Prompts` section. The global style guide (paste at the start of every prompt):
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
whimsical storybook illustration, dreamy watercolor style, soft cinematic lighting,
|
|||
|
|
magical atmosphere, high resolution, 300 DPI
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Recommended tools: **Midjourney**, **DALL-E 3**, **Ideogram**, or **Adobe Firefly**.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Git & large files
|
|||
|
|
|
|||
|
|
Images are tracked in git as binary files. If the repo grows large (each 300 DPI PNG can be 5–20 MB × 48 scenes), consider enabling [Git LFS](https://git-lfs.com):
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git lfs install
|
|||
|
|
git lfs track "images/**/*.png" "images/**/*.jpg"
|
|||
|
|
git add .gitattributes
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Troubleshooting
|
|||
|
|
|
|||
|
|
**`pnpm pdf` fails with "Syntax error: redirection unexpected"**
|
|||
|
|
Puppeteer's bundled Chrome is x86-64 but your system is ARM64. Install system Chromium:
|
|||
|
|
```bash
|
|||
|
|
sudo apt-get install -y chromium
|
|||
|
|
```
|
|||
|
|
The script auto-detects `/usr/bin/chromium` and uses it instead.
|
|||
|
|
|
|||
|
|
**Images are not showing in the PDF**
|
|||
|
|
Check that the image path in the story's frontmatter matches the actual file location exactly (case-sensitive).
|
|||
|
|
|
|||
|
|
**Text is cut off on a page**
|
|||
|
|
Increase the font size or reduce padding in `styles/typography.css` and `styles/layout.css`. You can also split a long scene text into shorter paragraphs.
|
|||
|
|
|
|||
|
|
**Colors look different in print vs. screen**
|
|||
|
|
KDP calibrates for print. Order a proof copy to see the real result before publishing. Dark tones (story 8 — bronze/chocolate) benefit from premium color paper (100 gsm).
|