02 / Independent software product
Cadence
An end-to-end World of Warcraft combat-analytics platform: an in-game Lua addon captures encounter data, a Node/PostgreSQL backend ingests, validates and scores it, and a Next.js site surfaces rankings, player profiles, and a premium tier.
- Role
- Product owner, sole developer — addon, backend, and web
- Period
- Independent
- Technologies
- Lua · TypeScript · Node.js · Next.js · PostgreSQL
- Links
- cadencewow.com
What was actually broken
WoW's addon sandbox deliberately has no network access — an addon can compute rich combat analytics but has no sanctioned way to get them out of the game. Building a rankings platform meant solving a data-exfiltration problem inside a constrained system, then trusting nothing that arrives on the other side.
- No network APIs inside the addon sandbox — data must leave via the player
- Payloads must survive a lossy, human-mediated channel
- Submitted data is adversarial by default: rankings invite manipulation
- One developer owns product, code, infrastructure, and moderation
What I owned
- Lua addon: combat-event capture, scoring, and payload encoding in-game
- Custom QR-style encoding bridge from game frame to web ingestion
- Node backend: decoding, reporter validation, scoring, abuse handling
- PostgreSQL schema for encounters, rankings, and player profiles
- Next.js site: rankings, profiles, premium tier
- Admin abuse dashboard for the ingest side
Surface & System
Surface
From a fight to a ranked profile
A player finishes an encounter, and the addon has already scored it. Getting that result onto the web is a single deliberate act — the addon renders its encoded payload, the companion site ingests it, and seconds later the run exists as a ranked, comparable, public record.
The site is built around comparison: leaderboards, player profiles, and encounter breakdowns designed for players who want to know not just how they did, but why someone else did better. A premium tier funds the infrastructure.
- In-game capture and scoring with zero manual bookkeeping
- One-step bridge from game to web — no file exports, no copy-paste walls
- Rankings, player profiles, and encounter detail pages
- Premium tier for sustained operation
System
A trustless bridge out of a sandbox
The addon encodes encounter payloads into a custom QR-style visual format rendered inside the game window — the only reliable channel out of a sandbox with no I/O. The companion pipeline decodes those frames and reconstructs a structured payload with integrity checks, because the channel is lossy and the source is untrusted.
Ingestion treats every submission as hostile until proven otherwise: reporter validation, plausibility scoring against known encounter parameters, and an admin abuse dashboard for the cases heuristics can't settle. PostgreSQL holds the canonical record; the Next.js front-end reads ranked views.
- Custom binary payload encoding rendered as in-game visual frames
- Decoder with integrity checks tolerant of a lossy capture channel
- Reporter validation and plausibility scoring on ingest
- Admin abuse dashboard for moderation of contested submissions
- PostgreSQL rankings schema; Next.js public site with premium tier
Cadence data flow
Inside the game sandbox, the Lua addon captures combat events, scores encounters, and encodes payloads as visual frames. The player carries the frame across the sandbox boundary to the web decoder. The Node ingest service validates reporters, checks plausibility, and writes to PostgreSQL, which serves rankings and profiles through the Next.js site. An admin abuse dashboard oversees ingestion.
Decisions that mattered
Encode through the screen, not around the sandbox
Alternatives — file scraping, memory reading, companion process hacks — were fragile or against the platform's rules. Rendering an encoded visual payload keeps the addon fully compliant while still getting structured data out.
Validation lives server-side, entirely
The addon is running on machines I don't control, so no client-side check is load-bearing. All trust decisions — reporter validation, plausibility, dedup — happen at ingest.
Moderation as a first-class feature
A rankings product without abuse tooling becomes worthless the day it becomes popular. The admin dashboard was built alongside the rankings, not after them.
Where it landed
Cadence is live at cadencewow.com with the addon, ingest pipeline, rankings site, and premium tier operating end-to-end — proof of carrying a product from constrained-system R&D to shipped, operated software.
What I'd explore next
Expanded encounter coverage, richer profile analytics, and further hardening of the ingest heuristics.
- The visual bridge caps payload size — scoring must compress what matters before encoding
- Server-side-only trust means heavier ingest logic in exchange for unforgeable rankings
- Sole ownership means deliberate scope discipline: fewer features, each finished