Create Cobblemon Mods with AI

No coding required. Generate Fabric and Cobblemon mods through natural language, test quickly, and iterate.

Build Now

Showcase Overview

Showcase Sync Pipeline

Showcase syncs Pokemon data from your Minecraft server to web endpoints. The frontend is only a renderer over synced player data.

How It Works In The Mod

1

Service Startup

ShowcaseService starts during mod initialization.

2

Enable Check

Sync starts only when showcase.isShowcaseEnabled is true and apiSecret is valid.

3

Sync Interval

The task runs every max(syncIntervalMinutes, 1) minutes.

4

Login And Logout

Additional syncs run on login after 10 seconds and on logout.

5

Visibility Toggle

Players toggle visibility with /showcase on and /showcase off.

Config Fields

From your server showcase config JSON

  • showcase.isShowcaseEnabled (bool)
  • showcase.apiSecret (string)
  • showcase.syncIntervalMinutes (int, minimum effective value: 1)
  • showcase.debug (bool)

Page Layers

  1. Server showcase landing page
  2. Player list with search and filtering
  3. Player detail page with party and PC boxes
  4. Pokemon cards with sprite, nature, type, moves, and optional stats

API Contract Sent By The Mod

Base URL: https://your-domain.com/api

POST /api/sync

  • Authorization: Base64(apiSecret) (not Bearer)
  • Content-Type: application/json (payload is compressed base64 text)
  • Body: Base64 string of zlib-deflated JSON
{
  "players": [
    {
      "uuid": "player-uuid",
      "name": "PlayerName",
      "party": [null, {}, {}, null, {}, {}],
      "pc": [[null, {}, "... 30 slots"], "... boxes"],
      "lastUpdated": 1730000000000
    }
  ]
}

Pokemon data contains Cobblemon save JSON plus extra fields like Nature, DexNumber, Ability, FormName, Type1 and Type2, and MoveSet entries.

POST /api/player

  • Authorization: Base64(apiSecret)
  • Content-Type: application/json
{
  "uuid": "player-uuid",
  "showcaseEnabled": true
}

Option A: UI-Only Duplicate

  1. Rebuild layout and components with mock data.
  2. Keep rendering logic isolated from backend assumptions.
  3. Connect to your own read API later.

Option B: Full Compatible Clone

  1. Implement write endpoints: /api/sync and /api/player.
  2. Decode sync payload as raw text, then base64 decode and zlib inflate.
  3. Validate decoded authorization secret.
  4. Store by (serverId, playerUuid).
  5. Persist showcaseEnabled and expose read endpoints.

Included Starter Endpoints

POST /api/showcase/sync POST /api/showcase/player GET /api/public/servers GET /api/public/players?server=<serverId> GET /api/public/player/:uuid?server=<serverId>

Starter pages: / and /player.html

Switch To challenged-gamers.com

  1. Set SITE_URL=https://challenged-gamers.com in .env.
  2. Set CORS_ORIGIN=https://challenged-gamers.com.
  3. Set SHOWCASE_API_PREFIX=/api/showcase.
  4. Set your secret in SHOWCASE_SECRETS.
  5. Set mod config showcase.apiBaseUrl to https://challenged-gamers.com/api/showcase.
  6. Restart server and web app.
{
  "showcase": {
    "apiBaseUrl": "https://challenged-gamers.com/api/showcase"
  }
}

Node/Express Decode Example

import express from "express";
import zlib from "node:zlib";

const app = express();

app.post("/api/sync", express.text({ type: "*/*", limit: "20mb" }), (req, res) => {
  const encoded = req.body;
  const compressed = Buffer.from(encoded, "base64");
  const inflated = zlib.inflateSync(compressed).toString("utf8");
  const payload = JSON.parse(inflated);

  // TODO: validate auth header and upsert payload.players
  res.status(200).json({ ok: true, players: payload.players?.length ?? 0 });
});

Notes And Pitfalls