An EPUB can look completely healthy in Apple Books, Calibre, or another reading app and still lose its cover—or be rejected outright—when it goes through Send to Kindle.
That seems contradictory until you stop thinking of EPUB as “a book file.” An EPUB is a ZIP package containing XML, XHTML, images, stylesheets, navigation documents, and a manifest that tells software how those pieces fit together. Reading apps often repair or ignore small inconsistencies. A conversion pipeline has to interpret the package more strictly.
I ran into this while building FixMyEPUB, a browser-based EPUB diagnostic and repair tool. These are the package-level problems that showed up repeatedly.
1. The ZIP can be readable but packaged incorrectly
Every EPUB contains a file named mimetype. The EPUB specification expects it to be the first entry in the archive and stored without compression. Some ZIP libraries reorder or compress it when rebuilding a book.
Many readers identify the file from its extension and open it anyway. A conversion service may use the package structure as an early validation signal.
A basic preflight should therefore check that:
-
mimetypeexists; - its content is exactly
application/epub+zip; - it is the first ZIP entry;
- it is stored rather than deflated.
2. container.xml can point to the wrong package document
META-INF/container.xml tells an EPUB processor where to find the OPF package document. A typical declaration looks like this:
<rootfile
full-path="OEBPS/content.opf"
media-type="application/oebps-package+xml" />
Problems appear when an editor renames or moves the OPF but leaves the old path behind, changes the path's letter case, or writes a leading slash that does not correspond to an archive entry.
Desktop readers sometimes search for a plausible OPF when that reference is broken. A server-side converter may simply reject the package.
3. A cover image is not necessarily an EPUB cover
Putting cover.jpg inside the archive does not make it the official cover. The image must be present in the manifest and declared using the convention appropriate to the EPUB version.
An EPUB 2 package commonly uses metadata that points to the manifest item's ID:
<meta name="cover" content="cover-image" />
<manifest>
<item
id="cover-image"
href="images/cover.jpg"
media-type="image/jpeg" />
</manifest>
EPUB 3 normally identifies the manifest item with properties="cover-image":
<item
id="cover-image"
href="images/cover.jpg"
media-type="image/jpeg"
properties="cover-image" />
Common failures include:
- metadata pointing to an ID that does not exist;
- the image being present but absent from the manifest;
- an incorrect media type;
- a path whose capitalization differs from the ZIP entry;
- multiple items claiming to be the cover;
- EPUB 2 and EPUB 3 declarations disagreeing with one another.
That explains a particularly confusing symptom: the cover appears inside the book, but the Kindle library tile is blank or generic. The reading order can still contain a cover page even when the package metadata does not identify a usable cover image.
I wrote a more focused Send to Kindle missing-cover checklist for that case.
4. The manifest and spine can disagree
The OPF manifest inventories the EPUB's resources. The spine defines the reading order by referencing manifest IDs.
For example:
<manifest>
<item id="chapter-1" href="text/chapter-1.xhtml" media-type="application/xhtml+xml" />
</manifest>
<spine>
<itemref idref="chapter-1" />
</spine>
If the spine refers to a missing ID, or the manifest points to a file that is not in the archive, a forgiving reader may skip the broken resource. A converter cannot safely infer the intended reading order.
The same class of error can affect navigation. EPUB 2 commonly uses an NCX document, while EPUB 3 uses a navigation document with the nav property. Incorrect references can produce a flat, duplicated, or incomplete table of contents even when every chapter is technically readable.
5. XML errors are often hidden until conversion
OPF, container, NCX, SVG, and XHTML documents all depend on well-formed XML. One unescaped ampersand, mismatched closing tag, invalid byte sequence, or misleading encoding declaration can break strict parsing.
Browser engines and reading apps have mature error recovery. XML parsers are intentionally less forgiving.
Useful checks include:
- parsing every required XML document rather than searching it with regular expressions;
- comparing declared encodings with the actual bytes;
- checking that referenced resources resolve relative to the document containing the reference;
- normalizing unsafe path segments without silently changing valid URLs;
- preserving namespaces when rewriting package documents.
6. Repairing an EPUB means rebuilding it carefully
A repair tool should not mutate the user's only copy. A safer workflow is:
- read and inventory the ZIP;
- locate the package document through
container.xml; - parse the OPF and classify the EPUB version;
- resolve cover, manifest, spine, and navigation references;
- apply only deterministic fixes;
- rebuild a separate archive with the required ZIP ordering;
- run the checks again on the rebuilt file.
FixMyEPUB performs that workflow locally in the browser. The book is not uploaded to the site's server, which matters because personal EPUBs can contain private notes, unpublished manuscripts, or licensed content. The tool does not remove DRM and is intended for DRM-free files the user is allowed to modify.
A practical preflight before Send to Kindle
Before sending an EPUB, verify at least the following:
- the ZIP container and
mimetypeentry are compliant; -
container.xmlresolves to an existing OPF; - required metadata and manifest entries exist;
- every spine reference points to a valid manifest item;
- cover metadata resolves to one valid raster image;
- navigation resources exist and are declared correctly;
- XML documents are well formed and consistently encoded;
- the repaired archive passes the same checks after rebuilding.
You can perform these checks manually with an archive viewer and XML parser, run a general EPUB validator, or use the free FixMyEPUB Send to Kindle checker when the symptoms are a missing cover or a generic delivery rejection.
The broader debugging lesson is useful beyond ebooks: “opens successfully” and “conforms to the interchange format” are different claims. Applications can recover from ambiguity; conversion pipelines often cannot.
FixMyEPUB is independent and is not affiliated with or endorsed by Amazon.
Top comments (0)