KDP EPUB Troubleshooting: Prevent Garbled Text and Missing Images

Garbled text and missing images may appear in the same KDP preview, but they are not the same defect. Investigate text through source encoding and an approved UTF-8 readback. Investigate images through Markdown references and the assets actually stored in the EPUB. The book becomes a candidate for upload only when both lanes have their own evidence.

This KDP EPUB garbled text missing images workflow uses a controlled three-chapter package, three encoded text sources, and two image sources. It distinguishes what the local commands measured from what KDP or a reading device must still verify.

Open two incident records, not one repair task

The text record should name the chapter, authoritative source, detected encoding, approved substitution decision, and UTF-8 output. The image record should name each Markdown reference, its source file, and the corresponding packaged filename. A screenshot of a bad preview identifies a symptom, but it does not prove which source or package entry caused it.

Imagine that a character name and an illustration both disappear from chapter one. Rebuilding the chapter immediately would mix two investigations. Instead, reopen the approved UTF-8 copy for the name and trace the illustration from its relative path into the EPUB manifest. Passing one investigation never fills in the other record.

“The EPUB opens” is not a useful combined acceptance test. A ZIP container can open while containing the wrong text or a stale reference. A reproducible check reads the chosen input and the package internals rather than accepting a convenient intermediate display.

Trace images from source references into the package

The controlled manuscript contained three Markdown chapters and two small source images, figure-1.png and figure-2.png. Each chapter referenced both files. Before export, the relative paths were checked against the actual files. A stale path belongs to the image lane; it does not require another encoding conversion.

After export, the persistent package showed six body-image references: two references in each of three chapters. Six corresponding image entries were present in the package, and the inspection reported no missing resource. This is a packaging fact, not a visual-quality claim. The synthetic images are deliberately tiny and do not demonstrate production resolution or layout.

There are three useful failure states. A Markdown path may point to no source file. An XHTML reference may not match the manifest href. A cover asset may be mistaken for a body image. If one occurs, retain the failed EPUB and return to the exact reference that failed. Copying another image into a convenient filename can make a preview appear fixed while destroying the chain of custody.

The image acceptance card should therefore contain the source path, package href, and missing-resource result for every intended asset. It may also record a checksum. It should not say “looks fine everywhere,” because this run did not render the book on KDP devices.

Close the text lane with a reopened copy

The same short Japanese content was stored as UTF-8, Shift_JIS, and UTF-16LE. rune inspect text returned UTF-8/LF/44 characters, Shift_JIS/LF/44 characters, and UTF-16LE/LF/45 characters. Those values identify the sources used in the controlled run; they are not a rule that every manuscript must have these counts.

The approved content was written to a separate target. The recorded dry run was rune file write --path /private/tmp/rune-g2c3-studio-281-mvvhqyk4/STUDIO-281-converted-copy.txt --content-file /private/tmp/rune-g2c3-studio-281-mvvhqyk4/approved-utf8-content.txt --dry-run --json. After the target was confirmed, the run repeated the command without --dry-run and inspected the new file again.

The reopened copy reported UTF-8, LF, and 44 characters, with decoded text equal to the approval input. That equality is more important than a success notification. A 44-character file containing the wrong punctuation or a different name is still a failure.

Rune Studio cannot decide what an unrepresentable character ought to mean. The author or editor must approve a deletion, substitution, or retained form in context. If the meaning remains uncertain, stop before saving. If a wrongly decoded source has already been overwritten, do not continue on that file; recover an authority or backup and start a new, named test.

Join the two lanes inside one inspected EPUB

The package run set horizontal writing and Japanese language, selected three chapter files, obtained an export plan, exported volume 0 as EPUB 3.1, and inspected the result. The final command was rune inspect epub --path /private/tmp/rune-g2c3-studio-281-mvvhqyk4/EPUB/studio-281-260903.120000.epub --json.

The resulting EPUB has SHA-256 9858bc0e5532190a0b64313584a22731f9af93d2a4d88c552d6360cebe1d299f. Local inspection returned valid=true. It contained three navigation links and three matching NCX points, six image references, and no reported missing resource.

These package values let the two records meet without collapsing them. The text record identifies the approved UTF-8 content. The image record accounts for packaged assets. The EPUB hash identifies the exact book for which both checks were performed.

If the text card fails but the image card passes, return to source approval and rebuild using the same asset set. If the image card fails but the text card passes, preserve the approved UTF-8 file and repair only the references. This separation prevents a successful correction from being undone by an unrelated repeat.

Reserve KDP claims for KDP evidence

The test did not submit the EPUB to KDP, measure a retailer acceptance decision, or compare rendering across reading systems. valid=true is a local structural result. It cannot be paraphrased as “KDP accepted the book” or “every device displays it identically.” Those are later checks.

Public Rune Studio documentation separately describes major Japanese encoding detection, graphical warnings for unrepresentable characters, and pausing automatic save while unresolved characters remain. This CLI run did not inspect warning pixels or time autosave behavior. Its measured scope is encoding inspection, separate-file write and readback, package generation, and package internals.

This article also does not cover KDP metadata fields, pricing, OCR, or full recovery of already corrupted data. Keeping those topics outside the incident record makes the local decision narrow enough to repeat.

Require two green cards before handoff

The text card is green when the source encoding is identified, the approved UTF-8 copy reopens as UTF-8/LF, and decoded text matches the approved input. The image card is green when every intended source exists, every reference maps to a packaged entry, and the package reports zero missing resources.

Attach both cards to the EPUB checksum. Do not use the success of one lane as a waiver for the other. A later KDP preview then becomes a new verification step against a known package, rather than an attempt to diagnose an unknown source, unknown references, and retailer rendering at once.

Review the current Rune Studio feature scope for the documented Mac capabilities. Prove the two-lane method on a small copied manuscript first; expand to the full book only after every failure has an unambiguous return point.