Skip to content

Project

Rival Radar

AI-driven competitor-intelligence SaaS — Next.js, Supabase, Stripe, Vercel Cron

Role
Sole engineer — architecture, data model, security, AI pipeline
Status
Live
The Rival Radar landing page: 'Know the moment your competitors move', beside a panel listing three detected changes tagged Major and Notable.
25×
cost difference between two API endpoints, found in a header
RLS
row-level security on every tenant table
Daily
scheduled scrape via Vercel Cron

The problem

Small businesses know they should watch their competitors' pricing, features and messaging. Almost none of them do it, because doing it properly means revisiting a dozen pages every week and noticing what is different — which is exactly the sort of task people intend to do and never do.

Rival Radar finds a business's competitors from a plain-English description, watches their pages on a schedule, and explains in ordinary language what changed and why it matters.

Architecture

Next.js with TypeScript on Vercel; Supabase for Postgres, auth and Row-Level Security; tiered Stripe subscriptions with webhook-driven plan sync; scheduled scraping through Vercel Cron; Anthropic Claude for the summarisation and comparison pipeline.

I directed an AI coding agent end to end against my own architecture, data-model and security decisions rather than letting it choose them. Row-Level Security was designed alongside the schema, and every change was verified against live data before shipping.

Designing the hallucination out

Ask a model to name a business's competitors and it will happily invent plausible companies with plausible URLs. That is not a prompt problem, it is an architecture problem, and the fix is to never let the model supply the facts in the first place.

Competitor discovery is grounded in real search results and real outbound links harvested from real pages; the model's job is to filter and rank what actually exists, not to recall. Page discovery works the same way. Extraction is guarded the same way again. It is the single most likely thing to go wrong in an AI product, so it is defended in three places rather than one.

Knowing what things cost

ScraperAPI's structured Google Search endpoint costs 25 credits per call. A plain page fetch costs 1. Nothing in the pricing page made that obvious — I found it by reading the sa-credit-cost response header.

Quota accounting therefore sums a credits column rather than counting rows. Any feature reaching for the search endpoint has to weight the daily allowance accordingly. Get that wrong and the difference between a working free tier and a 25x billing surprise is one careless feature.

Built with

  • Next.js
  • TypeScript
  • Supabase
  • Stripe
  • Vercel Cron
  • Anthropic Claude

Next

Real-time multiplayer 3D flight game in the browser — self-architected netcode