Skip to main content

ebookerr-sdk

The toolkit for writing ebookerr plugins: the plugin contract (ebookerr_sdk.spi), the host that runs a plugin (ebookerr_sdk.host), a test kit (ebookerr_sdk.testing), the pack command, and helper kits for EPUB files, downloads, validation, library servers and text generation.

Install

pip install "ebookerr-sdk==3.3.*"

The SDK's MAJOR.MINOR is the SPI version it speaks: ebookerr-sdk 3.3.x speaks SPI 3.3. It needs Python 3.11 or later.

Start a plugin

python -m ebookerr_sdk.pack new hello_book --type book
pytest hello_book/tests
python -m ebookerr_sdk.pack check hello_book
python -m ebookerr_sdk.pack build hello_book --out dist

new writes a plugin that passes check and its own test; --type is source, epub, book or catalog. The guide explains what to write next and how to install the zip in ebookerr.

Compatibility

ebookerr SPI ebookerr-sdk
2.24 3.0 3.0.x
2.24.1 3.1 3.1.x
2.24.7 3.2 3.2.x
2.24.9 3.3 3.3.x

ebookerr loads a plugin when its spi_version has ebookerr's SPI MAJOR and a MINOR not above ebookerr's; otherwise it shows the plugin as incompatible and offers a compatible release.

Versioning

  1. A MINOR release only adds: an optional manifest key whose default keeps today's behaviour, or a new protocol, role, operation, context method, event or trigger scope that you opt into.
  2. Anything else — removing or renaming, changing a default or a meaning, making a key required, refusing a manifest that was valid — waits for the next MAJOR release.
  3. ebookerr ignores manifest keys it does not know, with a warning; your plugin should ignore request keys it does not know. python -m ebookerr_sdk.pack check refuses unknown manifest keys and settings-field types, so a typo is caught before you release.
  4. Before it is removed, a public item is deprecated: named in these release notes and logged once per plugin as a warning when used, it keeps working for at least two MINOR releases and six months.
  5. An ebookerr release supports one SPI MAJOR, and moves to a new MAJOR only once every official plugin has a compatible release.
  6. A PATCH release of the SDK fixes defects only; it never changes the public API.
  7. The public API is manifest.toml, ebookerr_sdk.spi, ebookerr_sdk.host, ebookerr_sdk.testing, python -m ebookerr_sdk.pack and the kits ebookerr_sdk.epub, .validate, .download, .generation, .providers and .domain. ebookerr_sdk.wire, .readpos, .registry_index and every _-prefixed name are internal and may change in any release.

Release notes

3.3.0

SPI 3.3. The EPUB kit gains helpers for the EPUBs ebookerr writes; later sentences of this section name each one. A plugin written for SPI 3.2 needs no change. build_epub writes its package through ebookerr_sdk.epub.builder: the NCX dtb:uid is the OPF identifier and the package carries its creation date, so a built book validates without findings. EpubDocument.set_title writes a new title into the package and every table of contents (NcxDocument.set_doc_title, NavDocument.set_doc_title), so a retitled book's OPF and NCX agree. retitle_built_epub gives a build_epub output a new title in its package, tables of contents and title page; convert_stage and download_convert_stage use it, so a converted book's file carries the title the book gets. ebookerr_sdk.epub.text_convert.is_chapter_heading names the prose chapter-heading rule. convert_stage titles an uploaded document after its own title, else its file name unless the name is a placeholder such as Document1 or Untitled, else a first line that is no chapter heading. Book.front_matter holds the text above a document's first heading; build_epub puts it on the title page, and parse_text_to_book fills it instead of making that text a chapter. parse_text_to_book keeps each line of a text that has no blank line at all as its own paragraph. convert_stage and download_convert_stage pass a user_facing conversion error's message through unchanged and answer "The file could not be converted." for any other failure, so no library message or path reaches a user. EpubDocument.drm_protected() tells a DRM-protected book (a rights.xml, or an encryption.xml using anything but font obfuscation) from one whose fonts are only obfuscated.

3.2.0

SPI 3.2. A story can name the multi-part work it is one part of: StoryPatch.work and StoryPatch.work_url. series and series_url mean a series the site itself declares — separate works in a declared order — never the work a chapter belongs to. BookView.work_url carries the work a book is a chapter of. ebookerr_sdk.domain.adoption gains same_series and same_work; AdoptionSide.work_url and Evidence.same_work are new, and signal E5 is "same series or same work". EBOOKERR_META_KEYS gains work_url. A plugin written for SPI 3.1 needs no change.

3.1.0

SPI 3.1. A [[ui_triggers]] entry's icon is optional and defaults to the plugin's icon; declare one only when a plugin has more than one action. Every glyph name must be one the self-hosted Material Symbols font renders (ebookerr_sdk/spi/material_symbols.txt): pack check reports an unknown name, two actions of one scope showing the same glyph, and a trigger without icon in a manifest that still declares spi_version = "3.0". pack check now reports a declared requirement that is not installed where it runs instead of guessing its module names. A plugin written for SPI 3.0 needs no change.

3.0.0

SPI 3.0. A plugin written for SPI 2.x declares spi_version = "3.0" and applies these changes:

  • spi_version is required.
  • Roles are declared only as [roles.<name>] tables. The top-level keys exclusive_group, provider, delete_mode, reader_url_template, handles_merge_proposals, catch_all and extract_url_patterns are gone (provider, delete_mode and reader_url_template remain keys of [roles.library_server]).
  • network, auth_methods, headless, headed and default_enabled are no longer manifest keys. A plugin runs on events when it declares events, and runs by hand when it declares a book_selection_action or cover_invalidate trigger; PluginManifest.headed is derived from its triggers.
  • Settings-field types are string, textarea, int, float, bool, url, url_list, threshold_list, record_list and command: a secret is secret = true on a string, a drop-down is options with options_strict = true on a string; the types text, secret and select are gone. SettingsGroup.collapsed is gone.
  • UiFilter and UiTrigger.filters are gone.
  • PluginContext.ask_yes_no returns True, False, or None when the prompt was abandoned or timed out; PluginContext.ask_yes_no_answer and PluginContext.queue are gone.
  • UpdateCheckingSource.check_for_update always receives ctx; its cancel_event parameter is gone.
  • BookView.erotica_tags is gone; use BookView.tags.
  • ProviderAnchor, ProviderBookmark and ReadPositionAnchoring are imported from ebookerr_sdk.providers only.
  • New: PluginContext.credentials(url) and SiteCredential — the stored sign-in for a site the plugin may use: a host in its auth_sites ("*" for any site it processes) or the host of a credential = true URL setting.
  • New: python -m ebookerr_sdk.pack new starts a plugin; pack check refuses unknown manifest keys, settings-field types and trigger scopes.
  • ebookerr_sdk.spi is split into modules (errors, settings, types, views, declarations, context, protocols); every name still imports from ebookerr_sdk.spi.
  • ebookerr_sdk.wire, ebookerr_sdk.readpos and ebookerr_sdk.registry_index are internal.

Licence

ebookerr-sdk is released under the MIT licence. Each plugin carries its own licence.

Metadata

Release files for ebookerr-sdk 3.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ebookerr-sdk 3.3.0
File Size Uploaded Provenance
ebookerr_sdk-3.3.0.tar.gz 289.0 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ebookerr-sdk 3.3.0
File Interpreter ABI Platform
ebookerr_sdk-3.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 623.2 kB

Release files / ebookerr_sdk-3.3.0.tar.gz

Download URL ebookerr_sdk-3.3.0.tar.gz
Size 289.0 kB
Tags Source
SHA-256 checksum
How to use checksums
11ed42e7866c26216225ddb2d4c715006b6455fd2359d32a273c209edde83f8a
BLAKE2b-256 checksum
How to use checksums
a6e1095f30b7bb400cec1d637205ce36741a7ff7f9c01d40f4f9ed6e272513c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / ebookerr_sdk-3.3.0-py3-none-any.whl

Download URL ebookerr_sdk-3.3.0-py3-none-any.whl
Size 334.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0fc7347f91893be0a84430b9ef93be142c105123bdb80b7c295b1cc922d51113
BLAKE2b-256 checksum
How to use checksums
b59d3120daf643c260d811a2f1b65c30915e2a7865f03d56649f8c2324e3c03a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Security for ebookerr-sdk 3.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for ebookerr_sdk-3.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page