Selected work

Independent project · Active

Matcha! Suite

Thirteen modular server products covering competition, progression, delivery, commerce, player movement, and live systems. Briar designed, built, documented, and released the suite.

My role
Product design, systems, code, interface, identity, documentation, tools, and releases
Runtime
Server-side JVM modules · exact dependencies vary by product
Project scale
13 live modules · hundreds of documentation pages · 19 browser authoring tools
Web platform
Product site · documentation · authoring tools · services · dashboard · release infrastructure
Journey browser authoring tool with three task nodes
SUITE / LIVE13 modules

Competition · progression · delivery · commerce · movement · live systems

PUBLIC SURFACE19 browser tools

Product site · documentation · services · dashboard · release infrastructure

Visual authoring tool · suite register · public surfaceDesign and implementation by Briar Hunt

About this case study. The diagrams condense documented implementations and behaviour into a readable overview. Links beside each selected system open the corresponding documentation. Planned and concept-stage modules are not included in the live-module count.

Overview · The suite

Thirteen products, one suite.

Each product owns one server responsibility and has its own installation path. Shared services appear where coordination is necessary, but operators do not have to deploy the suite as one application.

ArchitectureRuntime cross-sectionHow the products fit together
PLAYER commands · interfaces · game actionsSERVER game events · battle events · timersOPERATOR HOCON / JSON · datapacks · browser tools
COMPETEFrontierPROGRESSJourneyDELIVERCourierTRANSACTBazaarMOVE STATELink CableEXTEND8 focused modules
Local runtime server process · module-owned rulesShared services where required Ceremony · MongoDB · RedisOperational surface permissions · commands · validation · audit · recovery
PLAYER STATEMARKET VALUEPROGRESSIONMATCH HISTORYOPERATOR SIGNAL
  1. 01Module boundaries follow server responsibilities, not pages in one shared user interface.
  2. 02Ceremony supplies selected shared persistence and service components; requirements are declared per install guide.
  3. 03MongoDB and Redis appear only where durable or distributed state requires them.
  4. 04Configuration, permissions, diagnostics, and recovery are part of every product.
Live modules / public snapshot, 14 July 2026
IDModuleOwned responsibilityImplemented surface
01FrontierRanked battle systemQueues, formats, ratings, arenas, seasons, tournaments, replays
02JourneyQuest and progression runtimeTasks, parties, zones, flags, timelines, encounters, scripts
03CourierMail and reward deliveryMessages, durable packages, offline delivery, claim recovery
04BazaarCreature and item marketListings, auctions, buy orders, collections, browser market
05Link CableCross-server player stateOwnership, six state lanes, handoff, backups, restore
06Smart TrainersNPC battle AIReusable move, switch, item, doubles, and gimmick policies
07BloomTargeted spawn luresPlaced area effects for type, species, form, shiny, and ability odds
08OutbreaksTimed spawn eventsConfigured pools, alerts, distance, progress, limits, rewards
09VentureCreature jobsEligibility, timed work, persisted assignment, result and return
10AlchemyItem migrationData-driven conditions, transformations, preservation, cleanup
11WonderQueued WonderTradeChannels, eligibility, matching, fallback pools, delayed claims
12ShowdownActionsCustom battle effectsData-defined forms, buffs, status, weather, and terrain
13MoLang ExtensionsExpanded scriptingFunctions, conditionals, loops, structs, and imports

Selected system · Journey

Event-driven content execution.

Journey separates content data from runtime machinery. Authors define tasks, zones, flags, timelines, buffs, parties, and encounters; the server translates game events into scoped progression state.

RuntimeContent execution pathDocumented implementation
INPUTGame event140+ published event hooks
GUARDMoLang filterevent payload + queries
RULESubtask modellinear · sequential · randomized
STATEProgress scopepersonal · party · global
OUTPUTActionreward · flag · timeline · script

Working excerpt · Sanitised runtime model

Author → event → state

Move the nodes without changing the logic, inspect their definitions, then send a representative event through the graph.

Authoring / Shortened task definition
{
  "id": "field_survey",
  "sequential": "sequential",
  "party_shared": true,
  "tasks": [{
    "event": "SUBJECT_CAPTURED",
    "filter": "q.subject.species.identifier == 'example:species'",
    "target": 5
  }]
}

Illustrative reduction of the public task schema. Domain identifiers are generalised; presentation fields and rewards are omitted.

Authoring objects

Tasks
Requirements, repeat rules, subtasks, filters, targets, and completion actions
Zones
Named world areas usable by events, visibility, encounters, and scripts
Flags
Persistent conditions for world and story state
Timelines
Ordered presentation and action sequences
Encounters
Private or group-scoped authored scenes and battles
Scripts
GraalJS runtime for behaviour outside the declarative task model

Declarative path

JSON task and content files cover repeatable progression without requiring a new compiled module for each questline.

Imperative path

Scripts subscribe to game events and execute bounded custom behaviour when the data model is not enough.

Iteration path

Hot reload, in-game editors, generated references, and browser authoring tools shorten the path from authoring to testing.

Selected system · Bazaar

In-game, domain, and browser transaction surfaces.

Bazaar exposes the same market through the game, a domain and persistence layer, and an optional browser dashboard. Authentication begins in game; market and player events return over HTTP and WebSocket.

A component map of the implemented routes, filters, charts, and client behaviour. No production market data is shown.

Working excerpt · Replayed event contract

One transaction, three audiences

A fixed representative trace across the browser, market domain, and scoped subscribers. No production market data or live connection is used.

Visible scopes
01Browsertyped action02Market domainvalidate + commit03Subscribersscope + publish
ArchitectureTransaction surfacesDocumented implementation
SURFACE AIn gameGTS · auctions · buy orders · collection · admin
commands / GUI actionspermissions + rate limitsplayer identity
SURFACE BMarket domainlistings · bids · settlement · fees · history · freeze state
HTTP APIWebSocket eventsJWT
SURFACE CBrowserbrowse · buy · bid · orders · claims · stats
AUTH PATH/bazaar linkshort-lived link codePOST /api/v1/auth/linkJWT + player scope
Transaction process / Listing and settlement
  1. 01Validate player, channel, asset, limits, and price controls
  2. 02Create a durable listing with an identity key
  3. 03Expose the same listing in game and over the API
  4. 04Settle purchase, bid, expiry, cancellation, or buy-order fill
  5. 05Collect resulting assets through player-scoped durable entries
  6. 06Publish market and player events to subscribed clients

Web event contract

{ type, timestamp, payload }
PUBLIC MARKETcreated · updated · cancelled · expired · sold · bid · order filled
PLAYER SCOPEoutbid · sold · won · collection ready
ADMIN SCOPEsecurity alerts · system events

Cross-server mode

Topology
Local or orchestrator / participant roles, with Redis connecting nodes.
Compatibility
Every participating node must run the same Bazaar version.
Degraded state
Read-only behaviour preserves inspection while writes cannot be trusted.

Operator controls

Freeze
Stop market mutation without removing its history.
Reconcile
Inspect and repair differences between expected and persisted market state.
Security
Configured limits, detectors, permission gates, alerts, and audit-facing inspection.

Selected system · Frontier

Queue-to-result state machine.

Frontier turns a queue entry into a validated competitive match and result. Rating, team legality, opponent search, arena capacity, battle timing, results, and replay data are parts of one lifecycle.

Player flowRanked-match state machineDocumented implementation
ENTRYTeam validationformat · clauses · bans · eligibility
SNAPSHOTQueue stateladder · rating · team reference
SEARCHOpponent windowrating range expands with wait
RESOURCEArena allocationreserve · transfer · prepare
GATERevalidationteam checked again at battle start
ACTIVEBattleturn timer · spectating · replay capture
COMMITResultrating · history · season · anti-farm checks
DECISION 01

Snapshot rating on entry

The queue compares players against the state they entered with, not a value that can drift invisibly during the wait.

DECISION 02

Expand search over time

Match quality starts narrow; a configurable rating window expands as queue time grows.

DECISION 03

Validate twice

A legal queue entry does not guarantee a legal battle-start team. The second gate catches changed state.

DECISION 04

Allocate world capacity

Arenas are finite resources with positions, restrictions, return behaviour, and cross-server ownership.

DECISION 05

Bound the live match

Turn timing, disconnect handling, observation, and recovery prevent a competitive match from becoming indefinite.

DECISION 06

Keep match history

Result history and in-world replay let players revisit a battle after it has finished.

formats.conf rules / bans / previewclauses.conf Showdown + MoLang validationladders.conf ratings / tiersarenas.conf positions / restrictionsseasons/ schedules / rewardstournaments/ bracket definitionsconfig.conf queue / replay / anti-boost / cross-server
Public linkFrontier queue, format, arena, ladder, replay, and cross-server configuration ↗

What I made · Process · Outcome

From product code to public release.

Alongside the modules, Matcha includes the material needed to configure, inspect, update, and recover the software. The project is published through working releases, authoring tools, documentation, and operator controls.

S01 · PRODUCT SURFACE

Documentation & tools

Astro 5 · Starlight · React 19 · TypeScript · Radix UI · Tailwind

S02 · INTERACTIVE TOOLS

Visual authoring

Blockly · React Flow · Three.js · Mermaid · JSZip

S03 · SERVICES

Backend & commerce

Fastify 5 · TypeScript 5.8 · Drizzle ORM · SQLite · Discord.js · Stripe · web push

S04 · SUPPORTING APPS

Operations

React + Vite admin dashboard · Cloudflare Worker · read-only TypeScript MCP server

A01

Product code

Server modules, selected shared Ceremony services, persistence models, command and permission surfaces.

A02

Authoring formats

HOCON, JSON, datapacks, GUI definitions, tooltips, themes, scripts, and module-specific schemas.

A03

Browser tools

19 public authoring and inspection tools in the documentation site snapshot.

A04

Documentation

Hundreds of public pages covering installation, configuration, concepts, reference, examples, rollout, and recovery.

A05

Releases

Per-module files, compatibility notes, dependencies, version history, and release portal entries.

A06

Validation

Input checks, permissions, dry paths, health signals, staff inspection, backups, restore, and migration guidance.

ProcessMaintenance loopFrom definition to observation
DEFINE domain + invariantsIMPLEMENT runtime + operator pathVERIFY tests + validation checklistEXPLAIN reference + examplesRELEASE files + compatibility notesOBSERVE reports + operational signals

Public links