Work
PlayerPicked Stats
Anonymous plugin telemetry, end to end — a Java client library for Paper and Velocity, a gzip ingest API and live dashboards.
- Role
- Architecture & fullstack · Flucite
- Year
- 2026
- Type
- Telemetry
- Stack
- Java 21 · Next.js · TypeScript · PostgreSQL · Drizzle

Overview
A telemetry pipeline for Minecraft plugins, from the JVM on the game server to the browser: a client library that authors shade into their plugin, an ingest endpoint that survives a public API key, and dashboards that aggregate the reports into servers, players, versions and countries.
Client library — Pickly
A Gradle multi-module build: a platform-agnostic core with PaperPlatform and VelocityPlatform adapters. The core snapshots server and system state, serialises it with a dependency-free JSON writer and posts it every 30 minutes over java.net.http.HttpClient with GZIPOutputStream, redirects disabled. Custom metrics (number, text, counts and nested counts) plug into a data registry, and a RelocationGuard fails fast if an author forgets to relocate the shaded package — preventing classpath clashes between plugins.
Ingest API
POST /api/v1/submit on the Node runtime. The body is capped at 64 KB compressed and decompressed with a 256 KB maxOutputLength, so a gzip bomb cannot exhaust memory. Reports are schema-validated, resolved to a plugin by key and rejected with 429 + Retry-After when the same server reports within 20 minutes or one address registers too many servers per plugin per day. Successful reports answer 202 Accepted.
Privacy by design
The plugin key ships inside every public jar, so abuse protection is built into the data model: per-server and per-address rate limits, and the caller address stored only as a daily-rotating hash that is purged after two days. No IPs, player names or chat are ever persisted; country is derived at the edge. Server owners can opt out with a single config line.
Dashboards & stats card
Next.js App Router with Drizzle ORM on PostgreSQL. Each plugin gets 24h / 7d / 30d / all-time series, breakdowns by Minecraft version, server software, Java version, plugin version and online mode, plus a WebGL globe (cobe). Authors design an 800×300 card in a live editor; it is rendered server-side as SVG and refreshed every 30 minutes, so the embed on Spigot, BuiltByBit or GitHub (Markdown, HTML or BBCode) is always current. Auth is shared with playerpicked.com through Auth.js.


