Project
Rival Radar
AI-driven competitor-intelligence SaaS — Next.js, Supabase, Stripe, Vercel Cron
- Role
- Status

- 25×
- RLS
- Daily
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
Real-time multiplayer 3D flight game in the browser — self-architected netcode