<?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: Amer Mallah</title>
    <description>The latest articles on DEV Community by Amer Mallah (@amer).</description>
    <link>https://dev.to/amer</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%2F39166%2F4ce16bc1-35a2-415d-b011-40c6819ee6fd.jpg</url>
      <title>DEV Community: Amer Mallah</title>
      <link>https://dev.to/amer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amer"/>
    <language>en</language>
    <item>
      <title>Backyard Ladder: Zero-Friction Elo Rankings for Local Sports</title>
      <dc:creator>Amer Mallah</dc:creator>
      <pubDate>Sun, 01 Mar 2026 21:39:06 +0000</pubDate>
      <link>https://dev.to/amer/backyard-ladder-zero-friction-elo-rankings-for-local-sports-1jg5</link>
      <guid>https://dev.to/amer/backyard-ladder-zero-friction-elo-rankings-for-local-sports-1jg5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;I built because of two communities I'm a part of—specifically the &lt;strong&gt;Pickleball&lt;/strong&gt; weekend groups at our local high school and our annual family &lt;strong&gt;Cornhole&lt;/strong&gt; tournament.&lt;/p&gt;

&lt;p&gt;In these communities, we care about competitive balance, but we hate friction. Nobody wants to download a heavy app, remember a password, or look up their official DUPR rating just to play a few games on a Sunday afternoon. We needed a "right here, right now" way to track who’s winning and who should play next.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Backyard Ladder&lt;/strong&gt; is a session-based ranking and matchmaking web app. It’s designed to be launched by a host in seconds. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Account Onboarding:&lt;/strong&gt; Players scan a QR code, enter a nickname, and they are in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Matchmaking:&lt;/strong&gt; Uses a custom Elo algorithm to suggest the most balanced 2v2 matches from the available pool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weighted Results:&lt;/strong&gt; Winning 21-0 (a "skunk") boosts your rating more than a 21-20 nail-biter, thanks to a Margin of Victory (MOV) multiplier.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I’ve recorded the experience from both the host and player perspectives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Host Experience:&lt;/strong&gt; Starting a session and managing the "Smart Matchmaker" queue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Player Experience:&lt;/strong&gt; Scanning into the game and seeing the live leaderboard update.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The project is open-source and designed to be "One-Click Deployable" so any local league can fork it.&lt;/p&gt;

&lt;p&gt;

&lt;/p&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/amallah" rel="noopener noreferrer"&gt;
        amallah
      &lt;/a&gt; / &lt;a href="https://github.com/amallah/backyard-ladder" rel="noopener noreferrer"&gt;
        backyard-ladder
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      pickleball and cornhole elo matching system
    &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;Backyard Ladder&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A zero-friction ranking and matchmaking app for local community sports (Pickleball, Cornhole, etc.). A host starts a session, players join by scanning a QR code — no accounts required — and the app manages a live leaderboard with Elo-based matchmaking.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt; creates a session and picks a sport. A QR code is displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Players&lt;/strong&gt; scan the QR, enter a nickname, and are added to the available pool instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matchmaker&lt;/strong&gt; suggests balanced 2v2 matches based on Elo ratings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scores&lt;/strong&gt; are entered after each game; Elo ratings update in real-time on the leaderboard.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech stack&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Next.js 15 (App Router)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS + Radix UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; Supabase (Postgres + real-time subscriptions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QR generation:&lt;/strong&gt; &lt;code&gt;react-qr-code&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Prerequisites&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 18+&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://supabase.com" rel="nofollow noopener noreferrer"&gt;Supabase&lt;/a&gt; project&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting started&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Install dependencies&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Configure environment variables&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Copy the example below into a &lt;code&gt;.env.local&lt;/code&gt; file at the project root:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Both…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/amallah/backyard-ladder" 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;I have been tuning a Claude Code/Ralph Loop workflow (inspired by snarktank/ralph on github), with Gemini as my project consultant. I left the skills in the repo and I'm really enjoying tuning it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Next.js 15 (App Router)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Supabase for real-time Postgres subscriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS + Shadcn/UI for a clean, professional aesthetic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Math:&lt;/strong&gt; I implemented a custom &lt;strong&gt;Doubles-Average Elo&lt;/strong&gt; system. It calculates the expected win probability ($E_A$) for a team:
$$E_A = \frac{1}{1 + 10^{(R_B - R_A)/400}}$$
Then, it applies a log-based &lt;strong&gt;Margin of Victory&lt;/strong&gt; multiplier so dominant wins are rewarded more heavily.&lt;/li&gt;
&lt;/ul&gt;

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