DEV Community

venkatesh m
venkatesh m

Posted on

I replaced our chaotic WhatsApp sports groups with a zero-login web app

This is a submission for the DEV Weekend Challenge: Community

The Community

Every Friday around 5 PM, my WhatsApp groups light up.

"Cricket tomorrow 7 AM anyone?"
"I'm in"
"Me too"
"Where?"
"Same place bro"
"How many people?"
...17 unread messages later...
"So are we playing or not?"

I live in Chennai, India, where pickup cricket, basketball, and badminton are a daily thing. But the coordination happens through scattered WhatsApp groups where messages get buried under memes, nobody confirms until game time, you never know how many people are actually coming, and plans fall apart because "only 4 people confirmed."

There's no single place to see what's happening, who's in, and whether there's space. This app is for every person who's ever rage-scrolled a WhatsApp group trying to figure out if the game is still on.

What I Built

pickup — a web app for organizing pickup sports games with zero friction.

The flow:

  1. Create a game — pick a sport (cricket, basketball, badminton, football), set time, place, and max players
  2. Share the link — one-tap WhatsApp share with a pre-filled message
  3. People join — tap the link, type your name, done. Under 10 seconds.

No login. No app download. No sign-up form. Someone taps a link in their WhatsApp group and they're in.

Key features:

  • Support for 5 sport types with smart defaults (22 for cricket, 10 for basketball, etc.)
  • Real-time player list — everyone sees who joins/leaves instantly via WebSocket subscriptions
  • WhatsApp-first sharing with Web Share API and clipboard fallback
  • Short, readable game URLs (/game/k7m3px) instead of UUID soup
  • Live progress bar showing spots filled
  • "My Games" page tracking games you've created or joined
  • Fully mobile-responsive — tested at 375px because that's where 90% of users will be

The deliberate no-auth decision: The target user taps a WhatsApp link on their phone. Any login wall — even "Sign in with Google" — kills the flow. The cost of a fake name joining is low. The cost of friction is high. I use sessionStorage for game-session identity and localStorage for cross-session tracking. Not bulletproof, but the right tradeoff for pickup games with 10-22 people.

Demo

Live app: getpickup.vercel.app


Home page — zero-friction landing


Browse — look through games and join the one you're excited in and share with others to have your gang over



Create a game — 30 seconds to set up



Have a look through at the games you have created, who's joined and let more people know by sharing the link

Try it yourself — create a game, copy the link, open it in an incognito tab, and join as a different player. Watch the player list update in real-time.

Code

GitHub logo vmvenkatesh78 / pickup

Organize pickup sports games in seconds. No login, no app download — just create, share, and play.

pickup 🏐

The simplest way to organize and join pickup sports games. No login. No app download. Just create, share, and play.

Built for the DEV Weekend Challenge — "Build for Your Community"

The problem

Coordinating pickup sports happens through scattered WhatsApp groups where messages get buried, nobody confirms until game time, and plans fall apart at the last minute. There's no single place to see what's happening, who's in, and whether there's space.

The solution

Create a game in 30 seconds, share the link on WhatsApp, and people join with just their name. Live player count, auto-close when full, and a browse page to discover games nearby.

Features

  • Create a game — pick a sport, set time/place/max players, get a shareable link
  • Join with zero friction — no login, no signup, just your name
  • Real-time player list — see who's in and how many spots are left, live
  • WhatsApp

Project structure highlights:

  • src/lib/api.ts — all Supabase queries and real-time subscriptions
  • src/lib/utils.ts — share codes, date formatting, WhatsApp sharing
  • src/pages/GamePage.tsx — the core experience with real-time player updates
  • supabase/schema.sql — database schema with RLS policies
  • ARCHITECTURE.md — full technical documentation

How I Built It

Tech stack:

Layer Choice Why
Framework React + TypeScript Type safety with fast iteration
Build Vite Instant HMR, zero config
Styling Tailwind CSS v4 Utility-first, mobile-first
Backend Supabase Postgres + REST API + real-time subscriptions in one service
Hosting Vercel One-click deploy from GitHub

Real-time: the feature that makes it click

When someone joins or leaves, every person viewing the game page sees the change instantly. I subscribe to Postgres changes on the players table filtered by game_id, and re-fetch the full player list on any event:

const channel = supabase
  .channel(`game-${gameId}-players`)
  .on(
    'postgres_changes',
    {
      event: '*',
      schema: 'public',
      table: 'players',
      filter: `game_id=eq.${gameId}`,
    },
    async () => {
      const { data } = await supabase
        .from('players')
        .select('*')
        .eq('game_id', gameId)
        .order('joined_at', { ascending: true });
      if (data) callback(data);
    }
  )
  .subscribe();
Enter fullscreen mode Exit fullscreen mode

Re-fetching the full list on every change isn't the most efficient approach, but for max 22 players it's completely fine and way simpler than merging individual row events.

Share codes over UUIDs

Game URLs use 6-character codes (k7m3px) instead of UUIDs. Ambiguous characters (0/O, 1/l/I) are stripped out. Around 700 million combinations — more than enough.

Edge cases I caught

  • Stale sessions — if your player record was deleted but sessionStorage still says "joined," the page detects the mismatch and resets
  • Game full race condition — client-side count check before the insert catches most simultaneous joins
  • Double-submit — useRef locks prevent spam-clicking from firing multiple API calls

What I'd build next

  • OTP phone verification for spam prevention
  • Waitlist with auto-promote when someone leaves
  • Recurring games ("Every Saturday 7 AM at Marina Beach")
  • Push notifications an hour before game time

The constraint of a weekend made this product better, not worse. "Should I add auth?" became "Does my user need auth to get value?" — and the answer was no.

If you're in Chennai (or anywhere with pickup sports), give it a try: getpickup.vercel.app 🏏🏀🏸

Top comments (1)

Collapse
 
vmvenkatesh78 profile image
venkatesh m

Quick note: :
Supabase is currently blocked across Indian ISPs due to a government order under IT Act Section 69A (techcrunch.com/2026/02/27/india-di...). The app works perfectly outside India — all Supabase infrastructure is fully operational. If you're testing from India, switching DNS to 1.1.1.1 (Cloudflare) or using a VPN should restore access.