
BetterReplay
Packet Based Player Recorder. BetterReplay is a server-side replay plugin for Paper and Folia-style scheduling. It records player and nearby entity activity on the server, saves the timeline, and replays it for viewers in-game.
- Загрузки
- 812
- Подписчики
- 9
- Обновлён
- 24 июня 2026 г.
- Лицензия
- GPL-3.0-or-later
Опубликован 20 апреля 2026 г.
BetterReplay
BetterReplay is a server-side replay plugin for Paper and Folia-style scheduling. It records player and nearby entity activity on the server, saves the timeline, and replays it for viewers in-game.
What this project is
- Server plugin written in Java
- Targets modern Paper APIs
- Uses PacketEvents and FoliaLib for packet handling and scheduling
- Supports two storage backends:
- local JSON files
- MySQL
How this differs from client-side replay mods
BetterReplay is not a client recording mod.
Server-side approach (this project):
- Runs entirely on the server
- No replay mod required on player clients
- Captures server-observed gameplay state and events
- Plays back by spawning and updating replay entities for a viewer
- Good for moderation, event review, and server-side tooling
Typical client-side replay mod approach:
- Records from a specific client perspective
- Usually requires modded client setup
- Often includes advanced free-camera/cinematic editing features
- Playback is usually local to the client recording
In short: BetterReplay focuses on server-managed replay workflows and API-driven integration.
Features
- Start and stop recordings
- Save recordings to file or MySQL
- List and delete stored replays
- Replay sessions for viewers
- API-first integration support for other plugins
- Optional Floodgate soft dependency support
Base command:
- /replay
Subcommands:
- start
- stop
- play
- list
- delete
Permissions:
- replay.start
- replay.stop
- replay.play
- replay.list
- replay.delete
- replay.*
Storage-Type options
Valid values for General.Storage-Type are:
file- Stores replay data as JSON files under the plugin data folder.
mysql- Stores replay data in a MySQL table (
replays) using the configuredGeneral.MySQL.*values.
- Stores replay data in a MySQL table (
These values should be lowercase as shown above.
File storage example
General:
Check-Update: true
Storage-Type: file
MySQL storage example
General:
Check-Update: true
Storage-Type: mysql
MySQL:
host: 127.0.0.1
port: 3306
database: betterreplay
user: replay_user
password: change-me
Additional key used by command pagination:
list-page-size: 10
Notes:
- If Storage-Type is invalid, plugin falls back to file storage.
- MySQL replay names are stored in a VARCHAR(64) primary key column.
API
BetterReplay provides a public API for other plugins to start/stop recordings, manage replays, and listen for lifecycle events.
Quick example:
ReplayManager manager = ReplayAPI.get();
manager.startRecording("demo-session", List.of(player), 120);
manager.stopRecording("demo-session", true);
manager.startReplay("demo-session", viewerPlayer);
Ченджлог
1.5.0-alpha.15Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/ - 2026-06-23: New binary
.brarchives now compress timeline payloads and chunk payloads with Zstd level 1, declarepayloadCompression: "zstd", bump the binary replay compatibility floor to1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
- 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick
ConcurrentModificationExceptioncrashes during live recordings - 2026-06-16: Replay compatibility checks now treat a stable release like
1.5.0as newer than same-base dev builds such as1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message - 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
- 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread
CraftChatMessagefreezes when invalid or missing replay names are echoed (#76) - 2026-06-23: Binary replay manifests now keep
recordedWithVersionas the exact writer build while stampingminimumViewerVersionfrom the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release - 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
- 2026-06-23: Recovered recordings now infer chunk payload format from temp region contents so packet-friendly chunk baselines are not saved with legacy chunk metadata
- 2026-06-23: Active recordings now preserve append logs and chunk temp files during plugin shutdown so startup recovery can finalize them instead of discarding the in-progress replay
1.5.0-alpha.15Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/ - 2026-06-23: New binary
.brarchives now compress timeline payloads and chunk payloads with Zstd level 1, declarepayloadCompression: "zstd", bump the binary replay compatibility floor to1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
- 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick
ConcurrentModificationExceptioncrashes during live recordings - 2026-06-16: Replay compatibility checks now treat a stable release like
1.5.0as newer than same-base dev builds such as1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message - 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
- 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread
CraftChatMessagefreezes when invalid or missing replay names are echoed (#76) - 2026-06-23: Binary replay manifests now keep
recordedWithVersionas the exact writer build while stampingminimumViewerVersionfrom the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release - 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
- 2026-06-23: Recovered recordings now infer chunk payload format from temp region contents so packet-friendly chunk baselines are not saved with legacy chunk metadata
- 2026-06-23: Active recordings now preserve append logs and chunk temp files during plugin shutdown so startup recovery can finalize them instead of discarding the in-progress replay
1.5.0-alpha.14Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/ - 2026-06-23: New binary
.brarchives now compress timeline payloads and chunk payloads with Zstd level 1, declarepayloadCompression: "zstd", bump the binary replay compatibility floor to1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
- 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick
ConcurrentModificationExceptioncrashes during live recordings - 2026-06-16: Replay compatibility checks now treat a stable release like
1.5.0as newer than same-base dev builds such as1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message - 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
- 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread
CraftChatMessagefreezes when invalid or missing replay names are echoed (#76) - 2026-06-23: Binary replay manifests now keep
recordedWithVersionas the exact writer build while stampingminimumViewerVersionfrom the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release - 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
- 2026-06-23: Recovered recordings now infer chunk payload format from temp region contents so packet-friendly chunk baselines are not saved with legacy chunk metadata
1.5.0-alpha.13Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/ - 2026-06-23: New binary
.brarchives now compress timeline payloads and chunk payloads with Zstd level 1, declarepayloadCompression: "zstd", bump the binary replay compatibility floor to1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
- 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick
ConcurrentModificationExceptioncrashes during live recordings - 2026-06-16: Replay compatibility checks now treat a stable release like
1.5.0as newer than same-base dev builds such as1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message - 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
- 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread
CraftChatMessagefreezes when invalid or missing replay names are echoed (#76) - 2026-06-23: Binary replay manifests now keep
recordedWithVersionas the exact writer build while stampingminimumViewerVersionfrom the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release - 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
1.5.0-alpha.12Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/ - 2026-06-23: New binary
.brarchives now compress timeline payloads and chunk payloads with Zstd level 1, declarepayloadCompression: "zstd", bump the binary replay compatibility floor to1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
- 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick
ConcurrentModificationExceptioncrashes during live recordings - 2026-06-16: Replay compatibility checks now treat a stable release like
1.5.0as newer than same-base dev builds such as1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message - 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
- 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread
CraftChatMessagefreezes when invalid or missing replay names are echoed (#76) - 2026-06-23: Binary replay manifests now keep
recordedWithVersionas the exact writer build while stampingminimumViewerVersionfrom the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
1.5.0-alpha.11Альфа1.21.11, 26.1.1, 26.1.2 · 23 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
- 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick
ConcurrentModificationExceptioncrashes during live recordings - 2026-06-16: Replay compatibility checks now treat a stable release like
1.5.0as newer than same-base dev builds such as1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message - 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
- 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread
CraftChatMessagefreezes when invalid or missing replay names are echoed (#76) - 2026-06-23: Binary replay manifests now keep
recordedWithVersionas the exact writer build while stampingminimumViewerVersionfrom the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
1.5.0-alpha.10Альфа1.21.11, 26.1.1, 26.1.2 · 17 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
- 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick
ConcurrentModificationExceptioncrashes during live recordings - 2026-06-16: Replay compatibility checks now treat a stable release like
1.5.0as newer than same-base dev builds such as1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message - 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
- 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread
CraftChatMessagefreezes when invalid or missing replay names are echoed (#76)
1.5.0-alpha.9Альфа1.21.11, 26.1.1, 26.1.2 · 16 июня 2026 г.
[Unreleased]
Added
- 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via
⏮and⏭inventory buttons - 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys
Playback.Speed-StepplusPlayback.Max-Speed - 2026-04-27: Finalized binary
.brreplay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration - 2026-04-27: Hidden admin utilities:
/replay export,/replay debug dump,/replay debug info, and/replay benchmark, with output written under the plugin data folder - 2026-04-29: Replay protection commands and metadata, protected replay highlighting in
/replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays - 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching,
Playback.Chunk-View-Radius,Playback.Chunk-Send-Limit-Per-Tick,Playback.Chunk-Clear-Limit-Per-Tick,Playback.Chunk-Timing-Diagnostics, andPlayback.Chunk-Mode - 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
- 2026-05-31: Replay viewer safety controls:
Playback.Viewer-Safety-Mode,Playback.Restore-Viewer-Location-On-Stop,Playback.Restore-Viewer-GameMode-On-Stop,Playback.Restore-Viewer-Flight-On-Stop, andPlayback.Restore-Viewer-State-On-Rejoin - 2026-06-02:
/replay reloadcommand to re-readconfig.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart - 2026-06-02: New config key
Playback.Vanish-Viewer(defaulttrue) to hide replay viewers from live players during playback - 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
- 2026-06-12: Velocity replay handoff support via
/replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops - 2026-06-14: Config key
Velocity.Default-Replay-Serverto route/replay play <name>to a default Velocity replay backend when noserver:<backend>argument is supplied
Changed
- 2026-04-11:
RecordingStopEventnow fires synchronously to fix async AntiCheatReplay compatibility - 2026-04-19: Update checks now treat
-SNAPSHOTbuilds as their corresponding release version - 2026-04-20: Config settings ownership moved out of
Replayinto a dedicated typed, comment-preserving config manager with versioned migrations - 2026-04-22: Replay sessions now always start at
1.0xspeed, andPlayback.Max-Speedis enforced to a minimum of1.0 - 2026-04-27: Binary replay archives now use format version
2; new.brinventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha.brinventory archives are intentionally unsupported - 2026-04-29:
ReplayManagernow exposeslistSavedReplaySummaries,protectSavedReplay,unprotectSavedReplay, and returnsReplayDeleteResultfromdeleteSavedReplay - 2026-04-30: Config keys for list settings were renamed from
list-page-sizeandlist-protected-highlight-colortoList.Page-SizeandList.Protected-Highlight-Color, with automatic startup migration - 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
- 2026-05-14: Modrinth uploads now publish the matching release changelog on
mainand the[Unreleased]section fordevalpha builds - 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under
docs/
Removed
- 2026-04-28:
General.Enable-Benchmark-Command;/replay benchmarkis now always permission-gated throughreplay.benchmark
Fixed
- 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
- 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
- 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
- 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
- 2026-04-19:
activeSessionsinRecorderManagerchanged toConcurrentHashMapto preventConcurrentModificationException(#33) - 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
- 2026-04-27: Replay export now writes under the plugin data folder
- 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
- 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
- 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated
ItemStackserialization work without losing fallback accuracy - 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
- 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
- 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
- 2026-06-04: Dev alpha publishing now derives the next
-alpha.Nversion from existing Modrinth releases for the current base version instead ofGITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now1.5.0-alpha.N) and workflow renames cannot reset alpha numbering - 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
- 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
- 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
- 2026-06-12: Legacy JSON replay loading now accepts
nullinventory content slots from olderinventory_updatesnapshots - 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update
created_atso recent listings reflect replaced recordings - 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
- 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
- 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
- 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
Комментарии
Загружаем…