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.

Supporting recordOpen the project recordRole, runtime, scale, and the public product surface
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.
Supporting recordOpen the suite registerEvery live module, its responsibility, and implemented surface
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
04BazaarDistributed 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

Visual authoring and content execution.

Journey separates authored content from runtime machinery. The V3 editor turns task dependencies into MoLang requirements, while the runtime handles tasks, zones, flags, timelines, groups, and encounters.

Working reconstruction · Journey editor V3

Wire the prerequisite. Inspect what ships.

These are the editor's real task objects and modes. Connect one task to another, then inspect the MoLang requirement compiled into the exported task definition.

Task graph / version 3.0
Task prerequisiteOutput → input
TASK / LINEAR

Signal survey

signal_survey
  1. 01Locate the originlocate_origin
  2. 02Record the patternrecord_pattern
2 subtasks0 rewards
TASK / SEQUENTIAL

Archive entry

archive_entry
  1. 01Decode the signaldecode_signal
  2. 02File the reportfile_report
2 subtasks0 rewards
TASK / RANDOMIZED

Field notes

field_notes
  1. 01Compare the markscompare_marks
  2. 02Trace the routetrace_route
  3. 03Test a theorytest_theory
3 subtasks0 rewards
Choose an output handle, then an input handle.

Working reconstruction · Blockly generator

Assemble the blocks. Read the exact output.

The production authoring tool turns typed blocks into MoLang text. This reduced bench keeps that boundary: no invented evaluator, test context, or pretend runtime.

SOURCE BLOCKS
Player queries4
  • Player has flag
  • Player completed task
  • Player completed subtask
  • Player level
Logic4
  • AND
  • OR
  • NOT
  • Boolean
Actions6
  • Tell player message
  • Execute command
  • Start task
  • Add / remove flag
  • Give / remove item
  • Launch timeline
Control flow5
  • If / then / else
  • For each
  • Repeat
  • Return
  • Break / continue
Variables7
  • Set variable
  • Get variable
  • Query variable
  • Temp variable
  • Context variable
  • Entity variable
  • Array access
Math4
  • Compare
  • Math operation
  • Math function
  • Number
Text1
  • Text string
AND
PLAYER HAS FLAG
COMPARE
PLAYER LEVEL
Supporting recordInspect the authoring runtimeExecution path, exported task shape, authoring objects, and public references
RuntimeContent execution pathDocumented implementation
INPUTApplication eventpublished event hooks
GUARDMoLang filterevent payload + queries
RULESubtask modellinear · sequential · randomized
STATEProgress scopepersonal · party · global
OUTPUTActionreward · flag · timeline · script
Authoring / V3 task export excerpt
{
  "name": "archive_entry",
  "display_name": "Archive entry",
  "sequential": "SEQUENTIAL",
  "start_requirement":
    "q.player.has_completed_task('journey:signal_survey')",
  "subtasks": [{
    "id": "decode_signal",
    "event": "INTERACTION",
    "filter": "1.0",
    "target": 1
  }],
  "rewards": []
}

Reduced from the editor's exported task definition. The incoming graph edge supplies the start requirement.

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.

Working reconstruction · Event projections

Move the market. Watch every read model follow.

Commands append domain events; projectors update listings and each player's collection. Freeze the market, trigger the anti-snipe window, or redeliver a settlement to test its real guards.

ACTIVE LISTINGS1
BUY ORDERS3
MARKET STATELIVE
AUCTION / A-2048OPEN

Gilded field kit

Anonymous seller · quantity 1

Current bid
1,200
Bidder
Rook
Bids
1
Expires in
01:20
Projection ready. The lot is inside the two-minute anti-snipe window.
PERSONAL HUBCollection
CURRENCY REFUNDPrevious bid · 1,000
Supporting recordInspect the market surfacesBrowser routes, transaction flow, event contract, controls, and public references

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

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. 02Append the listing event to the durable stream
  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

Projected web events

{ type: "listing.bid", listingId, bidderId, amount }
LISTING STREAMlisting.created · listing.bid · listing.sold · listing.cancelled · listing.expired
PLAYER STREAMoutbid · auction.won · collection.claimed
DELIVERY RULEWebSocket failures cannot stop the event projection pipeline

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 search and live-match state.

Frontier validates queue entry, searches with two independently expanding rating windows, allocates a finite arena, and carries the resulting match through countdown, preview, active play, conclusion, and cleanup.

Working reconstruction · Queue manager

A match only exists when both windows overlap.

Each queued player gets a separate search expansion: ten rating points per second, capped at five hundred. The queue accepts the pair only when the rating distance fits inside both windows.

PLAYER A
PLAYER B
POLICY
A1260B1390
0750150022503000
A admits BYES±180
Rating distance130snapshot points
B admits ANO±90
QUEUE DECISIONStill searching

A's window admits B, but B's window is still 40 points short.

Order
A considered first · longest waiting
Same-IP gate
Clear
Result multiplier
1.0 · first meeting
Supporting recordInspect the queue and match recordState machine, design decisions, configuration surfaces, and public reference
Player flowRanked-match state machineDocumented implementation
ENTRYTeam validationformat · clauses · bans · eligibility
QUEUESnapshot ratingoldest waiting entry first
SEARCHMutual windowsboth ranges must admit the pair
RESOURCEArena allocationreserve · transfer · prepare
PREPARECountdown + previewteleport · team preview · timeout
ACTIVELive matchtimers · suspend · reconnect
CONCLUDEResultGlicko-2 · history · anti-boost multiplier
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

Require mutual overlap

Each player's window expands at its own rate. A wide window on one side cannot force the other player into a match.

DECISION 03

Reserve queue membership early

The queue marks a player before asynchronous rating loading, preventing a second join from racing the first.

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

Supporting recordInspect implementation and releaseDeliverables, maintenance loop, verification, and operator surface
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