ZRestart
Lightweight Paper-only auto-restart scheduler for Minecraft Java 26.x.
ZRestart schedules native Bukkit.restart() calls, broadcasts configurable countdown warnings across chat, title, boss bar, and sound, and gives admins full manual control — with every player, admin, and console-facing message exposed in messages.yml. Built specifically for Paper 26.x and Java 25+, with no legacy version baggage.
Why ZRestart
- Paper 26.x-first. No compatibility shims for old API versions. Lean codebase targeting the current Paper API directly.
- Familiar schedule format. Uses
DAY;HOUR;MINUTE[;REASON]entries that any experienced admin will recognize on sight. - Real timezone handling. IANA timezone IDs with proper DST gap/overlap behavior and a configurable fallback timezone.
- Atomic reload. A broken config never breaks the plugin — ZRestart keeps the previous valid runtime if a reload fails.
- Versioned configs with automatic migration. Adds new keys on plugin updates, preserves your customizations, and saves timestamped backups before any rewrite.
- Restart-script diagnostic. Detects unsafe
Bukkit.restart()setups on startup and warns you, so a "restart" doesn't silently become a "stop." - Public read-only API for other plugins to query restart state and trigger start/stop programmatically.
Features
⏱️ Scheduling
- Automatic restart scheduling using
Dailyor weekday entries (DAY;HOUR;MINUTE[;REASON]) - Manual restart countdowns:
/zrestart now <interval> [reason] - Live delay and cancel:
/zrestart delay <interval>and/zrestart stop - Flexible interval formats:
30m,1:30,3600,1h 30m, and more
Warnings
- Four channels: chat, title, boss bar, sound — all driven from one shared warning list
- Per-warning sound entries with configurable sound name, category, volume, pitch
- Boss bar with configurable color, overlay, progress, and
show-fromthreshold - Player title popups when manual restarts are scheduled or pending restarts are cancelled
⚙️ Configuration & reliability
- Full MiniMessage support alongside legacy
&color codes - Configurable timezone with DST gap/overlap handling and fallback timezone
- Versioned
config.ymlandmessages.ymlwith automatic schema migration - Timestamped backups before any auto-update rewrite (
config.yml.bak-YYYYMMDD-HHMMSS) - Atomic reload — keeps the previous valid runtime config if a reload fails
- Startup diagnostic for unsafe
Bukkit.restart()setups - Tab-completion for subcommands, intervals, and configured reasons
- Unit tests covering parser, scheduler, warnings, and reload paths
Integration
- Public read-only API exposing manual + automatic restart state and start/stop triggers
- Optional pre-restart console commands with
CONTINUEorABORTfailure behavior - Soft PlaceholderAPI integration for player-bound messages
- Attempts player and world saves before restart
Use cases
- Daily or weekly automated maintenance restarts on a fixed schedule
- One-off manual restarts for hotfixes, plugin reloads, or emergency maintenance
- Network-wide synchronized restarts using a shared timezone configuration
- Running pre-restart commands (backups, save-all, broadcasts, kicks, webhook triggers) before every restart
- Showing countdown warnings through any combination of chat, title, boss bar, and sound
Pre-restart commands — flexible by design
ZRestart doesn't hardcode behaviors like kicking players or skipping empty restarts. The pre-restart commands section lets you run any console commands in sequence before the restart fires:
pre-restart-commands:
enabled: true
failure-behavior: CONTINUE
commands:
- "save-all"
- "kick @a Server restarting"
- "broadcast See you in 30 seconds!"
Set failure-behavior: ABORT to cancel the restart if any command fails.
Commands
/zrestart— Show help (permission:zrestart.time)/zrestart time— Show active or next scheduled restart status (permission:zrestart.time)/zrestart now <interval> [reason]— Start a manual restart countdown (permission:zrestart.admin)/zrestart delay <interval>— Delay the active countdown (permission:zrestart.admin)/zrestart stop— Cancel the active countdown (permission:zrestart.admin)/zrestart reload— Reloadconfig.ymlandmessages.yml(permission:zrestart.reload)
Permissions
zrestart.time(default:true) — Allows/zrestartand/zrestart timezrestart.admin(default:op) — Allows manual now / delay / stopzrestart.reload(default:op) — Allows config and message reload
Requirements
- Paper 26.1.2+
- Java 25+
- (Optional) PlaceholderAPI 2.12.2+ for placeholder support in player-bound messages
Installation
- Drop
ZRestart.jarinto your server'splugins/folder. - Start the server once so
config.ymlandmessages.ymlgenerate. - Confirm
spigot.ymlhas a validsettings.restart-script. - Edit
plugins/ZRestart/config.ymlfor schedules, channels, timezone, and pre-restart commands. - Edit
plugins/ZRestart/messages.ymlfor all user-facing text. - Run
/zrestart reloadafter config changes.
Scope
ZRestart is intentionally focused. It does not support:
- Spigot, Folia, Velocity, BungeeCord, or any proxy software
- Minecraft versions older than 26.x
- A ZRestart PlaceholderAPI expansion (it consumes placeholders, doesn't expose its own)
- Hardcoded player-kick or skip-empty-server logic — handled flexibly through pre-restart commands instead
Bukkit.restart() requires a properly configured settings.restart-script in spigot.yml. ZRestart will warn you on startup if this looks misconfigured.
Links & support
- Source code: https://github.com/Zenologia/ZRestart
- Issue tracker: https://github.com/Zenologia/ZRestart/issues
- BuiltByBit: https://builtbybit.com/resources/zrestart.106058/
- Author site: https://zenologiamc.com