<?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: Srijan Pandey</title>
    <description>The latest articles on DEV Community by Srijan Pandey (@srijan_pandey_602b027d643).</description>
    <link>https://dev.to/srijan_pandey_602b027d643</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%2F1851864%2F6322bc32-8479-4a27-b7fc-ecfcdb6b1415.png</url>
      <title>DEV Community: Srijan Pandey</title>
      <link>https://dev.to/srijan_pandey_602b027d643</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/srijan_pandey_602b027d643"/>
    <language>en</language>
    <item>
      <title>Nemesis - Every Competitive Programmer Has One. I Built a Tracker For Mine.</title>
      <dc:creator>Srijan Pandey</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:54:00 +0000</pubDate>
      <link>https://dev.to/srijan_pandey_602b027d643/nemesis-every-competitive-programmer-has-one-i-built-a-tracker-for-mine-329h</link>
      <guid>https://dev.to/srijan_pandey_602b027d643/nemesis-every-competitive-programmer-has-one-i-built-a-tracker-for-mine-329h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every competitive programmer has a Nemesis — the one person whose Codeforces rating you check before your own morning coffee. As a tribute to my undying (and one-sided) love for competitive programming, I built &lt;strong&gt;Nemesis&lt;/strong&gt;, a head-to-head rivalry tracker that turns that quiet obsession into a living, gamified duel.&lt;/p&gt;

&lt;p&gt;Rating is a lagging indicator, it tells you who was better six months ago, not who's grinding &lt;em&gt;right now&lt;/em&gt;. So Nemesis computes an &lt;strong&gt;Obsession Score&lt;/strong&gt;, weighted toward current effort (solve velocity, streaks, upsolve discipline) over historical rating. You can be "winning" on obsession while losing on rating, and the app shows that tension instead of hiding it.&lt;/p&gt;

&lt;p&gt;The rivalry is also split into &lt;strong&gt;weekly rounds&lt;/strong&gt; — whoever solves more that week wins it, tallied into a running season score. And on demand, Gemini reads the live head-to-head and writes a dry, stats-grounded recap plus a targeted catch-up tip for whoever's behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://nemesis-cyan.vercel.app" rel="noopener noreferrer"&gt;nemesis-cyan.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyas7y06841yvvudhn6h.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyyas7y06841yvvudhn6h.gif" alt="Nemesis dashboard showing obsession score comparison, difficulty breakdown dial, season score, and a Gemini-generated recap between two rivals" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sri-ijan" rel="noopener noreferrer"&gt;
        sri-ijan
      &lt;/a&gt; / &lt;a href="https://github.com/sri-ijan/nemesis" rel="noopener noreferrer"&gt;
        nemesis
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Nemesis — Your CP Rivalry, Narrated&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Built for the &lt;strong&gt;"Passion" weekend challenge&lt;/strong&gt;. Every competitive programmer
has one — the person whose rating you check before your own. Nemesis turns
that rivalry into a living head-to-head: real rating data, a composite
"Obsession Score" that rewards current grind over past glory, and Gemini-written
recaps that read like sports commentary instead of a boring stats table.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prize category: Best use of Google AI&lt;/strong&gt; — Gemini is the actual differentiator
here, not a bolt-on. See &lt;a href="https://github.com/sri-ijan/nemesis#ai-studio-handoff" rel="noopener noreferrer"&gt;AI Studio Handoff&lt;/a&gt; below.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;nemesis/
├── backend/          MERN API — Express + MongoDB
│   ├── config/db.js          Mongo connection
│   ├── models/
│   │   ├── User.js           handle, cached platform stats, rating history
│   │   └── Rivalry.js        pairs two users, stores obsession scores + narrative log
│   ├── services/
│   │   ├── codeforces.js     CF public API — rating, history, submissions
│   │   └── obsessionScore.js composite metric: velocity + streak&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sri-ijan/nemesis" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; MERN — React + Vite + TS on the frontend, Express + MongoDB on the backend, deployed on Vercel + Render.&lt;/p&gt;

&lt;p&gt;Every stat comes straight from the Codeforces public API — I compute streaks, upsolve ratio, a LeetCode-style Easy/Medium/Hard breakdown, and strength/weak-spot tags directly from real submission data, not just cached totals.&lt;/p&gt;

&lt;p&gt;One fun bug: my weekly-round tracking kept showing 0 progress even after solving problems, because I was computing day boundaries in UTC instead of IST — any solve before 5:30am IST landed on the "wrong side" of midnight from my own calendar's view. Fixed by shifting all boundary math into IST first.&lt;/p&gt;

&lt;p&gt;Gemini is called directly (not templated) on every "Generate recap" — it reads live stats and returns structured JSON with a recap + a specific tip, grounded strictly in the real numbers to avoid hallucinated details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design:&lt;/strong&gt; dark editorial theme, exactly two accents — amber for "you," ember for "them" — used consistently across every chart and card, so you can track the rivalry by color alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Google AI&lt;/strong&gt; ✅ — Gemini is the narrative engine, not decoration. It reads each duel's live stats and writes a grounded recap plus a targeted catch-up tip for whoever's behind, every time.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
  </channel>
</rss>
