Just Enough Backups is a Fabric mod that adds server-side world backups with a usable in-game workflow.
It supports:
- full, partial, and differential backups
- manual backups through commands and UI
- automatic scheduled backups
- configurable public backup/restore announcements
- retention by backup count
- retention by total backup size per world
- restore preparation from the backup browser
- a configurable client HUD popup with live preview
- parallel (multi-threaded) scanning, compression, and restore extraction
- optional Zstandard compression inside ZIP archives
- optional remote backup storage (S3-compatible and WebDAV)
- optional Mod Menu integration
The mod is designed to keep the actual backup logic on the server side while exposing management and configuration through a client UI.
Remote storage
Remote storage is disabled by default. The configuration screen has a dedicated Remote tab with a provider selector, enable switch, and fields for S3 (endpoint, region, bucket, prefix, access key, secret key) and WebDAV (URL, prefix, username, password). For S3, bucket and region are required; the endpoint is optional for AWS and can point to an S3-compatible service. For WebDAV, set the collection URL. Credentials can be configured directly in the screen (secrets are masked) or set in config/justenoughbackups.json or through environment variables, which take precedence and avoid storing plaintext secrets on disk.
Set credentials in the server config or use environment variables, which take precedence:
- S3:
JEB_S3_ACCESS_KEY_IDandJEB_S3_SECRET_ACCESS_KEY - WebDAV:
JEB_WEBDAV_USERNAMEandJEB_WEBDAV_PASSWORD
Use HTTPS for remote endpoints. Plain HTTP is accepted only for loopback development endpoints. Remote backups are published after upload and SHA-256 verification; their catalog contains the metadata and checksum. Retention protects bases required by incremental chains. Restore downloads each required archive as a stream into isolated staging, verifies its checksum, then verifies the reconstructed world before preparing the world replacement. remoteStorage.maxRetries bounds upload attempts; a failed WebDAV upload restarts compression and transfer, while interrupted uploads are not resumed across process restarts. Do not place credentials in shared or committed config files.
Features
Backup types
- Full: creates a complete snapshot of the entire world at the moment of backup. No base backup is required and it serves as the foundation for later incremental backups.
- Partial: creates an incremental backup containing only the files that have changed since the most recent backup of any type (full, partial, or differential). It uses that most recent backup as its base.
- Differential: creates an incremental backup containing only the files that have changed since the most recent full backup. Differential backups are stored in a separate retention bucket from partial backups, allowing independent retention policies.
Dependencies between backups are tracked. Retention and delete operations respect those dependencies, so required base backups are preserved when newer partial or differential backups still depend on them.
Automatic backups
Automatic backups are driven by per-type schedulers (FULL, DIFFERENTIAL, PARTIAL) and can be configured to:
- run independently based on configured intervals for each backup type
- send optional public warning before an automatic backup starts
- pause when no players have been online since the last backup
- run on server start
- run on server stop
Public announcements can be sent to chat, sent to the action bar, or disabled.
Retention policy
Retention can be configured in two ways at the same time:
- count-based retention
- keep the newest
Xfull backups - keep the newest
Xpartial backups - keep the newest
Xdifferential backups
- keep the newest
- size cap per world
- optional hard cap for the total size of a world's backup folder
- applied to the final published backup set
- respects dependency chains
If a new backup would exceed the configured space cap even after deleting every backup that is allowed to be removed, creation fails instead of publishing an invalid final state.
Performance: parallel processing
Backups and restores use multiple worker threads to speed up large worlds:
- scanning / hashing: the world snapshot scan runs across
threadCountthreads (up to one per CPU core), reading and hashing files in parallel - compression: the ZIP archive is written with parallel compression
- restore extraction: backup ZIP files are extracted across
threadCountthreads
The number of threads is controlled by threadCount in the config and can be set between 1 and the maximum number of CPU threads (default: CPU cores minus two). Lower values reduce CPU usage; higher values speed up large worlds.
ZIP compression uses DEFLATED by default, with deflateCompressionLevel controlling the compression level (1–9, default: 6). compressionMethod: "ZSTANDARD" writes ZIP method 93 entries and zstdCompressionLevel controls the level (1–22, default: 3). Both DEFLATED and ZSTANDARD use parallel multi-threaded compression. For Zstandard, large entries are spilled to temporary scratch files to bound memory usage. Existing DEFLATED archives remain supported. Zstandard archives require the mod's Zstandard reader and may not open in older ZIP utilities.
Backup management UI
The backup browser includes:
- refresh
- create backup
- rename backup
- delete backup
- restore backup
- dependency-aware inline details
- search/filtering
Manual backup creation supports a custom file name from both the command line and the UI.
Config UI and popup preview
The config screen exposes:
- backup mode and scheduler options
- remote storage settings (provider selection, S3/WebDAV options, retries)
- retention rules
- permission level
- integrity mode
- backup directory and temporary backup directory
- excluded paths
- compression method and level options
- startup backup minimum age limits
- popup text, colors, channels, and layout
The popup preview screen lets you move and preview the HUD state before saving.
On a dedicated server the config screen is client-side only: it shows the HUD and Preview tabs (which apply locally to the popup), and server settings are edited on the server's config/justenoughbackups.json file followed by /jeb config reload. In single-player the whole config is shared and editable from the screen.
Commands
The root command is:
/jeb
Available commands:
/jeb now
/jeb now <name>
/jeb create full
/jeb create full <name>
/jeb create partial
/jeb create partial <name>
/jeb create differential
/jeb create differential <name>
/jeb list
/jeb next
/jeb restore <backup>
/jeb config reload
Notes:
<name>is optional and becomes the real.zipfile name after sanitization.<backup>is the visible backup name, with or without the.zipsuffix. Tab completion suggests the visible name.- restore is prepared asynchronously and then the server shuts down so the restore can be applied safely on the next startup.
/jeb nextdisplays a multi-schedule summary showing remaining times and exact execution timestamps for all configured backup types, sorted by proximity.- command access follows the configured permission level.
Default keybindings
Client-side keybindings:
B: open backup managementN: open config screen
These are regular Minecraft keybindings and can be changed in Controls.
Configuration
The mod writes its config file to:
config/justenoughbackups.json
Main config areas:
backupModepauseAutomaticBackupsWithoutPlayersbackupOnServerStartbackupOnServerStopautomaticSchedulefull(enabled,intervalMinutes)differential(enabled,intervalMinutes)partial(enabled,intervalMinutes)
automaticBackupWarningEnabledautomaticBackupWarningMinutescommandPermissionLevelmessageChannelintegrityModeincludeSummaryFileminimumFreeSpaceReserveMbthreadCountcompressionMethoddeflateCompressionLevelzstdCompressionLevelstartupBackupThresholdfullMinutespartialMinutesdifferentialMinutes
remoteStorageenabledprovider(S3orWEBDAV)maxRetries- S3 options:
s3Endpoint,s3Region,s3Bucket,s3Prefix,s3AccessKey,s3SecretKey - WebDAV options:
webDavUrl,webDavPrefix,webDavUsername,webDavPassword
backupDirectorytempBackupDirectoryexcludedPathsexcludeSafetyBackupsFromIncrementalretentionfullincrementaldifferentialmaxTotalSizeMb
popup
backupDirectory may be relative to the game directory or an absolute path.
tempBackupDirectory controls where the backup ZIP is compressed before being moved into backupDirectory. It may be relative to the game directory or an absolute path. Leave it empty to compress inside the backup directory (default). Pointing it at a local drive is recommended when backups are stored on a slow or networked drive, since only the finished ZIP is then transferred to the backup location.
excludedPaths uses paths relative to the world root. A folder entry excludes that full subtree, while a file entry excludes only that specific file.
Examples:
voxy
voxy/cache.db
excludeSafetyBackupsFromIncremental prevents "Old_World restore" safety backups from being used as base for incremental/differential backups.
threadCount controls parallel scanning, compression, and restore extraction, and is clamped between 1 and the number of CPU threads.
compressionMethod selects between standard DEFLATED ZIP compression and ZSTANDARD (ZIP method 93). Both methods use parallel multi-threaded compression. deflateCompressionLevel configures the Deflate level from 1 (fastest) to 9 (smallest, default: 6). zstdCompressionLevel configures the Zstandard level from 1 (fastest) to 22 (ultra compression, default: 3).
startupBackupThreshold sets the minimum age in minutes for the most recent successful backup of each type before a startup backup of that type runs. A value of 0 keeps the existing behavior. Scheduled and shutdown backups are unaffected.
Before creating a backup, the mod also checks free disk space on the backup destination filesystem. The check is conservative and requires:
(current world size * 2) + minimumFreeSpaceReserveMb
If that space is not available, backup creation is aborted before the temporary ZIP is written.
Backup naming
Manual backups support custom names:
- from commands:
/jeb now My backup - from the create dialog in the backup UI
If no custom name is provided, the mod uses the automatic naming scheme based on type and timestamp.
Rename uses the same sanitization rules as manual creation to keep naming behavior consistent.
License
This project is licensed under the MIT License.
How to Install Just Enough Backups (JEB) (Mod)
Just Enough Backups (JEB) by frandm16 is verified for Fabric across Minecraft versions 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5 (latest release: 1.2.0.10+26.3, file size: 11.1 MB). Follow the steps below to install it safely from ModCraft.tv:
- Click the Download button above and select your Minecraft version (1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5) and platform (Fabric).
- Make sure you have the compatible loader or environment installed for Fabric.
- Move the downloaded Just Enough Backups (JEB) file into your Minecraft
.minecraft/modsfolder and launch the game.
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 3d ago | 1 | ||||
| 18d ago | 1 | ||||
| 2mo ago | 1 | ||||
| 2mo ago | 1 | ||||
| 2mo ago | 1 | ||||
| 2mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 4mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 | ||||
| 6mo ago | 1 |
- Configurable backup watchdog timeout (
watchdogTimeoutSeconds, default: 300 seconds; valid range: 30–86400 seconds).
### Fixed
- Backup watchdog now tracks explicit activity during parallel ZIP writing and backup publication copying, reducing false timeouts during active work.
- Parallel ZIP progress now transitions explicitly into the writing phase instead of relying solely on expected input-byte totals.
- Cross-filesystem backup publication now stages and validates the copied archive before moving it into the final backup path.
- S3-compatible and WebDAV backup storage with bounded streaming uploads, published catalogs, checksums, and remote retention.
- Dedicated "Remote" tab in the in-game configuration screen with provider selection (S3 / WebDAV), connection settings, retry options, and masked credential fields.
- Support for large S3 backups via multipart copy and 5GB partition handling.
- Zstandard compression (
ZSTANDARD) for ZIP entries with configurable level (zstdCompressionLevel, 1–22) and parallel multi-threaded compression support; existing DEFLATED backups remain readable. - Parallel multi-threaded compression for both DEFLATED and ZSTANDARD modes, with scratch file spilling for large Zstandard entries to bound memory usage.
- Configurable Deflate compression level (
deflateCompressionLevel, 1–9) for standard DEFLATED backups. - Configurable per-type minimum age for startup backups (
startupBackupThresholdfor FULL, DIFFERENTIAL, and PARTIAL). A value of0preserves the previous behavior. - Support for setting remote credentials via environment variables (
JEB_S3_ACCESS_KEY_ID,JEB_S3_SECRET_ACCESS_KEY,JEB_WEBDAV_USERNAME,JEB_WEBDAV_PASSWORD) or server config file.
### Fixed
- Reduced distributed mod JAR size from ~18MB to ~10MB by pruning unused architecture native binaries in
zstd-jni(retaining standard 64-bit platforms: Windows x64, Linux x64, macOS ARM64/x64) and aligning Netty/Commons dependencies with Minecraft runtime. - Input fields in configuration and backup management screens now properly lose focus when clicking outside.
- Pressing ESC in the backup management screen now properly closes modal confirmation dialogs (restore and delete modals).
- Prevented integer overflow in progress percentage calculation for backups larger than 2GB.
- Fixed WebDAV remote storage streaming, collection paths, and redirect handling.
- Replaced all GLFW key and mouse constants with their
InputConstantsequivalents.
- New backup management screen with improved UI.
### Fixed
- Differential backup base selection now always depend on the latest full backup.
- Updated support for 26.1.x
- New config option
excludeSafetyBackupsFromIncremental(default: false) to exclude "Old_World restore" safety backups from being used as base for incremental/differential backups.
### Fixed
- Safety backup flag (
isSafetyBackup) is now properly written and persisted into the backup manifest on disk during restores. - Requesting an incremental or differential backup when no base backup exists now directly generates the base FULL backup instead of also creating an empty 0-byte backup.
- Partial backups now correctly calculate file changes after a restore: removed
modifiedTimefrom content comparison. - Partial and differential backups now calculate SHA-256 hashes for all files (not just FULL backups), ensuring consistent content comparison across the entire backup chain. This fixes a bug where creating a partial/differential backup after restoring could include or exclude files incorrectly due to inconsistent hash detection between backup types.
- Restore progress popup: the HUD popup now shows real-time progress while extracting the backup chain, staging the world, and creating the safety "Old_World restore" backup.
- Parallel (multi-threaded) world scanning, ZIP compression, and restore extraction, with a new configurable
threadCountoption (1 to max CPU threads). - New
tempBackupDirectoryconfig to compress the backup ZIP to a temporary folder and then move it to the backup destination, so only the finished ZIP is transferred when backups are stored on a slow or network drive. - New progress phases (
COMPRESSING,WRITING) and accurate bytes/percent progress reporting. - Config screen notice for dedicated servers: only the HUD and Preview settings are editable from the client; server settings are edited on the server's config file.
### Fixed
- Restore now completes reliably: the safety "Old_World restore" backup is created while the server is still running, so it no longer fails with C2ME's
saveAll asyncguard, and the world swap is applied when the server stops. - Fixed restore verification failing on backups created by older builds, whose manifest recorded a stale file size: restore now compares content by SHA-256 only (size differences are ignored) while keeping the structural check (missing/extra files) and the rejection of backups with a damaged status.
- Backup manifests now record the actual bytes written to the ZIP, so a file that changes between the scan and the compression (e.g. player data) no longer invalidates the manifest or blocks a later restore.
- Orphaned restore staging and temporary directories (
.justenoughbackups-staging-*and.restore-*) left behind by interrupted restores are now cleaned up automatically on server start. - Popup progress now shows the real bytes/percent while running and on completion; fixed the related tooltip error.
- Retention is now applied with the full fresh manifest list after creating a backup, avoiding a stale read.
/jeb nextis properly localized and lists each enabled automatic backup type with its remaining time.- The backup management search box keeps focus and caret position while typing.
- Removed the misleading "Starting backup..." message when a backup creation already failed.
/jeb config reloadnow reports the per-type automatic schedules instead of the legacy interval setting.
- Added independent automatic backup schedules for FULL, DIFFERENTIAL, and PARTIAL backups.
- Refactored the
/jeb nextcommand to show remaining times and execution details for all active backup schedules sorted by proximity. - Fixed an issue where deleting a backup from the UI did not refresh the backup list automatically.
- Added support for excluding specific files and folders from backups, including config UI support for managing excluded paths.
- Fixed backups failing when Minecraft creates temporary
level<digits>.datfiles during world saves. - Fixed server-side-only message translations showing raw translation keys on clients without the mod installed.
- Added optional
summary.txtgeneration inside backup ZIPs with world and backup details. - Added pre-backup disk space validation to prevent creating backups when there is not enough free space.
- Added configurable minimum free disk reserve in MB for safer backup creation.