Dark Mode

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Releases: readium/swift-toolkit

3.8.0

10 Mar 16:27

Choose a tag to compare

Warning

Minor releases (a.B.c) of the Readium toolkit may now include minor breaking changes, such as dependency upgrades or small API modifications. Major version numbers are reserved for significant architectural changes.

Documentation

Changelog

Added

LCP

  • New Keychain-based implementations of the LCP license and passphrase repositories: LCPKeychainLicenseRepository and LCPKeychainPassphraseRepository.
    • Stored securely in the iOS/macOS Keychain.
    • Persist across app reinstalls.
    • Optionally synchronized across devices via iCloud Keychain.

Changed

Navigator

  • The EPUB navigator no longer requires an HTTP server. Publication resources are now served directly to the web views using a custom URL scheme handler.
    • The httpServer parameter of EPUBNavigatorViewController is deprecated and ignored.

Deprecated

Navigator

  • CBZNavigatorViewController is now deprecated.
    • Open CBZ publications with EPUBNavigatorViewController instead, which has more configuration options and preferences.

LCP

  • ReadiumAdapterLCPSQLite is now deprecated in favor of the built-in Keychain repositories. See the migration guide for instructions.

Fixed

  • Fixed casting of ResourceProperties's mediaType (contributed by @lbeus).

Navigator

  • The first resource of a fixed-layout EPUB is now displayed on its own by default, matching Apple Books behavior.
  • Fixed the default spread position for single fixed-layout EPUB spreads that are not the first page.

LCP

  • Fixed the print method consuming copy rights instead of print rights.

Commits

What's Changed

Full Changelog: 3.7.0...3.8.0

Contributors

lbeus, stevenzeck, and 2 other contributors
Assets 2
Loading

3.7.0

04 Feb 16:21

Choose a tag to compare

Warning

Minor releases (a.B.c) of the Readium toolkit may now include minor breaking changes, such as dependency upgrades or small API modifications. Major version numbers are reserved for significant architectural changes.

Take a look at the migration guide

Changelog

Added

Shared

  • Added support for JXL (JPEG XL) bitmap images. JXL is decoded natively on iOS 17+.
  • Publication.cover() now falls back on the first reading order resource if it's a bitmap image and no cover is declared.

Navigator

  • Support for displaying Divina (image-based publications like CBZ) in the fixed-layout EPUB navigator.
  • Bitmap images in the EPUB reading order are now supported as a fixed layout resource.
  • Added offsetFirstPage preference for fixed-layout EPUBs to control whether the first page is displayed alone or alongside the second page when spreads are enabled.

Streamer

  • The ImageParser now extracts metadata from ComicInfo.xml files in CBZ archives.
  • EPUB manifest item fallbacks are now exposed as alternates in the corresponding Link.
  • EPUBs with only bitmap images in the spine are now treated as Divina publications with fixed layout.
    • When an EPUB spine item is HTML with a bitmap image fallback (or vice versa), the image is preferred as the primary link.
  • Standalone audio files (e.g. MP3) metadata extraction now includes narrators (from the composer metadata fields) and merges artist metadata into authors, following conventions used by common audiobook tools.

Changed

  • The iOS minimum deployment target is now iOS 15.0.

Shared

  • Accessibility display strings are now sourced from the thorium-locales repository (instead of W3C's repository). Contributions are welcome on Weblate.

LCP

  • The LCP dialog used by LCPDialogAuthentication has been redesigned.
    • Breaking: The LCP dialog localization string keys have been renamed. If you overrode these strings in your app, you must update them. See the migration guide for the key mapping.
  • LCP localized strings are now sourced from the thorium-locales repository. Contributions are welcome on Weblate.

Deprecated

Streamer

  • The EPUB manifest item id attribute is no longer exposed in Link.properties.
  • Removed title inference based on folder names within image and audio archives. Use the archive's filename instead.

Fixed

Navigator

  • PDF documents are now opened off the main thread, preventing UI freezes with large files.
  • Fixed providing a custom reading order to the EPUBNavigatorViewController (contributed by @lbeus).

Commits

New Contributors

Full Changelog: 3.6.0...3.7.0

Contributors

lbeus and mickael-menu
Loading

3.6.0

17 Dec 15:04
5634c87
This commit was created on GitHub.com and signed with GitHub's verified signature.
GPG key ID: B5690EEEBB952194
Verified
Learn about vigilant mode.

Choose a tag to compare

Warning

Minor releases (a.B.c) of the Readium toolkit may now include minor breaking changes, such as dependency upgrades or small API modifications. Major version numbers are reserved for significant architectural changes.

Take a look at the migration guide

Changelog

Added

Navigator

  • Added DragPointerObserver to recognize drag gestures with pointer events.
  • Added DirectionalNavigationAdapter.onNavigation callback to be notified when a navigation action is triggered.
    • This callback is called before executing any navigation action.
    • Useful for hiding UI elements when the user navigates, or implementing analytics.
  • Added swipe gesture support for navigating in PDF paginated spread mode.
  • Added fit preference for fixed-layout publications (PDF and FXL EPUB) to control how pages are scaled within the viewport.
    • In the PDF navigator, it is only effective in scroll mode. Paginated mode always uses page fit due to PDFKit limitations.

Deprecated

Navigator

  • PDFNavigatorViewController.scalesDocumentToFit is now deprecated and non-functional. The navigator always scales the document to fit the viewport.

Changed

Streamer

  • Support for asynchronous callbacks with onCreatePublication (contributed by @smoores-dev).

Navigator

  • The Fit enum has been redesigned to fit the PDF implementation.
    • Breaking change: Update any code using the old Fit enum values.
  • The fixed-layout navigators (PDF and FXL EPUB)'s content inset behavior has changed:
    • iPhone: Continues to apply window safe area insets (to account for notch/Dynamic Island).
    • iPad/macOS: Now displays edge-to-edge with no automatic safe area insets.
    • You can customize this behavior with VisualNavigatorDelegate.navigatorContentInset(_:).

Fixed

Navigator

  • Fixed EPUB fixed-layout spread settings not updating after device rotation when the app was in the background.
  • Fixed zoom-to-fit scaling in PDF paginated spread mode when offsetFirstPage is enabled.

LCP

  • Fixed crash when an EPUB resource is declared as LCP-encrypted in the manifest but contains unencrypted data.

Commits

New Contributors

Full Changelog: 3.5.0...3.6.0

Contributors

smoores-dev, stevenzeck, and mickael-menu
Loading

3.5.0

06 Nov 21:17
8bd799d
This commit was created on GitHub.com and signed with GitHub's verified signature.
GPG key ID: B5690EEEBB952194
Verified
Learn about vigilant mode.

Choose a tag to compare

Warning

Minor releases (a.B.c) of the Readium toolkit may now include minor breaking changes, such as dependency upgrades or small API modifications. Major version numbers are reserved for significant architectural changes.

Take a look at the migration guide

Changelog

Added

Navigator

  • Added VisualNavigatorDelegate.navigatorContentInset(_:) to customize the content and safe-area insets used by the navigator.
    • By default, the navigator uses the window's safeAreaInsets, which can cause content to shift when the status bar is shown or hidden (since those insets change). To avoid this, implement navigatorContentInset(_:) and return insets that remain stable across status bar visibility changes -- for example, a top inset large enough to accommodate the maximum expected status bar height.
  • Added [TTSVoice].filterByLanguage(_:) to filter TTS voices by language and region.
  • Added [TTSVoice].sorted() to sort TTS voices by region, quality, and gender.
  • New experimental positioning of EPUB decorations that places highlights behind text to improve legibility with opaque decorations (contributed by @ddfreiling).
    • To opt-in, initialize the EPUBNavigatorViewController.Configuration object with decorationTemplates: HTMLDecorationTemplate.defaultTemplates(alpha: 1.0, experimentalPositioning: true).

LCP

  • Added an initializer parameter for providing a custom device identifier (contributed by @dewantawsif).
    • You must ensure the identifier is unique and stable for the device (persist and reuse across app launches).
    • Recommended: generate an app-scoped UUID and store it securely (e.g., in the Keychain); avoid hardware or advertising identifiers.
  • You can use LCPService.injectLicenseDocument(_:in) to insert an LCPL into a package, if you downloaded it manually instead of using LCPService.acquirePublication().

Changed

Navigator

  • EPUBNavigatorViewController.Configuration.contentInset now expects values that already include the safe area insets.
    • If you previously supplied content-only margins, update them to add the safe-area values to preserve the same visible layout.
    • Alternatively, implement VisualNavigatorDelegate.navigatorContentInset(_:) to compute and return the full insets (content + safe area), helping avoid layout shifts when system UI (e.g., the status bar) appears or disappears.
  • Eloquence and novelty TTS voices are removed from the PublicationSpeechSynthesizer API, as they are not a good fit to read publications.

LCP

  • The LCP License Document is now accessible via publication.lcpLicense?.license, even if the license validation fails with a status error or missing passphrase. This is useful for checking the end date of an expired license or renew a license.

Fixed

Navigator

  • The safe area insets strategy was adjusted to take into account changes in iOS/iPadOS 26.
  • Fixed the lost progression with the EPUB navigator when the application becomes active again after the system terminated the WebKit process.

Commits

New Contributors

Full Changelog: 3.4.0...3.5.0

Contributors

x0000ff, ddfreiling, and 3 other contributors
Loading

3.4.0

03 Sep 15:04
806ece1
This commit was created on GitHub.com and signed with GitHub's verified signature.
GPG key ID: B5690EEEBB952194
Verified
Learn about vigilant mode.

Choose a tag to compare

Warning

Minor releases (a.B.c) of the Readium toolkit may now include minor breaking changes, such as dependency upgrades or small API modifications. Major version numbers are reserved for significant architectural changes.

Take a look at the migration guide

Changelog

Added

Navigator

  • You can now access the viewport property of an EPUBNavigatorViewController to obtain information about the visible portion of the publication, including the visible positions and reading order indices.

Deprecated

Shared

Changed

Streamer

  • EPUB series added with Calibre now take precedence over the native EPUB ones in the belongsToSeries RWPM property.

Fixed

Streamer

  • #639 Optimized the opening of really large LCP protected publications.

Navigator

  • #70 Fixed restoring the reading progression with RTL EPUB.
  • EPUB vertical text in scrolling mode:
    • #556 Fixed reporting and restoring the reading progression.
    • Added support for decorations (highlights).
  • #635 Fixed overlapping FXL pages in landscape orientation.

Commits

New Contributors

  • @TechWilk made their first contribution in #615
  • @hongorzulnemo made their first contribution in #642

Full Changelog: 3.3.0...3.4.0

Contributors

TechWilk, grighakobian, and 2 other contributors
Loading

3.3.0

11 Jun 10:12
4ae36cf
This commit was created on GitHub.com and signed with GitHub's verified signature.
GPG key ID: B5690EEEBB952194
Verified
Learn about vigilant mode.

Choose a tag to compare

Warning

Minor releases (a.B.c) of the Readium toolkit may now include minor breaking changes, such as dependency upgrades or small API modifications. Major version numbers are reserved for significant architectural changes.

Take a look at the migration guide

Changelog

Added

Shared

  • Implementation of the W3C Accessibility Metadata Display Guide specification to facilitate displaying accessibility metadata to users. See the dedicated user guide.
  • Support for starting from a progression in the HTML content iterator.
  • New link rels in the readingOrder and EPUB landmarks to mark:
    • cover: the title page
    • contents: the table of contents
    • start: the first actual chapter

Navigator

  • A new InputObserving API has been added to enable more flexible gesture recognition and support for mouse pointers. See the dedicated user guide.

Streamer

  • The EPUB 2 element is now parsed into the RWPM landmarks subcollection when no EPUB 3 landmarks navigation document is declared.

LCP

Fixed

Navigator

  • Fixed several issues with the EPUB navigator cursor and pointer events.
    • Fixed the cursor shape on iPadOS when using a physical trackpad or mouse.
    • Fixed multiple tap events broadcasted while running on macOS.
  • #449 Fixed misaligned EPUB navigator when it does not span the full screen width.

Commits

New Contributors

  • @qnga made their first contribution in #577

Full Changelog: 3.2.0...3.3.0

Contributors

qnga and mickael-menu
Loading

3.2.0

24 Mar 13:38

Choose a tag to compare

Take a look at the migration guide

Changelog

Added

Shared

LCP

Changed

Shared

  • The absoluteURL and relativeURL extensions on URLConvertible were removed as they conflict with the native URL.absoluteURL.
    • If you were using them, you can for example still use anyURL.absoluteURL instead.
  • go-toolkit#92 The accessibility feature printPageNumbers is deprecated in favor of pageNavigation.

Streamer

  • A self link is not required anymore when parsing a RWPM.

Fixed

Navigator

  • Fixed going to a link containing a fragment in the PDF navigator, for example from the table of contents.

Commits

Full Changelog: 3.1.0...3.2.0

Contributors

mickael-menu
Loading

3.1.0

31 Jan 16:49

Choose a tag to compare

Take a look at the migration guide

Changelog

Added

Shared

  • Support for streaming ZIP packages over HTTP. This lets you open a remote EPUB, audiobook, or any other ZIP-based publication without needing to download it first.

Deprecated

  • The close() and Closeable APIs are now deprecated. Resources are automatically released upon deinit, which aligns better with Swift.

Fixed

LCP

  • Fixed a regression that caused some LCP passphrases to no longer match the protected publication.

Navigator

  • Fixed race condition when calling submitPreferences() before the EPUB navigator is fully initialized.

Commits

Full Changelog: 3.0.0...3.1.0

Contributors

mickael-menu
Loading

3.0.0

14 Jan 15:42
6ba50b6
This commit was created on GitHub.com and signed with GitHub's verified signature.
GPG key ID: B5690EEEBB952194
Verified
Learn about vigilant mode.

Choose a tag to compare

Take a look at the migration guide

Changelog

Added

Shared

  • TableOfContentsService can now be used to customize the computation of publication.tableOfContents().

Streamer

  • Support for standalone audio files and their metadata (contributed by @domkm).

Navigator

  • The EPUBNavigatorViewController.Configuration.disablePageTurnsWhileScrolling property disables horizontal swipes for navigating to previous or next resources when scroll mode is enabled. When set to true, you must implement your own mechanism to move to the next resource (contributed by @alecdhansen).

LCP

  • The table of contents of an LCP-protected PDF is now extracted directly from the PDF if the tableOfContents property in manifest.json is empty.

Changed

  • The R2Shared, R2Streamer and R2Navigator packages are now called ReadiumShared, ReadiumStreamer and ReadiumNavigator.
  • Many APIs now expect one of the new URL types (RelativeURL, AbsoluteURL, HTTPURL and FileURL). This is helpful because:
    • It validates at compile time that we provide a URL that is supported.
    • The API's capabilities are better documented, e.g. a download API could look like this : download(url: HTTPURL) -> FileURL.
  • Plenty of completion-based APIs were changed to use async functions instead.

Shared

  • Link and Locator's href are normalized as valid URLs to improve interoperability with the Readium Web toolkits.
    • You MUST migrate your database if you were persisting HREFs and Locators. Take a look at the migration guide for guidance.
  • Links are not resolved to the self URL of a manifest anymore. However, you can still normalize the HREFs yourselves by calling Manifest.normalizeHREFsToSelf().
  • Publication.localizedTitle is now optional, as we cannot guarantee a publication will always have a title.
  • A new Format type was introduced to augment MediaType with more precise information about the format specifications of an Asset.
  • Fetcher was replaced with a simpler Container type.
  • PublicationAsset was replaced by Asset, which contains a Format and access to the underlying Container or Resource.
  • The ResourceError hierarchy was revamped and simplified (see ReadError). Now it is your responsibility to provide a localized user message for each error case.
  • The Link property key for archive-based publication assets (e.g. an EPUB/ZIP) is now https://readium.org/webpub-manifest/properties#archive instead of archive.
  • The API of HTTPServer slightly changed to be more future-proof.
  • The default ZIPArchiveOpener is now using ZIPFoundation instead of Minizip, with improved performances when reading ranges of stored ZIP entries.
  • Improvements in the HTTP client:
    • The consume closure of HTTPClient.stream() can now return an error to abort the HTTP request.
    • HTTPError has been refactored for improved type safety and a clearer separation of connection errors versus HTTP errors.
    • DefaultHTTPClient no longer automatically restarts a failed HEAD request as a GET to retrieve the response body. If you relied on this behavior, you can implement it using a custom DefaultHTTPClientDelegate.httpClient(_:recoverRequest:fromError:).

Streamer

  • The Streamer object was deprecated in favor of smaller segregated APIs: AssetRetriever and PublicationOpener.

Navigator

LCP

  • The Readium LCP persistence layer was extracted to allow applications to provide their own implementations. Take a look at the migration guide for guidance.

Fixed

  • #489 Fix crash related to Fuzi when compiling with Xcode 16 in release mode.

Shared

  • Fixed a crash using HTTPClient.download() when the device storage is full.

Navigator

  • Optimized scrolling to an EPUB text-based locator if it contains a CSS selector.
  • The first resource of a fixed-layout EPUB is now displayed on its own when spreads are enabled and the author has not set a page-spread-* property. This is the default behavior in major reading apps like Apple Books.
  • #471 EPUB: Fixed reporting the current location when submitting new preferences.
  • #459 Fixed the stack overflow issue that occurred when running the text-to-speech on an EPUB file with many empty resources.
  • #490 Fixed issue loading fixed-layout EPUBs.
  • #502 Fixed accessibility editing actions on iOS 18.
  • #509 Removed the "Copy Link with Highlight" and "Writing Tools" EPUB editing actions on newer devices.

OPDS

  • Fixed a data race in the OPDS 1 parser.

Commits

Read more

Contributors

domkm, FuzzzzyBoy, and 3 other contributors
Loading

3.0.0-beta.2

14 Jan 13:37
2dc5805
This commit was created on GitHub.com and signed with GitHub's verified signature.
GPG key ID: B5690EEEBB952194
Verified
Learn about vigilant mode.

Choose a tag to compare

3.0.0-beta.2 Pre-release
Pre-release

Take a look at the migration guide

Changelog

Added

Navigator

  • The EPUBNavigatorViewController.Configuration.disablePageTurnsWhileScrolling property disables horizontal swipes for navigating to previous or next resources when scroll mode is enabled. When set to true, you must implement your own mechanism to move to the next resource (contributed by @alecdhansen).

Changed

Shared

  • The default ZIPArchiveOpener is now using ZIPFoundation instead of Minizip, with improved performances when reading ranges of stored ZIP entries.
  • Improvements in the HTTP client:
    • The consume closure of HTTPClient.stream() can now return an error to abort the HTTP request.
    • HTTPError has been refactored for improved type safety and a clearer separation of connection errors versus HTTP errors.
    • DefaultHTTPClient no longer automatically restarts a failed HEAD request as a GET to retrieve the response body. If you relied on this behavior, you can implement it using a custom DefaultHTTPClientDelegate.httpClient(_:recoverRequest:fromError:).

Fixed

Shared

  • Fixed a crash using HTTPClient.download() when the device storage is full.

Navigator

  • #509 Removed the "Copy Link with Highlight" and "Writing Tools" EPUB editing actions on newer devices.

OPDS

  • Fixed a data race in the OPDS 1 parser.

Commits

New Contributors

Full Changelog: 3.0.0-beta.1...3.0.0-beta.2

Contributors

alecdhansen and mickael-menu
Loading
Previous 1 2 3 Next
Previous Next