<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: milkmaster7</title>
    <description>The latest articles on DEV Community by milkmaster7 (@milkmaster7).</description>
    <link>https://dev.to/milkmaster7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3851865%2F29fc3424-4f03-4d24-b996-4aaed5a44c1b.png</url>
      <title>DEV Community: milkmaster7</title>
      <link>https://dev.to/milkmaster7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/milkmaster7"/>
    <language>en</language>
    <item>
      <title>How We Built a Skill Rating System for 1v1 Esports Matches</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Mon, 20 Apr 2026 06:00:15 +0000</pubDate>
      <link>https://dev.to/milkmaster7/how-we-built-a-skill-rating-system-for-1v1-esports-matches-1pk8</link>
      <guid>https://dev.to/milkmaster7/how-we-built-a-skill-rating-system-for-1v1-esports-matches-1pk8</guid>
      <description>&lt;h2&gt;
  
  
  1v1 Skill Rating for Esports
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://lootdiff.com" rel="noopener noreferrer"&gt;LootDiff&lt;/a&gt; is a competitive gaming platform where players stake USDC on 1v1 matches in CS2, Dota 2, and Deadlock. We needed a fair ranking system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Algorithm
&lt;/h2&gt;

&lt;p&gt;Standard rating formula with esports modifications:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="c1"&gt;// Base K-factor&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expectedScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opponentElo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;playerElo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newElo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;playerElo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actualScore&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;expectedScore&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Our Modifications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stake-Weighted K-Factor
&lt;/h3&gt;

&lt;p&gt;Higher stakes = more SR at risk. A $20 match matters more than a $1 match.&lt;/p&gt;

&lt;h3&gt;
  
  
  Game-Specific Adjustments
&lt;/h3&gt;

&lt;p&gt;CS2 1v1s are more volatile than Dota 2 1v1s, so K-factors differ by game.&lt;/p&gt;

&lt;h3&gt;
  
  
  Placement Matches
&lt;/h3&gt;

&lt;p&gt;New players get a higher K-factor for their first 10 matches to quickly reach their true skill level.&lt;/p&gt;

&lt;h3&gt;
  
  
  City Rankings
&lt;/h3&gt;

&lt;p&gt;Players belong to cities. City SR is the average of top 10 players from that city. Creates regional rivalries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;After thousands of matches, the system produces stable rankings where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top players consistently beat lower-ranked opponents&lt;/li&gt;
&lt;li&gt;Upsets happen but don't wildly swing rankings&lt;/li&gt;
&lt;li&gt;New players reach their true rank within ~15 matches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the leaderboards: &lt;a href="https://lootdiff.com" rel="noopener noreferrer"&gt;lootdiff.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you implemented skill rating or similar ranking systems? What edge cases did you hit?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>gaming</category>
      <category>typescript</category>
      <category>esports</category>
    </item>
    <item>
      <title>Esports Player Salaries and Prize Earnings: Where to Find the Data</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Sun, 19 Apr 2026 06:00:30 +0000</pubDate>
      <link>https://dev.to/milkmaster7/esports-player-salaries-and-prize-earnings-where-to-find-the-data-29ch</link>
      <guid>https://dev.to/milkmaster7/esports-player-salaries-and-prize-earnings-where-to-find-the-data-29ch</guid>
      <description>&lt;h2&gt;
  
  
  How Much Do Pro Esports Players Actually Earn?
&lt;/h2&gt;

&lt;p&gt;This question comes up constantly and the honest answer is: it's complicated. Tournament prize money is public, but salaries are mostly private.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Data Is Actually Available
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prize money&lt;/strong&gt; — fully public. Organizers announce prize pools, and results are well-documented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Salaries&lt;/strong&gt; — largely private, though some orgs have disclosed ranges. CS2 top players reportedly earn $20k–$50k/month base salary from orgs. Valorant VCT franchised players are in a similar range. LoL LCS/LEC players at the top earn more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sponsorship and streaming&lt;/strong&gt; — almost entirely opaque.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Track Career Earnings
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://esport.is/esports-earnings" rel="noopener noreferrer"&gt;esport.is/esports-earnings&lt;/a&gt; tracks lifetime prize money for professional players across CS2, Valorant, LoL, Dota 2, and R6 — automatically updated after every major tournament.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://esport.is/transfers" rel="noopener noreferrer"&gt;transfers page&lt;/a&gt; also shows when players move orgs, which often correlates with salary changes even if the numbers stay private.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Biggest Prize Pools in Esports History
&lt;/h2&gt;

&lt;p&gt;Dota 2's The International remains the all-time record holder, with TI10 reaching $40M through the crowdfunded Battle Pass. CS2 Majors sit around $1.25M. Valorant Champions has reached $2.35M.&lt;/p&gt;

&lt;p&gt;Full career earnings database: &lt;a href="https://esport.is/esports-earnings" rel="noopener noreferrer"&gt;esport.is/esports-earnings&lt;/a&gt;&lt;/p&gt;

</description>
      <category>esports</category>
      <category>gaming</category>
      <category>career</category>
      <category>data</category>
    </item>
    <item>
      <title>Building a Real-Time Esports Score Platform with Next.js and WebSockets</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Wed, 15 Apr 2026 06:00:43 +0000</pubDate>
      <link>https://dev.to/milkmaster7/building-a-real-time-esports-score-platform-with-nextjs-and-websockets-2p9n</link>
      <guid>https://dev.to/milkmaster7/building-a-real-time-esports-score-platform-with-nextjs-and-websockets-2p9n</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;As an esports fan, I was tired of juggling between HLTV for CS2, VLR for Valorant, and Liquipedia for everything else. I wanted one platform that covered all games with real-time scores.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://esport.is" rel="noopener noreferrer"&gt;esport.is&lt;/a&gt; — a unified esports platform covering CS2, Valorant, League of Legends, and Dota 2 with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live scores&lt;/strong&gt; updating every 30 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elo-based rankings&lt;/strong&gt; recalculated after every match&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free prediction game&lt;/strong&gt; with accuracy tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfer tracker&lt;/strong&gt; with hourly updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-powered news&lt;/strong&gt; aggregation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 14&lt;/strong&gt; with App Router&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; for hosting + edge functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; for database + real-time subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple esports APIs&lt;/strong&gt; (PandaScore, custom scrapers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; for caching live data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini AI&lt;/strong&gt; for news generation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The system pulls data from 5+ esports APIs every 30 seconds, normalizes it into a unified format, and serves it through a Next.js frontend with ISR for SEO and client-side polling for live updates.&lt;/p&gt;

&lt;p&gt;Rankings use a modified Elo system that weights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tournament tier (Major &amp;gt; qualifier)&lt;/li&gt;
&lt;li&gt;Recency (recent matches matter more)&lt;/li&gt;
&lt;li&gt;Opponent strength (beating #1 matters more than beating #50)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prediction Game
&lt;/h2&gt;

&lt;p&gt;The prediction game lets anyone pick match winners before games start. We track accuracy over time and have a global leaderboard. Upset picks (picking the underdog correctly) earn bonus XP.&lt;/p&gt;

&lt;p&gt;We also compare community predictions against real-money Polymarket odds and flag "Sharp Picks" where the crowd disagrees with the market.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Esports APIs are inconsistent&lt;/strong&gt; — different providers format team names, tournament names, and scores differently. Normalization is half the battle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live data caching is critical&lt;/strong&gt; — without Redis, API costs would be astronomical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISR + client polling&lt;/strong&gt; gives the best of both worlds — SEO-friendly static pages that update in real time for active users.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://esport.is" rel="noopener noreferrer"&gt;esport.is&lt;/a&gt; — completely free, no account required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://esport.is/api-docs" rel="noopener noreferrer"&gt;API docs&lt;/a&gt; available if you want to build on the data.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What esports platforms do you use? Would love feedback from the dev community.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>esports</category>
      <category>webdev</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How I Built an Elo Rating System for Esports Teams</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Wed, 08 Apr 2026 06:00:35 +0000</pubDate>
      <link>https://dev.to/milkmaster7/how-i-built-an-elo-rating-system-for-esports-teams-56n</link>
      <guid>https://dev.to/milkmaster7/how-i-built-an-elo-rating-system-for-esports-teams-56n</guid>
      <description>&lt;h2&gt;
  
  
  Why Elo for Esports?
&lt;/h2&gt;

&lt;p&gt;Traditional esports rankings (HLTV, VLR) use a mix of editorial judgment and point-based systems. I wanted something purely mathematical — a system where every match result automatically updates team rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Algorithm
&lt;/h2&gt;

&lt;p&gt;The base Elo formula is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New Rating = Old Rating + K * (Actual - Expected)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;K-factor&lt;/strong&gt; = how much each match matters (I use 32 for regular matches, 48 for playoffs, 64 for grand finals)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt; = probability of winning based on rating difference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actual&lt;/strong&gt; = 1 for win, 0 for loss&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Modifications
&lt;/h2&gt;

&lt;p&gt;Standard Elo doesn't account for esports-specific factors, so I added:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tournament Tier Weighting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tierMultiplier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Majors, Worlds, TI&lt;/span&gt;
  &lt;span class="na"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// ESL Pro League, Masters&lt;/span&gt;
  &lt;span class="na"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Regular tournaments&lt;/span&gt;
  &lt;span class="na"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Qualifiers&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Recency Decay
&lt;/h3&gt;

&lt;p&gt;Matches from 6+ months ago contribute less to current rating. This prevents teams that were good a year ago but haven't played recently from staying ranked high.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Score Margin
&lt;/h3&gt;

&lt;p&gt;A 2-0 sweep is weighted more than a 2-1 win. Close series suggest teams are evenly matched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;After processing 50,000+ matches across CS2, Valorant, LoL, and Dota 2, the rankings at &lt;a href="https://esport.is/rankings" rel="noopener noreferrer"&gt;esport.is/rankings&lt;/a&gt; closely match expert consensus while being fully automated.&lt;/p&gt;

&lt;p&gt;The system correctly predicted ~62% of match outcomes in backtesting — better than random (50%) and comparable to betting market implied probabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;Built with TypeScript, running on Vercel serverless functions. Rankings recalculate after every match via webhook from our data pipeline.&lt;/p&gt;

&lt;p&gt;Check it out: &lt;a href="https://esport.is/rankings" rel="noopener noreferrer"&gt;esport.is/rankings&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you implemented rating systems? What modifications worked for you?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>esports</category>
      <category>typescript</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Competitive Gaming Platform with Solana Payments — Full Tech Stack Breakdown</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Mon, 06 Apr 2026 06:00:22 +0000</pubDate>
      <link>https://dev.to/milkmaster7/competitive-gaming-platform-with-solana-payments-full-tech-stack-breakdown-1k7g</link>
      <guid>https://dev.to/milkmaster7/competitive-gaming-platform-with-solana-payments-full-tech-stack-breakdown-1k7g</guid>
      <description>&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://lootdiff.gg" rel="noopener noreferrer"&gt;LootDiff&lt;/a&gt; — a platform where gamers play CS2, Dota 2, and Deadlock for real USDC stakes. Here's the full stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 14&lt;/strong&gt; with App Router&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana Wallet Adapter&lt;/strong&gt; for wallet connections&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Backend
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; — PostgreSQL database + auth + real-time subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; — Hosting + serverless functions + cron jobs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; — Match queue, rate limiting, caching&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Blockchain
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solana&lt;/strong&gt; — USDC escrow smart contracts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@solana/web3.js&lt;/strong&gt; — Transaction building&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Program&lt;/strong&gt; — USDC SPL token handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Game Integration
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Steam Web API&lt;/strong&gt; — CS2/Dota 2 match verification + VAC ban checking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom VAC checker&lt;/strong&gt; — Runs every 6 hours, flags banned accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automation (32 cron jobs)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Match notifications, tournament creation, city leaderboards&lt;/li&gt;
&lt;li&gt;Social media posting (Twitter, Telegram, Discord, VK, Reddit)&lt;/li&gt;
&lt;li&gt;Blog generation, meme posting, streamer discovery&lt;/li&gt;
&lt;li&gt;Self-healing monitor + auto-retrigger&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Challenges
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Escrow timing&lt;/strong&gt; — Match results can take minutes to appear on Steam API. We poll with exponential backoff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anti-cheat&lt;/strong&gt; — VAC bans are binary but don't cover all cheats. We added ELO anomaly detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regional targeting&lt;/strong&gt; — Turkey, CIS, Caucasus markets. Multilingual everything (EN/TR/RU).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Try it: &lt;a href="https://lootdiff.gg" rel="noopener noreferrer"&gt;lootdiff.gg&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>solana</category>
      <category>gaming</category>
    </item>
    <item>
      <title>Free Esports Data API — Live Scores, Rankings, Teams for Your Projects</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Tue, 31 Mar 2026 02:30:49 +0000</pubDate>
      <link>https://dev.to/milkmaster7/free-esports-data-api-live-scores-rankings-teams-for-your-projects-2j64</link>
      <guid>https://dev.to/milkmaster7/free-esports-data-api-live-scores-rankings-teams-for-your-projects-2j64</guid>
      <description>&lt;h2&gt;
  
  
  Free Esports API
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://esport.is" rel="noopener noreferrer"&gt;esport.is&lt;/a&gt; as a unified esports platform, and the data API is available for developers building esports tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endpoints
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/matches/live&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Currently live matches across all games&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/matches/upcoming&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upcoming scheduled matches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Completed match results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rankings/:game&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Team rankings by game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/teams/:id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Team profile, roster, stats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/players/:id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Player profile, stats, earnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/tournaments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tournament schedules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/transfers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recent roster moves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/news&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Curated esports news&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Games Covered
&lt;/h2&gt;

&lt;p&gt;CS2, Valorant, League of Legends, Dota 2, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://esport.is/api/matches/live?game&lt;span class="o"&gt;=&lt;/span&gt;cs2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matches"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"teams"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"NaVi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Vitality"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tournament"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BLAST Premier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"game"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cs2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"live"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rate Limits
&lt;/h2&gt;

&lt;p&gt;Free tier: 100 requests/hour. Enough for personal projects, bots, and dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Discord bots showing live scores&lt;/li&gt;
&lt;li&gt;Telegram channels with match alerts&lt;/li&gt;
&lt;li&gt;Personal dashboards tracking your favorite teams&lt;/li&gt;
&lt;li&gt;Prediction/fantasy apps&lt;/li&gt;
&lt;li&gt;Data analysis and visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docs
&lt;/h2&gt;

&lt;p&gt;Full documentation: &lt;a href="https://esport.is/api-docs" rel="noopener noreferrer"&gt;esport.is/api-docs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building something with esports data? I'd love to see it. Drop a comment!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>esports</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Free Esports Data API — Live Scores, Rankings, Teams for Your Projects</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Tue, 31 Mar 2026 00:30:51 +0000</pubDate>
      <link>https://dev.to/milkmaster7/free-esports-data-api-live-scores-rankings-teams-for-your-projects-4ao4</link>
      <guid>https://dev.to/milkmaster7/free-esports-data-api-live-scores-rankings-teams-for-your-projects-4ao4</guid>
      <description>&lt;h2&gt;
  
  
  Free Esports API
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://esport.is" rel="noopener noreferrer"&gt;esport.is&lt;/a&gt; as a unified esports platform, and the data API is available for developers building esports tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endpoints
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/matches/live&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Currently live matches across all games&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/matches/upcoming&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upcoming scheduled matches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Completed match results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rankings/:game&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Team rankings by game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/teams/:id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Team profile, roster, stats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/players/:id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Player profile, stats, earnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/tournaments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tournament schedules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/transfers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recent roster moves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/news&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Curated esports news&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Games Covered
&lt;/h2&gt;

&lt;p&gt;CS2, Valorant, League of Legends, Dota 2, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://esport.is/api/matches/live?game&lt;span class="o"&gt;=&lt;/span&gt;cs2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matches"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"teams"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"NaVi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Vitality"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tournament"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BLAST Premier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"game"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cs2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"live"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rate Limits
&lt;/h2&gt;

&lt;p&gt;Free tier: 100 requests/hour. Enough for personal projects, bots, and dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Discord bots showing live scores&lt;/li&gt;
&lt;li&gt;Telegram channels with match alerts&lt;/li&gt;
&lt;li&gt;Personal dashboards tracking your favorite teams&lt;/li&gt;
&lt;li&gt;Prediction/fantasy apps&lt;/li&gt;
&lt;li&gt;Data analysis and visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docs
&lt;/h2&gt;

&lt;p&gt;Full documentation: &lt;a href="https://esport.is/api-docs" rel="noopener noreferrer"&gt;esport.is/api-docs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building something with esports data? I'd love to see it. Drop a comment!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>esports</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How We Built an ELO Rating System for 1v1 Esports Matches</title>
      <dc:creator>milkmaster7</dc:creator>
      <pubDate>Mon, 30 Mar 2026 16:22:13 +0000</pubDate>
      <link>https://dev.to/milkmaster7/how-we-built-an-elo-rating-system-for-1v1-esports-matches-ok5</link>
      <guid>https://dev.to/milkmaster7/how-we-built-an-elo-rating-system-for-1v1-esports-matches-ok5</guid>
      <description>&lt;h2&gt;
  
  
  1v1 ELO for Esports
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://raisegg.gg" rel="noopener noreferrer"&gt;RaiseGG&lt;/a&gt; is a competitive gaming platform where players stake USDC on 1v1 matches in CS2, Dota 2, and Deadlock. We needed a fair ranking system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Algorithm
&lt;/h2&gt;

&lt;p&gt;Standard ELO with esports modifications:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="c1"&gt;// Base K-factor&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expectedScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opponentElo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;playerElo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newElo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;playerElo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actualScore&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;expectedScore&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Our Modifications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stake-Weighted K-Factor
&lt;/h3&gt;

&lt;p&gt;Higher stakes = more ELO at risk. A $20 match matters more than a $1 match.&lt;/p&gt;

&lt;h3&gt;
  
  
  Game-Specific Adjustments
&lt;/h3&gt;

&lt;p&gt;CS2 1v1s are more volatile than Dota 2 1v1s, so K-factors differ by game.&lt;/p&gt;

&lt;h3&gt;
  
  
  Placement Matches
&lt;/h3&gt;

&lt;p&gt;New players get a higher K-factor for their first 10 matches to quickly reach their true skill level.&lt;/p&gt;

&lt;h3&gt;
  
  
  City Rankings
&lt;/h3&gt;

&lt;p&gt;Players belong to cities. City ELO is the average of top 10 players from that city. Creates regional rivalries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;After thousands of matches, the system produces stable rankings where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top players consistently beat lower-ranked opponents&lt;/li&gt;
&lt;li&gt;Upsets happen but don't wildly swing rankings&lt;/li&gt;
&lt;li&gt;New players reach their true rank within ~15 matches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the leaderboards: &lt;a href="https://raisegg.gg" rel="noopener noreferrer"&gt;raisegg.gg&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you implemented ELO or similar rating systems? What edge cases did you hit?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>gaming</category>
      <category>typescript</category>
      <category>esports</category>
    </item>
  </channel>
</rss>
