Systems & Game Server Developer · Syria
Minecraft server architecture — Paper/Spigot internals, tick-budget engineering, and proxy networks that stay up under load.
Every decision below traces back to one number: a Minecraft tick has a 50ms budget. Exceed it and TPS drops; players feel it immediately.
The main thread ticks the world. Anything else on it is stolen budget. SQL queries, HTTP calls and file I/O belong on a worker, with results handed back through an immutable snapshot.
In practice: an economy lookup inside a command handler costs 15-40ms per call at scale. Held in memory with batched write-behind persistence, it costs zero.
The JVM reclaims garbage cheaply; it pauses to do it. A per-tick allocation in a hot loop becomes a GC pause, and a GC pause longer than 50ms is a dropped tick.
So: reuse buffers, iterate without creating collections, and pin Xms to Xmx
so the collector is not re-tuning region sizes on a live server.
Static limits punish players during quiet hours and still fail during peak. Measure MSPT and throttle proportionally — when the server is healthy, a well-written optimiser should do nothing at all.
view-distance and simulation-distance became separate settings in 1.18 for a
reason. Entity AI, redstone and block ticks scale with simulation distance;
perception scales with view distance. Dropping simulation from 10 to 6 cuts
simulated volume ~60% and is almost never noticed.
Plugin messaging tunnels through a player connection: it cannot reach an empty backend and dies when the last player leaves. A Redis-backed bus lets any node publish at any time — with the honest caveat that Pub/Sub is not durable, so nothing that must survive a restart goes over it.
Plugins — Paper 1.20+, Java 21
| Repository | Architecture |
|---|---|
| hyper-economy-bridge | In-memory ledger with batched write-behind flush. long minor units (never double), atomic map.compute() mutation, Redis for invalidation only. Zero main-thread I/O on reads. |
| sentinel-guard-anticheat-heuristics | Movement and combat telemetry with latency + MSPT compensation. Collects evidence and decays violations; deliberately does not punish. |
| aether-dynamic-spawners | Closed-loop spawner throttling on a rolling MSPT window. Loaded chunks only, bounded work per pass, vanilla timings restored on disable. |
| nexus-proxy-sync | Redis Pub/Sub bus for Velocity backends. Self-message filtering, stale-message rejection, exponential reconnect backoff. |
| void-drop-cleaner | Merges ground stacks by full metadata before removing anything. 4,200 drops → 71 entities with zero items destroyed. |
| celestial-combat-tag | Combat logging treated as a design problem: a disconnect cannot be refused, so the penalty applies the outcome instead. |
| chronos-daily-rewards | Day boundaries resolved via ZoneId, not millis / 86_400_000. DST-safe, offline UUID lookup. |
Infrastructure & tooling
| Repository | Architecture |
|---|---|
| paper-purpur-optimized-stack | Config set for 100+ players at 20 TPS. Only non-default keys, each with its reasoning stated inline. |
| aikars-flags-tuner | Computes heap headroom and selects G1 vs generational ZGC by size. Warns at the compressed-oops boundary. Hardened systemd units with RCON-based graceful stop. |
| spigot-metric-exporter | Prometheus exporter, ~20KB, no client library. Main thread samples into an immutable record; the HTTP thread never touches the Bukkit API. |
| mc-backup-daemon | save-off → flush → archive → save-on, with save-on in a finally block. Restore verified byte-exact by checksum. Zero dependencies. |
| velocity-edge-network-template | Modern forwarding, Geyser/Floodgate bridging, and the nftables policy that keeps backend ports unreachable. |
| luckperms-matrix-preset | Donor and staff as orthogonal tracks, banded weights, per-server contextual nodes. |
| prison-rankup-eco-preset | Cost curve matched to the income curve so time-per-rank stays constant A→Z. No compounding multipliers. |
| skyblock-island-schematics-pack | Grid spacing, deny-by-default WorldGuard policy, async sliced island generation. |
| mc-portfolio-provisioner | The provisioning script behind these repositories. Public-only by construction, aborts rather than touch a private repo, token never written to .git/config. |
No CI badges here, and that is intentional: GitHub-hosted runners are
unavailable on this account — a workflow whose only job was echo hello still
failed to start. A permanently red ✗ would imply broken code, so each project
carries a verify.sh that builds, tests, and asserts instead.
git clone https://github.com/vndel/hyper-economy-bridge && cd hyper-economy-bridge
./verify.sh # mvn verify, then assert the jar is Java 21 bytecodehyper-economy-bridge 15 tests · spigot-metric-exporter 8 · chronos-daily-rewards 7
· mc-backup-daemon 15 plus a restore proven byte-exact by diff -r.
| Layer | Tools |
|---|---|
| Server platforms | Paper · Purpur · Spigot · Velocity · Geyser/Floodgate |
| Languages | Java 17/21 · Kotlin · Lua · TypeScript · Bash · Python |
| Build | Maven · Gradle (Kotlin DSL) · maven-shade with relocation |
| Data | MySQL/MariaDB · SQLite (WAL) · Redis · HikariCP |
| Ops | Linux · systemd · Docker · nftables · Prometheus · RCON |
| JVM | G1GC · Generational ZGC · heap sizing · GC log analysis |