<?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: 거북이</title>
    <description>The latest articles on DEV Community by 거북이 (@_790a2066fe960225cb5f7).</description>
    <link>https://dev.to/_790a2066fe960225cb5f7</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4044723%2Fff797bf7-a443-4b58-9574-b1f1e172d2ed.png</url>
      <title>DEV Community: 거북이</title>
      <link>https://dev.to/_790a2066fe960225cb5f7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_790a2066fe960225cb5f7"/>
    <language>en</language>
    <item>
      <title>How I Built an SSR Valorant Tracker with React, Supabase and Live Esports Data</title>
      <dc:creator>거북이</dc:creator>
      <pubDate>Fri, 24 Jul 2026 06:49:03 +0000</pubDate>
      <link>https://dev.to/_790a2066fe960225cb5f7/how-i-built-an-ssr-valorant-tracker-with-react-supabase-and-live-esports-data-4fbl</link>
      <guid>https://dev.to/_790a2066fe960225cb5f7/how-i-built-an-ssr-valorant-tracker-with-react-supabase-and-live-esports-data-4fbl</guid>
      <description>&lt;h1&gt;
  
  
  How I Built an SSR Valorant Tracker with React, Supabase and Live Esports Data
&lt;/h1&gt;

&lt;p&gt;I recently built &lt;a href="https://valoranttracker.net/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=build_story" rel="noopener noreferrer"&gt;VALTRAIN&lt;/a&gt;, a player-focused Valorant platform that combines a Valorant Tracker, VCT match database and weapon skins explorer.&lt;/p&gt;

&lt;p&gt;The project started as a simple match history lookup page. It eventually became a much larger SSR application with player statistics, esports schedules, match detail pages, replay discovery, multilingual routes and searchable cosmetic data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Product Areas
&lt;/h2&gt;

&lt;p&gt;VALTRAIN is divided into three primary areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Valorant Tracker
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://valoranttracker.net/match-history?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=build_story" rel="noopener noreferrer"&gt;Valorant Tracker&lt;/a&gt; accepts a Riot ID and region.&lt;/p&gt;

&lt;p&gt;It can display:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current rank and RR&lt;/li&gt;
&lt;li&gt;Recent competitive and unrated matches&lt;/li&gt;
&lt;li&gt;KDA and combat score&lt;/li&gt;
&lt;li&gt;Headshot, body shot and leg shot data&lt;/li&gt;
&lt;li&gt;Competitive RR movement&lt;/li&gt;
&lt;li&gt;Lifetime performance statistics&lt;/li&gt;
&lt;li&gt;Individual match details and team compositions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One challenge was handling incomplete or delayed data from an external player API. The interface needed useful loading, empty and error states instead of leaving users with an endless spinner.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. VCT Match Database
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://valoranttracker.net/esports?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=build_story" rel="noopener noreferrer"&gt;VCT esports database&lt;/a&gt; stores upcoming and completed matches.&lt;/p&gt;

&lt;p&gt;Each public match can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tournament and stage information&lt;/li&gt;
&lt;li&gt;Team names and series scores&lt;/li&gt;
&lt;li&gt;Map-level results&lt;/li&gt;
&lt;li&gt;Player statistics&lt;/li&gt;
&lt;li&gt;Recent team form&lt;/li&gt;
&lt;li&gt;Official replay availability&lt;/li&gt;
&lt;li&gt;Related matches and internal links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also includes an original &lt;a href="https://valoranttracker.net/esports/reports/vct-performance?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=build_story" rel="noopener noreferrer"&gt;VCT performance report&lt;/a&gt; generated from completed match records.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Valorant Weapon Skins
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://valoranttracker.net/skins?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=build_story" rel="noopener noreferrer"&gt;weapon skins database&lt;/a&gt; allows players to browse skins by collection, weapon type, rarity, price and chroma.&lt;/p&gt;

&lt;p&gt;The main performance challenge was preventing high-resolution media from slowing down the initial page load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Moved the Site to SSR
&lt;/h2&gt;

&lt;p&gt;The original version relied heavily on client-side rendering.&lt;/p&gt;

&lt;p&gt;That worked for user interaction, but it created several problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public pages had limited initial HTML&lt;/li&gt;
&lt;li&gt;Search engines had to execute JavaScript&lt;/li&gt;
&lt;li&gt;Metadata was harder to control&lt;/li&gt;
&lt;li&gt;Dynamic routes occasionally returned weak fallback pages&lt;/li&gt;
&lt;li&gt;First contentful paint was slower on mobile networks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current architecture renders public content on the server and hydrates interactive features in the browser.&lt;/p&gt;

&lt;p&gt;SSR is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Titles and meta descriptions&lt;/li&gt;
&lt;li&gt;Canonical URLs&lt;/li&gt;
&lt;li&gt;Hreflang links&lt;/li&gt;
&lt;li&gt;Structured data&lt;/li&gt;
&lt;li&gt;Public match information&lt;/li&gt;
&lt;li&gt;Internal navigation&lt;/li&gt;
&lt;li&gt;Indexable editorial content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Client-side code is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Player searches&lt;/li&gt;
&lt;li&gt;Filters&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Video players&lt;/li&gt;
&lt;li&gt;Interactive match details&lt;/li&gt;
&lt;li&gt;User-specific states&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Storage with Supabase
&lt;/h2&gt;

&lt;p&gt;Supabase provides the persistent data layer for esports matches and cached API responses.&lt;/p&gt;

&lt;p&gt;Caching was important because relying on an external API for every visitor would cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow responses&lt;/li&gt;
&lt;li&gt;Rate-limit problems&lt;/li&gt;
&lt;li&gt;Inconsistent user experiences&lt;/li&gt;
&lt;li&gt;Increased failure risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application first checks server-side or cached data, then refreshes external data when necessary.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  External data needs fallbacks
&lt;/h3&gt;

&lt;p&gt;A third-party API can be slow, unavailable or incomplete. Every data-dependent page needs timeouts, cached responses and a useful fallback state.&lt;/p&gt;

&lt;h3&gt;
  
  
  SSR does not mean removing client-side rendering
&lt;/h3&gt;

&lt;p&gt;The best result came from splitting responsibilities. Searchable content is rendered on the server, while interactive tools remain client-side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Internal links matter
&lt;/h3&gt;

&lt;p&gt;Match pages should not be isolated. VALTRAIN links matches to tournaments, teams, reports, guides, agents and related matches.&lt;/p&gt;

&lt;p&gt;This makes the website easier to explore and gives search engines a clearer understanding of the content structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Original data pages are more valuable than copied summaries
&lt;/h3&gt;

&lt;p&gt;Instead of publishing only generic Valorant text, I added reports generated from the site's completed match records. These pages are more useful to users and more likely to earn natural references.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;Planned improvements include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More detailed player trends&lt;/li&gt;
&lt;li&gt;Better team and tournament pages&lt;/li&gt;
&lt;li&gt;Embeddable VCT match widgets&lt;/li&gt;
&lt;li&gt;Additional original VCT reports&lt;/li&gt;
&lt;li&gt;Faster player lookup caching&lt;/li&gt;
&lt;li&gt;More languages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can try the project at &lt;a href="https://valoranttracker.net/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=build_story" rel="noopener noreferrer"&gt;valoranttracker.net&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would appreciate feedback on the tracker experience, match details and site performance.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>supabase</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
