Skip to content

← All projects

2016 → 2017 Architect & backend developer

Endariel — distributed foundations of a Minecraft network, at Vidcraft

The founding SDK of the Vidcraft Minecraft ecosystem: 2,133 commits over 11 months, 150+ Java classes under `fr.endariel`, a typed Redis pub/sub bus and direct NMS access laid down in 2016 when BungeeCord was still just a TCP proxy. This is the trunk that becomes Unitale in 2019.

  • Java 8
  • Spigot 1.10.2 (unispigot-server fork)
  • BungeeCord
  • Jedis 2.8
  • Apache HttpClient
  • Socket.io
  • Redis pub/sub
  • Netty
  • NMS reverse engineering
  • Multi-module Maven
  • Distributed systems

Context

In 2016, the French Minecraft scene was watching Mineplex and Hypixel and wondering how to run a multi-mode network for tens of thousands of players without a bespoke monolithic cluster. Vidcraft, the studio behind Endariel, wanted to play in that league: multiple game modes, a shared economy, players hopping between servers without losing their identity. At peak the network reached 100,000+ unique players and sustained 10,000+ concurrent connections across 50+ interconnected Spigot instances.

The catch: Mojang never designed the server for this. The protocol, the engine, the player state — everything is single-instance by design. And Kubernetes in 2016 was still niche — there was no off-the-shelf orchestrator for this kind of load on the Bukkit JVM. You had to lay the distributed foundations yourself.

My role

I designed and shipped the SDK that orchestrated the ecosystem — the Java foundation every game mode plugged into. Distributed architecture, reverse engineering of the official Minecraft server, inter-instance sync bus, BungeeCord integration: that scope was mine.

The central mission at Vidcraft was exactly that: build a proprietary SDK for mini-games. The fr.endariel trunk was born in that context, not after — LaserGame, first commit on November 21, 2016, is the first mini-game to run on it.

What I built

The SDK — fr.endariel namespace, 2,133 commits over 11 months

The first SDK commit lands on July 14, 2016: 138 files at once, migrating the project from its “IceCube” codename to “Endariel” the same day. Eleven months later, by late May 2017, the Java trunk counts 150+ classes across two main trees.

fr.endariel.api.* holds the distributed layer:

  • 11+ typed Redis subscribers deriving from a SubJedisPubSub abstraction — CommunPubSub, SDKPubSub, ServerPlayersPubSub, PlayerEliminatedSubscriber, ServerStatusSubscriber, etc. No blind string broadcasts: every domain has its own typed subscription class that dispatches to the right handlers.
  • 14+ REST clients for cross-instance operations that can tolerate some latency: Bag, Boost, Contact, Feature, Guild, Money, News, Player, Properties, Sanction, SearchPlayer, Session…
  • Dedicated Redis clients for the hot path: Feature, Modo, Party, Player, Sanction, Server, Settings.

fr.endariel.sdk.* holds the gameplay core:

  • PlayersEndCraftPlayer, EndPlayer, PlayerInflator (lazy-loading player data from Redis and REST), PlayerContainer, SettingsHandler, EndCraftOfflinePlayer.
  • MorphsMorphAPI, MorphManager, MorphPacketHandler, NettyManager: low-level Netty access to inject morph packets without depending on ProtocolLib.
  • Social and economic features: guilds, parties, groups, gadgets, mounts, pets, loot boxes, inventory bags, custom BossBars.
  • Aura — ten or so composable visual effects: AngelAura, CloudAura, DrinkAura, ExplosionsAura, HelicopterAura, HellAura, MultiColorRingAura, RainAura, ScannerAura, TailAura.
  • Distributed chat via ChatPubSub Redis for cross-instance broadcast.
  • Custom advancement API making 1.12+ semantics work while staying anchored on the 1.10.2 server.
  • Versioned PVP with separate listeners for 1.8 and 1.10, because hitboxes and combat packets shift between versions.

The 2016–2017 stack

Multi-module Maven, Eclipse compiler via plexus-compiler-eclipse, packaging through Maven Shade. Server-side, an in-house unispigot-server fork off Spigot 1.10.2-R0.1-SNAPSHOT, shipped through a private Nexus on git.endariel.fr. Redis hit through Jedis 2.8.1 + Apache commons-pool2 for connection pooling. Apache HttpClient 4.1.1 for REST. Socket.io 0.8.3 (Java client) for real-time broadcasts to internal tooling. org.json for serialization. No Redisson, no Hazelcast, no ORM, no MariaDB plugged directly into the SDK: Redis-first, REST for the rest. That was the reasonable distributed stack on the Bukkit JVM in 2016.

The first mini-games

  • LaserGame, first commit on November 21, 2016 — five months after the SDK, the first mini-game ships and validates the trunk holds.
  • Arena, short-lived prototype started on May 6, 2017.
  • GameSDK2, the game-engine rewrite kicked off on May 29, 2017 — the piece that survives and grows under Unitale from 2019 on.

The hard part

Real-time cross-server state sync, in 2016, with no modern orchestrator. Back then, Mineplex and Hypixel ran on monolithic clusters with bespoke middleware; BungeeCord was a TCP proxy that did little beyond routing. Endariel’s bet, written into the very first SDK lines, was a Redis pub/sub dispatch typed in domain-specific classes (CommunPubSub, SDKPubSub, ServerPlayersPubSub…) rather than raw strings parsed in a giant switch. It’s an architectural choice that hurts in 2016 — you write the serialization by hand, manage schema versions, annotate every new channel — but it’s what makes sub-second player hop, coherent economy, and cross-instance anti-cheat possible.

The other side of the hard part: morphs and custom inventories without ProtocolLib. Most plugins at the time delegated to ProtocolLib for packet interception; that ate CPU on the hot path and created a heavy dependency on an external project with unpredictable release cycles. I took the lower road: reverse engineering NMS CraftBukkit, mapping undocumented entities and packets, and direct Netty access through NettyManager and MorphPacketHandler. Faster, more autonomous, and compatible with 1.8 / 1.10 / 1.12+ multi-version through a ReflectionManager that rewires the right internals per target version.

Results

  • 100,000+ unique players served over the lifetime of the Vidcraft network.
  • 10,000+ concurrent connections at peak, with no client-visible degradation.
  • 50+ Spigot instances orchestrated as one coherent network through the typed Redis pub/sub bus.
  • 2,133 commits under the fr.endariel namespace over 11 months (July 2016 → May 2017), 94% of the Java trunk before 2018 — the distributed foundation was laid fast and held tight.

And the sequel, which is no secret: that Java trunk didn’t die when Vidcraft shut down in late 2017, it was picked back up. From 2019 on, the fr.endariel namespace migrates to fr.unitale, then fr.hycube, with a modernized stack — Redisson for the transient layer, Hazelcast explored for shared caches, Symfony 3.3 backend lifted out of the Java monolith in 2020. The Unitale case study tells that second life. Endariel is that trunk in its original form.

This mission is also the launchpad for what came next: TyphoonMC — a Minecraft server engine written from scratch in Go (90+ OSS stars) — then the scale problems at Dofus Touch (millions of players), the SaaS operations at Authlete (Japanese banks, OAuth/OIDC), and now the technical leadership at Conexia Tahiti. Same craft — pub/sub, coherent cache, clean lifecycle, resilience — different scales.