Skip to content

Case study · Data aggregation platform

Compete

A race-discovery platform for India: runners and endurance athletes browse upcoming running, cycling, triathlon, Ironman and Hyrox events in one place, with a curator dashboard behind it.

View live site

The problem

Race listings for Indian running and endurance events are spread across organiser sites, social posts and registration platforms. Compete collects them into one browsable, searchable, always-current source.

What I built

  • Designed the system end to end: data model, API, public site, admin dashboard and deployment.
  • Public site: browsable race lists per sport, filters, race detail pages with distances, pricing, schedules and registration status, and SEO with dynamic OpenGraph images.
  • Human-in-the-loop pipeline: scheduled AI routines run daily by region, search for races and post verified candidates through a bearer-token API. A second daily routine re-checks approved races against their live pages and flags changes. A curator reviews everything in an admin dashboard (pending, approved, rejected, needs review, unreachable, past).
  • Postgres schema with Drizzle: races, categories, editions, schedule items, sources, edits, subscribers, alert deliveries and sponsor requests, managed with versioned migrations.
  • Admin: Auth.js-protected, with approval workflow, race editing, duplicate detection and merging, analytics and subscriber management.
  • Email alerts for subscribers through Resend, and click and view tracking for organisers and sponsors.
  • Sponsored and featured placements, with a sponsor request form feeding the dashboard.

Technical decisions

  • Drizzle over Prisma for plain-SQL performance and no query-engine cold start on serverless.
  • AI proposes, a human approves: nothing from the discovery routine goes public until reviewed. The rules for it are strict (never guess; omit unknown fields), so data quality stays high.
  • Kept the discovery logic outside the web app. The app only exposes the API that receives results, so the routines can change without touching the product. Pages that change or go dead are flagged for human review rather than silently updated.

Performance and SEO

  • Race detail pages with dynamic OpenGraph images, per-sport browse pages and filters.

Outcome

  • A live product covering five sports with a working curation pipeline and monetisation hooks (sponsorships and featured listings).

Why this matters

Shows I can build a two-sided data product: a public site for users, an operational back office for a curator, and an API for an AI pipeline, designed around data quality, not just UI.

Technology

  • Next.js
  • TypeScript
  • Drizzle ORM
  • Postgres (Supabase)
  • Auth.js
  • Zod
  • Resend
  • Tailwind + shadcn/ui
  • Framer Motion
  • Vercel

Have something like this in mind?

Tell me what you're building and what you need help with. I'll reply with an honest take on fit and scope.

Start a project

Part-time freelance and contract engagements · Remote, worldwide