Skip to content

Web Dashboard

The Bazaar dashboard is a React single-page app bundled directly inside the mod. It talks to an HTTP and WebSocket server embedded in the jar, so there is no separate deploy step: enable it in config/bazaar/config.conf and expose the right ports.

In config/bazaar/config.conf:

role = "ORCHESTRATOR"
web {
enabled = true
port = 8080
publicBaseUrl = "https://bazaar.example.com"
jwtSecret = "change-me-to-a-long-random-string"
corsOrigins = [ "https://bazaar.example.com" ]
linkCodeExpirySeconds = 300
}

Notes:

  • Leave publicBaseUrl = "" if you only need local or browser-relative access.
  • Set publicBaseUrl when external systems need Bazaar-hosted asset URLs, such as Discord webhook embeds for item icons.
  • For a same-origin deployment, corsOrigins = [] is fine.

The dashboard listens on:

  • port for HTTP
  • port + 1 for WebSocket

Point your reverse proxy at both. Example nginx:

location / {
proxy_pass http://127.0.0.1:8080;
}
location /ws {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
  1. Player runs /bazaar link in game.
  2. Server returns a one-time code.
  3. Player enters it on the dashboard login screen.
  4. Dashboard exchanges the code for a JWT via POST /api/v1/auth/link.
  5. All subsequent requests carry the JWT in Authorization: Bearer ....

Permissions are re-checked every request, so revoking bazaar.admin in game revokes admin UI access on the next API call.

RouteWhat it shows
/Personal hub, discovery feed, trending items, recent activity.
/gtsGTS browse with filters, sort, and pagination.
/ahAuction House browse with channel selection.
/ah/:channelIdSpecific AH channel view.
/listings/:idListing detail with history and similar listings.
/analyticsMarket-wide trends, price history, leaderboards, distributions.
/profileYour own listings, orders, collection, and transaction history.
/profile/:uuidPublic player profile.
/adminAdmin panel for users with bazaar.admin.

The dashboard subscribes to a WebSocket after login. Market events, notifications, and admin alerts update in near real time. If the socket drops, the dashboard retries and can fall back to polling.

Bazaar’s web UI resolves render assets from the live server environment instead of shipping a fixed Pokemon snapshot.

  • item-rendering.conf covers item icons and item-model discovery.
  • pokemon-rendering.conf covers Cobblemon-style Bedrock Pokemon assets: resolver JSON, poser JSON, model JSON, animation JSON, and textures.

pokemon-rendering.conf scans:

  • modScanDirs for mod jars and extracted resources
  • resourcePackDirs for extracted pack roots containing assets/
  • resourcePackArchives for .zip or .jar packs scanned directly

This is what lets the dashboard render standard Cobblemon models, custom skin variants, layered emissives, animated overlays, and seasonal or server-specific resolver trees.

If you’re modifying the web UI itself:

Terminal window
cd web
npm install
npm run dev

Vite proxies /api/* to http://localhost:8080, so point it at a running Bazaar instance. For theme-only changes, you usually do not need dev mode: edit config/bazaar/themes/ or web-theme.conf and run /bazaar admin theme reload.

  • Dashboard loads but API requests 401. JWT expired or jwtSecret changed. Log in again.
  • WebSocket fails to connect. The reverse proxy is not forwarding Upgrade headers, or port + 1 is blocked.
  • Discord webhook embeds cannot fetch Bazaar-hosted images. Set web.publicBaseUrl to the public URL clients can reach.
  • Pokemon models or custom skins do not render on the dashboard. Check pokemon-rendering.conf and make sure the configured pack roots or archives contain the real assets/<namespace>/bedrock/pokemon/... and assets/<namespace>/textures/pokemon/... trees. Restart after editing.
  • Admin panel says “Forbidden”. The user does not have bazaar.admin.