# ServerDoctor v0.9.2
Two new analysis scanners — plugin compatibility assessment and historical **performance
regression** detection — both running automatically on Paper/Folia, Velocity and BungeeCord.
##Added
### Compatibility scanner
- NewCompatibilityScanner(core) that assesses each plugin against the running server and
aggregates the signals into a transparent 0–100 risk score.
- Runtime signals (no network): declaredapi-versionvs. the server's Minecraft version
(Paper/Folia), whether Folia support can be confirmed, and enabled state.
- Optional external metadata feed (compatibility.metadata, off by default) adds release
age, a Folia yes/no flag and known incompatibilities — honest by design: this data comes from
a feed you/the community maintain, never fabricated.
- Score → severity:
<15OK ·15–39LOW ·40–69MEDIUM ·70–89HIGH ·≥90CRITICAL.- Runs on all platforms; on proxies the Minecraft-version/Folia signals are skipped.
PluginInfogained anapiVersionfield (populated by the Paper adapter from plugin.yml).
### Historical regression detection
- NewRegressionScanner(core) that compares the older half of stored performance snapshots
against the newer half to detect gradual regressions in TPS, MSPT and RAM — catching
slow decline over days/weeks, not just spikes.
- Uses only data already persisted, via an injectedPerformanceHistory
(limit -> storage.performance().recent(limit)).
needs ≥8 stored samples. Example finding:
- Runs on all platforms; on proxies TPS/MSPT (NaN) are skipped while RAM is still compared.
- Thresholds: TPS drop ≥8 %, MSPT rise ≥25 %, RAM rise ≥30 % (with HIGH/CRITICAL tiers);
Performance regression vs baseline: TPS 19.8 -> 18.4 (-7%); MSPT 14.0ms -> 23.0ms (+64%).
Both scanners surface in/serverdoctor report, the GUI, the REST/reportendpoint and
webhooks (which fire on state change, so a persisting issue isn't spammed).
##Changed
-ServerDoctorCore.bootstrapnow accepts a singleScannerSourcesobject bundling the optional
advisory, compatibility and performance-history sources. The previous overloads
(bootstrap(platform),…, AdvisorySource,…, AdvisorySource, CompatibilityMetadataSource)
are kept and delegate to it — no caller is forced to change.
-PluginInfogained a 7th componentapiVersion; the prior 6-argument constructor is retained
(delegates with an empty api-version), so existing adapters, tests and the REST serializer
compile unchanged.
##Setup (new optional config)
Regression detection needs no config — it works onceYAML:compatibility: metadata: enabled: false feed-url: "" # HTTPS feed (see compatibility.sample.txt) refresh-minutes: 1440PerformanceHistoryis wired into
bootstrap(one line per platform; storage must be opened before bootstrap). Both scanners are
registered automatically; unwired optional sources simply stay quiet.
Full Changelog: https://github.com/Shvquu/server-doctor/compare/v0.9.0...v0.9.2
## 0.9.0 - 2026-06-18
### Added
- BungeeCord support: newserverdoctor-bungeecordproxy adapter (HAS_PLUGINS + IS_PROXY).
The same universal jar now runs on Paper/Folia, Velocity and BungeeCord (plugin.yml +
velocity-plugin.json + bungee.yml side by side), with full storage-backend selection.
- In-game GUI (/serverdoctor gui) for Paper/Folia: status overview plus Performance,
Conflicts, Security, Recommendations and History screens, with a Refresh button.
Folia-safe; read-only.
- Configurable automated scan (Paper/Folia) viatasks.scan
(enabled,interval-seconds,initial-delay-seconds,warn-on-high).
- Security advisory source (all platforms, off by default):AdvisorySource+
RemoteAdvisorySourcechecking installed plugins against a real, external feed
(security.advisory). Never invents advisories.
-guiandsecurity.advisoryconfig sections.
### Changed
- REST API and webhooks are now available on BungeeCord too (previously Paper/Velocity only);
all three platform mains wire storage, advisory, REST and webhooks consistently.
unchanged.
- The hard-coded 5-minute background scan (Paper) is now config-driven.
ServerDoctorCore.bootstrapgained anAdvisorySourceoverload;bootstrap(platform)is
### Fixed
- BungeeCord now writes its defaultconfig.ymlandmessages.ymlon first start
(class-relative resource loading).
- Configurable scan interval clamped to a sane minimum (10 s).
Full Changelog: https://github.com/Shvquu/server-doctor/compare/v0.8.0...v0.9.0
# ServerDoctor v0.8.1 - 0c07127
An in-game GUI and configurable automation for Paper/Folia.
##Added
- In-game GUI — open with/serverdoctor gui(alias/sd gui). A read-only menu with a
status overview plus screens for Performance, Conflicts, Security,
Recommendations and History, and a Refresh button that re-runs the analysis.
- Folia-safe by design — screens open and rebuild on the player's entity scheduler, and
Refresh runs the analysis on the async scheduler. Clicks are routed via anInventoryHolder
and always cancelled (nothing in the server is ever modified).
- Configurable automated scan inconfig.ymlundertasks.scan
(enabled,interval-seconds,initial-delay-seconds,warn-on-high) — e.g. run a full
analysis every 120 seconds.
-guiconfig section (enabled,title).
##Changed
- The previously hard-coded 5-minute background scan is now driven byconfig.yml. Defaults
preserve the old behaviour; set your own interval (minimum 10 seconds).
##Fixed
- The scan interval is clamped to a sane minimum so a misconfiguration can't hammer the server.
- Various stability and performance improvements.
##Setup
Open it in-game withYAML:gui: enabled: true title: "ServerDoctor" tasks: scan: enabled: true interval-seconds: 120 initial-delay-seconds: 30 warn-on-high: true/serverdoctor gui(permissionserverdoctor.admin). The GUI is
Paper/Folia only.
Full Changelog: https://github.com/Shvquu/server-doctor/compare/v0.8.0...0c07127
