ServerDoctor v1.0.0 — The first house call
Read-only diagnostics, monitoring and cross-node insight for Minecraft networks — across Paper, Folia, Velocity and BungeeCord, from a single jar.
This is 1.0.0 — the first stable release. ServerDoctor has grown from a single-server TPS reader into a full network diagnostics suite that never writes to your world, never touches gameplay, and tells you the truth about what's actually going on. No fabricated demo data, no silent fallbacks, no guesswork — just honest, actionable findings.
Highlights
- One jar, four platforms — Paper, Folia, Velocity and BungeeCord all load from the same artifact.
- 11 read-only scanners — from TPS and memory to disk, JVM runtime and cross-node version drift.
- Cross-node consistency — compare server, Java and plugin versions across every node sharing a database.
- Five storage backends — In-Memory, SQLite, PostgreSQL, MariaDB and MongoDB.
- Built to observe, never to interfere — a Clean-Architecture core with build-time guards that keep every adapter strictly read-only.
Platforms
| Platform | Notes |
|----------|-------|
| Paper | Full feature set incl. in-game GUI and PlaceholderAPI hook |
| Folia | Region-aware scheduling supported |
| Velocity | Proxy-side diagnostics |
| BungeeCord | Proxy-side diagnostics |
The 11 scanners
1. Performance / TPS — tick rate and MSPT health.
2. Memory — heap usage, commitment and GC pressure.
3. Plugin conflicts — overlapping or clashing plugins.
4. Security risks — outdated, unmaintained or suspicious plugins, with an optional advisory feed.
5. Recommendations — concrete update and replacement suggestions.
6. Compatibility metadata — pluggable feed of known-incompatible combinations.
7. Historical regression — detects TPS/MSPT/RAM trending worse over your stored history.
8. Configuration review — best-practice checks for,Code:server.properties,Code:bukkit.yml,Code:spigot.ymlandCode:paper-*.yml. Checks only fire when the relevant key is actually present — no false positives on partial configs.Code:velocity.toml
9. Disk — free space and log directory size.
10. Runtime / JVM — Java version, heap sizing vs. system RAM, GC flags.
11. Cross-node consistency — version drift across every node writing to the same shared database.
Storage backends
Pick what fits your setup in:Code:config.yml
- In-Memory — zero-config, ephemeral.
- SQLite — local file, perfect for a single server.
- PostgreSQL / MariaDB — shared SQL, dialect-aware upserts.
- MongoDB — shared document store.
Cross-node tip: the cross-node scanner only sees other nodes through a shared database. On SQLite or In-Memory it stays quietly inactive (single node by design). Point several nodes at the same PostgreSQL/MariaDB/MongoDB instance — each with its own— to light it up.Code:network.node-name
Integrations & monitoring
- REST API —
,Code:/health,Code:/performance,Code:/conflicts,Code:/security,Code:/recommendations, plus a token-gatedCode:/reportendpoint in Prometheus format.Code:/metrics- Webhooks — Discord, Slack and Microsoft Teams notifications on status changes.
- Health Digest — a scheduled summary pushed to your webhook on the interval you choose.
- PlaceholderAPI — auto-registers on Paper when PlaceholderAPI is installed.
- Update checker — watches the repo and, on a new release, goes safely inert until you update.
Operator tooling
- Report export — write the latest report to disk as JSON, Markdown or HTML via
.Code:/serverdoctor export- Baselines — pin a known-good snapshot with
, thenCode:/serverdoctor baseline pinto see exactly what drifted since.Code:/serverdoctor baseline- In-game GUI — browse findings, conflicts, security and recommendations from a chest menu (Paper/Folia).
Commands
(aliasesCode:/serverdoctor,Code:/sd) —Code:/doctor,Code:scan,Code:report,Code:tps,Code:conflicts,Code:security,Code:recs,Code:history,Code:gui,Code:export,Code:baseline. All output text lives inCode:reloadand is fully customizable.Code:messages.yml
Under the hood
- Clean Architecture with ArchUnit build-breakers — the platform SDKs can never leak into the core, and every adapter stays read-only.
- Multi-module Gradle, JDK 21.
- A unified exception hierarchy (
→ configuration / API / analysis / storage), so failures surface clearly instead of crashing a scan.Code:ServerDoctorException- Resilient scanning — one failing scanner is logged and skipped; the rest of the diagnostics still run.
Credits
- [URL="https://github.com/Shvquu"]@Shvquu[/URL] — author and maintainer of ServerDoctor. Architecture, scanners, the multi-platform wiring and the relentless push for an honest, no-fake-data diagnostics tool. This release is yours.
- [URL="https://github.com/dependabot"]@dependabot[/URL] — for tirelessly keeping our dependencies current and our supply chain healthy, one tidy pull request at a time.
A 1.0.0 is never the work of one commit — thank you to everyone who tested, filed precise bug reports, and helped sand down the rough edges.
Getting started
1. DropintoCode:serverdoctor-1.0.0.jaron each Paper/Folia/Velocity/BungeeCord instance.Code:plugins/
2. Start the server once to generateandCode:config.yml.Code:messages.yml
3. (Optional) For cross-node, set a shared database and a uniqueper node.Code:network.node-name
4. Runand read the diagnosis.Code:/serverdoctor scan
Full documentation: see the [URL="https://github.com/Shvquu/server-doctor/wiki"]Wiki[/URL].
Full Changelog: https://github.com/Shvquu/server-doctor/compare/v0.9.2...v1.0.0
ServerDoctor is read-only by design. It observes, measures and advises — it never modifies your server.
# 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
