Added C2PA soft bindings (io.iscc.v0, IEP-0020): soft_binding, soft_binding_definition, the
CLI command iscc-sdk soft-binding, the c2pa extra and test vectors. Soft bindings always use
default settings, so every party derives the same units from the same file
Added tolerant border trim for the Image-Code, on by default (image_trim_tolerant): crops
near-uniform borders so faint watermarks or JPEG noise no longer shift the crop, while smooth
gradients such as skies are kept. Image-Codes change for images with near-uniform borders;
set image_trim_tolerant=False to keep the earlier codes
Added is_featureless_image_code(iscc) to flag Image-Codes of featureless images
Updated iscc-sci to 0.4.1 (same border trim for the Semantic-Code Image) and bounded the
semantic extras to iscc-sci>=0.4.1,<0.5 and iscc-sct>=0.2.2,<0.3
Sped up image_trim_border about 8x
Fixed code_image_semantic failing on SVG files
Fixed per-call image options (normalization and thumbnail settings) and video_fps being ignored
Fixed image_max_pixels changing Pillow's process-wide limit per call - it is now global-only (a
differing per-call value raises ValueError)
Fixed from iscc_sdk import * exporting submodule names such as c2pa, which shadowed the
c2pa-python package - the package now defines __all__ with the public API of its modules
Fixed video thumbnails of portrait videos being taller than image_thumbnail_size - the size now
limits the larger side, as for all other media types
Fixed silent truncation of extracted text at Tika's 500,000-character default limit -
text_extract now allows up to 10,000,000 characters (a fixed constant, deliberately not
configurable so independent parties derive identical ISCCs) and logs a warning when the cap is
reached; Text-Code and granular text features change for documents longer than 500,000
characters
Updated iscc-lib to 0.7.0 (now the minimum required version), which fixes Image-Codes longer
than 64 bits to follow ISO 24138:2024 - Image-Code units at 96, 128 or 256 bits change beyond
the first 64 bits and should be regenerated; 64-bit Image-Codes and ISCC-CODEs are unaffected
Updated locked dependency versions (notably Pillow 13.0.0, exiv2 0.19.2, xxhash 4.0.1,
pypdf 6.21.1, pypdfium2 5.14.0, resvg-py 0.5.0, numpy 2.5.4, bitarray 3.12.2) - with
Pillow 13 EPUB cover thumbnails come out slightly different, and with exiv2 0.19.2 files written
by image_meta_embed differ at the byte level (embedded metadata is unchanged)
Hardened EPUB XML parsing with an explicit parser that disables entity resolution and network
access (#156)
Fixed EXIF XPTitle (and other Windows XP* tags) being extracted as a raw byte listing instead
of text - changes name and the Meta-Code for affected images (#163)
Fixed XMP struct containers being extracted as the placeholder type="Struct" (for example as
name) - they are now skipped so the next mapped field or the file name applies (#165)
Fixed code_meta crashing with UnicodeEncodeError on image metadata that is not valid UTF-8,
such as legacy IPTC text - such values are now decoded as Latin-1, the IPTC default (#164)
Added support for M4A audio (audio/mp4, with audio/x-m4a normalized to it) - .m4a files were
sniffed as video/mp4 and failed with "No video stream detected"; ISCC metadata is embedded in
M4A files as ISCC_* tags because TagLib drops MP4 tag names that contain a colon (#166)
Changed text_features to drop a final chunk shorter than the CDC minimum chunk size (128
characters at defaults) unless it is the only chunk - its simprint carried too little evidence
and matched unrelated documents; retained simprints, offsets and sizes are unchanged, but
persisted granular text features lose such tail entries (#162)
Fixed per-call text_avg_chunk_size and byte_offsets options being ignored for granular text
features - text_features read the global setting and code_text did not forward its options
Updated iscc-tika to 0.6.0 (Apache Tika 3.3.x), removing the <0.5.0 stability pin - the macOS
native-image crash on embedded images is fixed upstream and linux/aarch64 wheels are now
available
Updated iscc-lib to 0.6.0 - restores linux/aarch64 wheels (absent since 0.2.0)
BREAKING: Text metadata extraction now picks the first value when Tika returns multiple values
for single-valued IsccMeta fields (e.g. an EPUB3 with multiple <dc:title> elements);
Meta-Code and metahash differ from earlier releases for such assets
Fixed EPUB metadata embed→extract round-trip: the embedded title is now returned instead of the
document's pre-existing title
Added regression tests for upstream Tika EPUB parser fixes (TIKA-198 spine path traversal,
TIKA-237 deeply nested XML)
Updated test expectations for Tika 3 whitespace normalization in extracted text
Updated lint configuration for the expanded default rule set of ruff 0.16 (protects the
load-order-sensitive imports in iscc_sdk/__init__.py from autofix re-sorting)
Updated CLI tests for typer 0.27 error message formatting
Updated sct/sci extras to request the CPU ONNX runtime (iscc-sct[cpu], iscc-sci[cpu]) -
iscc-sct 0.2.x and iscc-sci 0.3.x moved the onnxruntime dependency behind cpu/gpu extras
Fixed process abort (uncatchable std::terminate → SIGABRT) in image_meta_extract() when an
image carries a metadata value that exiv2 cannot convert to UTF-8, e.g. an EXIF UserComment
declared UNICODE with an invalid UTF-16 payload as written by some early-2000s digital cameras;
undecodable fields are now skipped with a warning instead of crashing the process
Added SVG cover image support for EPUB thumbnails (rasterized via resvg)
Added IsccThumbExtractionError for recoverable thumbnail extraction failures
Changed code_iscc() to handle thumbnail extraction failures gracefully (logs warning, continues
without thumbnail instead of raising); genuinely corrupt or invalid source files still raise
IsccExtractionError
Changed code_iscc() to generate thumbnails early, before heavy content processing
Removed EPUB cover fallback to first manifest image (only explicit cover references are used)
Fixed EPUB3 cover-image detection for manifests with multiple space-separated property tokens
Fixed EPUB cover extraction when archive entries store UTF-8 filename bytes without the ZIP UTF-8
flag (CP437→UTF-8 recovery)
Fixed PNG cover thumbnail extraction failing on Photoshop-exported covers with large zTXt metadata
chunks (raised PngImagePlugin.MAX_TEXT_CHUNK to 4 MB)
Wrapped iscc-tika parse failures (TypeError from native bridge, e.g. TIKA-237 on EPUBs with
deeply nested XHTML) as IsccExtractionError in text_extract and text_meta_extract
Improved API documentation for code_iscc(), code_iscc_mt(), code_content(), and
code_text() options
Refactored code_iscc_mt() for improved parallelism: text extraction runs before submitting
content/semantic futures, thumbnail generation overlaps with sum/meta computation, and result
merging follows the same order as code_iscc()
Removed redundant onnxruntime from sci and sct optional dependency groups (already a
transitive dependency of iscc-sci and iscc-sct)
Fixed CI: skip semantic code tests on macOS Python 3.12 (onnxruntime 1.26.0 has no macOS wheels
for that version)
Updated iscc-schema floor to >=0.8.0 (version-pinned @context/$schema URLs now resolve to
0.8.0)