Back to Projects

CS Glory

A FACEIT-style competitive matchmaking platform that rebuilds ranked CS:GO. 128-tick dedicated servers, server-side anti-cheat, and your CS2 skins mirrored into every match.

Counter-StrikeSteam APICloudflare Durable ObjectsSourceModNext.jsTypeScriptWebSockets
CS Glory
CS Glory - Image 2
CS Glory - Image 3

CS Glory is a third-party competitive matchmaking platform for CS:GO, built the way FACEIT and ESEA built theirs: you queue in a browser, get matched by skill, and play 5v5 on dedicated 128-tick servers with server-side anti-cheat. It exists because CS:GO's ranked play disappeared when CS2 replaced it, and a lot of players wanted that flow back.

One thing separates it from a straight revival. CS:GO can't natively render CS2 skins, so CS Glory reads a player's CS2 Steam inventory and reapplies those skins inside CS:GO when they connect to a match. You keep the skins you already own, in a game that technically can't show them.

It is in private beta. The site sits behind an access gate at csglory.com while the match servers, rating pipeline, and economy get finished. The core is roughly 85% there; seasons, tournaments, and a team system are still ahead. The backend is already real, not a mockup: rented game servers, recorded match demos, and a working rating pipeline.

Matchmaking

Most of the realtime engineering sits underneath the queue.

  • Skill-based queue: Ten players are formed into a match from a rating bracket that widens the longer you wait, opening up after two minutes, again at five, and to anyone at ten.
  • Parties: Up to five players queue together with invites and cooldowns; the leader controls the queue, and region and ping are negotiated for the whole party over a WebSocket.
  • Map veto: Captains ban down from an eleven-map pool, then the match hands off to a server with a steam:// auto-launch and a manual connect ip:port fallback.
  • Ranks: A Glicko-2 rating is shown to players as Elo, across six tiers from Bronze to Glorious, with placement settling after ten matches.
  • No-show handling: Leaver penalties escalate on repeat: two hours, then a day, then three, seven, and thirty.

The matchmaking screen: party slots, team rating, rank progress, and the queue

Every map, always

There is no rotating map pool. All eleven competitive maps (Dust II, Mirage, Inferno, Cache, Overpass, Train, Nuke, Cobblestone, Anubis, Ancient, Vertigo) are in play every match, so the veto, not a weekly rotation, decides what you play.

The full competitive map pool, available every match

CS2 skins in CS:GO

This is the feature the rest of the product is arranged around, and the part that took the most work to make real.

  • Reads your real inventory: It pulls a player's CS2 Steam inventory, with a fallback through the profile showcase for players who keep their inventory private.
  • Per-side loadout: Skins are assigned per weapon and per side, including the alternate-weapon slots (USP-S or P2000, Deagle or R8, M4A1-S or M4A4). Vanilla knives are free for everyone.
  • Applied at connect: When a player joins a match, the game server fetches their loadout and resolves each item to a CS:GO paint-kit index plus a wear float derived from the skin's exterior, which is what makes a CS2 skin appear on a CS:GO weapon.

The in-app loadout: skins equipped per side, with the owned and premium skin browser alongside

Progression and economy

A soft currency called Glory runs on an append-only ledger and is earned by playing, winning, and hitting daily firsts. It feeds a store with a rotating featured section and a nightly daily drop, alongside three daily and three weekly quests and a 102-achievement set scored across combat, tactics, utility, and accuracy.

The Glory store: daily deals on a reset timer, backed by the full skin catalog priced in Glory

A weekly ladder runs on its own points, separate from rank. The free ladder is open to everyone; the premium ladder pays its top three players real CS:GO skins, delivered through a Steam trade bot, with 1099-MISC tax tracking and geo-restrictions built into the data model for the regions that require them. Premium itself is billed through Polar and stays cosmetic and convenience only, never pay-to-win.

Trust and safety

  • Anti-cheat: Detections come from ChrononLabs' server-side anti-cheat over a webhook that feeds straight into the ban pipeline.
  • Phone verification: Sign-ups clear a fraud pre-check and an SMS one-time code; the number itself is only ever stored as a SHA-256 hash.
  • Moderation: Reports, punishments, and appeals each have their own handling flow, and accounts can be exported or deleted on a 14-day grace timer for GDPR.

Admin console

A separate staff app handles users, the Glory economy, the ladder, the live server fleet (start, stop, restart, and RCON), bans and appeals, the beta allowlist, map pools, match templates, the report queue, a maintenance gate, and an audit log of every staff action.

Technical Implementation

Frontend

  • Two static-exported Next.js apps (the public site plus the logged-in app, and a second app for admin), on React 19 with Tailwind v4 and DaisyUI, Zustand for state, and SWR for data.

  • The skin grid renders around 1,700 images, so it watches its own transfer latency: once the rolling p75 crosses 600ms, it drops to a smaller image tier for the rest of the session on its own, with no user setting.

Realtime on Durable Objects

The live layer is four Cloudflare Durable Object types and no Redis:

  • One per player: a hibernatable WebSocket gateway with a message replay buffer.
  • One per party: membership, chat, and ping aggregation.
  • One per region: the queue and match formation.
  • One per match: the veto → connect → live-score state machine.

Authoritative state lands in D1 (SQLite). KV caches leaderboards, bans, and auth, and holds the rate-limit counters. R2 stores match demos and report evidence. A daily cron rotates the drop and snapshots the ladder.

Backend and game servers

  • The API is a Cloudflare Worker running Hono, with Drizzle over D1, Better Auth behind a custom Steam OpenID plugin, Glicko-2 for ratings, and Polar for payments.

  • The CS:GO servers run SourceMod and Get5 with custom plugins and the ChrononLabs anti-cheat, talk to the API over HTTP through the RIPExt extension, and self-register on boot with a bootstrap secret before authenticating by a per-server hashed token. A Python toolchain drives a Pterodactyl panel for deploys and RCON.

  • Match completion funnels Get5 webhooks and a server-token fallback into a single idempotent finalize step, then ships the demo to R2 and hands it to Allstar for automatic highlight clips.

The hard part was never any single screen. It is that one browser click has to end with ten players on a real server, the right skins applied, the score recorded, ratings updated, and a demo archived, with no human in the loop. Most of that runs today. The rest is what the private beta is for.