Skip to content
Back to personal projects

DFRAG Fantasy

Fantasy System Engineer

I designed and built the fantasy system behind DFRAG's Logitech G Play Days campaign. Players collect account-bound player cards, build a five from the cards they own and score from real OCE Counter-Strike matches.

Live
DFRAG Fantasy store with a free Logitech G Pro Series starter pack, code redemption and featured card packs

The Fantasy store offers a free starter pack, event code redemption and the featured Logitech G card packs.

TypeScriptVueNuxtSupabasePostgreSQLNitroCloudflare Pages

Context

DFRAG is an Oceania and Asia Counter-Strike hub covering news, matches and events. DFRAG Fantasy turns its tournaments into a persistent card-collecting fantasy game: every match day, players pick five owned cards before the lock, and real match performance decides the standings. I built the Fantasy system with the DFRAG team, who also run the wider site, launch operations and campaign integrations.

My role

  • Designed and built the original Fantasy system, from versioned rulesets and database contracts to the scheduled jobs and first player and staff screens.
  • Built the scheduled publication, pricing, period-lock and scoring jobs in DFRAG's companion API.
  • Delivered the second-generation player experience, then continued into staff pick controls, score explanations, standings and starter-pack setup for the live event.
  • Contributed to the in-repo Card Studio and built the Card desk used to review and compile the player card sets that Fantasy lineups depend on.

What I built

  • Event-driven competitions whose match days, prices and eligible player pools come from DFRAG's own tournament, roster and match data.
  • Owned-card lineups with revisions, optional scoring roles, rarity bonuses, same-team factors and database-authored match-day locks.
  • Deterministic scoring with private per-card score detail, reviewed corrections and finalized global standings with rank movement.
  • Starter-pack claims, owned-card eligibility and trade-up selection integrated with DFRAG's card collector.
  • Audited staff tools for price exceptions, match-day pick windows, score review and starter recovery.
  • Public rules presented from each competition's frozen ruleset.

How it works

  • Nuxt and Vue application backed by Supabase PostgreSQL, with a separate Nitro API running scheduled Fantasy jobs.
  • Rulesets are frozen and hashed so a competition's scoring formula cannot change after publication; behaviour changes ship as new versions.
  • PostgreSQL remains authoritative for card ownership, eligibility, revisions and locks, while TypeScript validates every request and RPC envelope at the boundary.
  • Score runs read immutable, content-hashed match snapshots and integer millipoints, so a rerun produces the same result and corrections stay auditable.
  • Staff actions resolve the actor from a verified token, require an audit reason and use idempotency keys, so retries never duplicate an operation.
  • SQL suites cover concurrent publication and period locks, pick controls and owned-card rules alongside TypeScript unit tests.

Outcomes

  • Launched DFRAG Fantasy for the DFRAG Logitech G Pro Series 2026, where it runs live match days, lineups and global standings.
  • Gave the Play Days campaign a durable product to build on, not a disposable sponsor microsite.
  • Made scoring explainable, with every card's performance, role, rarity and team adjustments visible to the player.
DFRAG Fantasy score detail showing five rarity-framed player cards and each player's points before adjustments
Score detail breaks a scored lineup into each card's points before rarity and same-team adjustments.
DFRAG Fantasy rules and scoring page with the lineup essentials and a chapter index
Rules are presented from the competition's frozen ruleset, from lineup basics to corrections and prizes.