BookExport has one required platform dependency: Paper. It deliberately avoids
linking against the APIs of CMI, CMILib, PlaceholderAPI, LuckPerms, and Vault.
plugin.yml declares no depend or softdepend entries, so those optional plugins
do not control whether BookExport loads.
| Component | Relationship | Verified target or tested version |
|---|---|---|
| Paper | Required server and production API | Paper 26.2 STABLE build 84; compile API 26.2.build.84-stable |
| Java | Required runtime and bytecode target | Java 25 class files; Oracle Java 25.0.4.1 and 26.0.2.1 smoke-tested |
| CMI | Optional consumer of published CustomText files | CMI 9.8.9.9 tested |
| CMILib | CMI's dependency, not BookExport's dependency | CMILib 1.5.9.9 tested alongside CMI |
| PlaceholderAPI | Optional resolver used by CMI or other display plugins; no BookExport expansion | PlaceholderAPI 2.12.3 tested alongside CMI |
| LuckPerms | Optional Bukkit permission provider | LuckPerms 5.5.81 tested |
| Vault | No BookExport relationship | The tested server's CMI-flavored Vault artifact reported manifest version 1.7.3-CMI; BookExport did not use it |
The optional-plugin versions above describe the stack exercised on 2026-09-15. They are not declared minimum dependencies and are not bundled into the BookExport JAR.
Paper 26.2 stable build 84 supplies the server API and Adventure component types
used to read modern written-book pages and send chat components. BookExport targets
Java 25 class files, compiles against 26.2.build.84-stable, and declares
api-version: 26.2; Spigot and earlier Paper/Minecraft versions are not supported.
The Paper-aligned Adventure API listed in the Gradle test configuration supports unit tests. BookExport does not bundle a separate Adventure runtime JAR.
CMI is a file-format consumer, not an API dependency. With packaged defaults, BookExport publishes UTF-8 files into:
plugins/CMI/CustomText/
The cmi renderer writes <AutoPage> as a controlled first line, converts colors
to CMI's {#RRGGBB} form, converts supported decorations and resets to ampersand
codes, and inserts <NextPage> only between Minecraft pages. BookExport never
executes a CMI command and never invokes a CMI API.
BookExport also retains a zero-content .bookexport-publication.lock sentinel in
this directory. It is not a .txt CustomText entry. BookExport takes a non-blocking
exclusive lock on that sentinel during direct and reviewed publication so cooperating
BookExport processes cannot write concurrently. Do not delete or replace it while a
server may publish. Other editors must deliberately honor the same sentinel because
operating-system file locks can be advisory. This defense-in-depth lock does not make
sharing workflow roots between Paper installations supported; their recovery journals
would remain separate.
After publishing or directly exporting a new file, an administrator must reload CMI and then test the entry:
/cmi reload
/cmi ctext <name> <player>
Crash-journal scanning and /bookexport admin recovery list|show never invoke CMI,
run a command, or reload a plugin. If a transaction stopped after its live move,
CMI's in-memory view may therefore remain older than the file on disk. Preserve the
reported files, reconcile the checksums manually, and reload CMI only after an
administrator has deliberately resolved the publication state.
Without CMI, BookExport can still stage, review, archive, back up, and write text
files. The default published directory may be created even when CMI is absent, but
there is no CMI viewer for those files. /bookexport debug cmi reports whether CMI
and CMILib are currently installed; detection is diagnostic only.
CMI directives, action tags, and placeholder-looking text in an authored book are preserved intentionally and can become active when CMI displays the published file. Staging and checksums provide a review boundary; they do not sanitize author content. Grant export and publication permissions only to trusted users.
CMI format reference: CMI CustomText.
BookExport does not compile against or call CMILib. CMILib is present only when the
installed CMI version requires it. /bookexport debug cmi shows its detected plugin
version to help diagnose the surrounding CMI stack; BookExport behavior does not
change based on that value.
BookExport does not register a PlaceholderAPI expansion and does not resolve PAPI
or CMI placeholders. A token such as %cmi_user_display_name% is written unchanged.
CMI may resolve that token later for the player viewing the CustomText when the
server's CMI/PlaceholderAPI setup supports it.
This deferred behavior is useful for per-viewer text, but it is also a reason to
review authored content before publication. A token being preserved is not proof
that an installed expansion recognizes it. /bookexport debug cmi reports
PlaceholderAPI presence for diagnostics only.
BookExport checks Bukkit permission nodes. LuckPerms is an optional way to manage those nodes; BookExport does not call its API and does not require a particular permission plugin. Bukkit operator/default behavior applies when no external permission provider changes it.
Use Permissions as the authoritative node list. In particular,
bookexport.admin excludes bookexport.admin.replace, so permission inheritance
does not accidentally authorize replacement of a live file.
BookExport has no economy, chat, or permissions integration through Vault. It does not require Vault and does not use the Vault API. A server may install Vault for CMI or other plugins, but that is unrelated to BookExport.
The legacy, vanilla, strip, and mini color modes transform serialized text;
they do not hook another plugin. In particular, mini writes supported
MiniMessage-like tags but BookExport does not install or invoke a MiniMessage
renderer. The eventual consumer must understand the selected output syntax.