Places where KMServer does not match the Java version and does not plan to — accepted gaps. Improvements and intentional behavior differences are listed under Enhancements.
Out of scope
These are excluded on purpose rather than gaps:
- Actuator endpoints and metrics that only expose JVM/Spring internals (beans, conditions, env, configprops, loggers, mappings, heapdump, threaddump,
system.*/http.server.requestsmeters,jvm.*beyondjvm.memory.usedand the like).
Media formats
- HEIF, HEIC and AVIF pages are decoded by libheif, as in the Java version, but only its HEVC and AV1 decoders are built in. Rare files with other payloads, such as AVC or JPEG, are still served as-is but get no thumbnail or conversion.
- PDF support requires a runtime libpdfium, looked up in
KOMGA_PDFIUM_PATH, next to the executable, then system paths; when unavailable, every PDF operation returnsUnsupported. The Java version bundles PDFBox. The Docker image, macOS app, and Windows packages include libpdfium; Linux release archives require a separate library, as described in Installation. - JPEG output is not byte-identical to ImageIO (different encoder), an accepted deviation that affects byte-level comparisons of thumbnails and page hashes.
Search
- The full-text query syntax is a deliberate subset of Komga’s Lucene syntax: whitespace-ANDed terms plus
field:scoping (includingfield:(a OR b)groups). Boolean operators, fuzzy~, wildcards, phrases, boosts and[a TO b]ranges are searched as literal text, not interpreted as operators — see Search. komga.lucene.index-analyzer.*andkomga.lucene.commit-delayare ignored (warned and dropped during Java config migration); the analyzer is fixed to the multilingual ngram chain.
API
- Request JSON is parsed strictly: property names and search-condition operator tags are case-sensitive (
oneShot,isNot). The Java version accepts any casing (JacksonACCEPT_CASE_INSENSITIVE_PROPERTIES/ACCEPT_CASE_INSENSITIVE_VALUES), so payloads spelledoneshotorisnotwork there. Here a wrong-case operator tag or enum value gets a 422, but a wrong-case property name is silently ignored as an unknown field:PATCH /api/v1/settingswith{"TaskPoolSize": 3}returns 204 and changes nothing. Send the documented camelCase forms. server.context-pathonly prefixes generated links (OPDS/WebPub/Kobo); routes are not mounted under it, so the server cannot answer under the prefix itself — put it behind a reverse proxy that strips the prefix. The Java version mounts the whole application under it.
Database / migrations
- Deprecated BCP47 aliases (e.g.
iw→he) are not normalized by the language-code migration for pre-2023-08 libraries, an accepted deviation.
Ignored Java configuration keys
Warned about and dropped during application.yml migration:
server.error.*komga.database.batch-chunk-size,komga.tasks-db.batch-chunk-sizekomga.database.check-local-filesystem,komga.tasks-db.check-local-filesystem
Ignored but behavior-equivalent (not limitations): server.tomcat.* (tomcat-specific), server.forward-headers-strategy (always framework, except that X-Forwarded-For is honored only from server.trusted-proxies), shutdown handling (always graceful).