Work - DomainLert
DomainLert
A SaaS tool that monitors a portfolio of domains and escalates alerts before any of them expire. Built solo, end to end - data model, RDAP checker, billing, marketing.
- Role
- Product · Design · Development
- Stack
- Next.js · Supabase · Stripe · RDAP · Resend

Domain renewals are easy to forget and expensive to miss - a lapsed domain can cost an agency a client. DomainLert watches a portfolio of domains, checks the dates every day, and makes sure the alert reaches the person who can actually renew it, while there’s still time.
What it does
- Bulk import. Paste or upload a list of domains; the dashboard shows expiry date, days remaining, registrar, status, and last-checked time in one view.
- Adaptive checking. A daily cron job runs an RDAP lookup per domain, with a paid WHOIS API as fallback for TLDs that don’t support RDAP.
- Escalating alerts. Configurable thresholds (30 / 14 / 7 days by default), multiple recipients per domain, and a de-dupe layer so nobody gets the same warning twice.
- Honest limits. One flat plan. A 1,000-domain account cap that’s enforced with a clear “contact support” message rather than a silent failure.
How it’s built
| Layer | Choice |
|---|---|
| Framework | Next.js (App Router, React) |
| Database & auth | Supabase (Postgres + built-in auth) |
| Payments | Stripe - Checkout, Customer Portal, webhooks synced to Supabase |
| Resend for transactional alerts | |
| Domain data | Self-hosted RDAP client, with a WHOIS API fallback |
| Hosting | Self-hosted via Coolify |
Every layer: the schema (domains, subscriptions, alerts_sent), the check-and-escalate logic that runs on schedule, the Stripe integration handling billing end to end, and the public site itself - editorial layout, inline dashboard preview, the works. It’s the clearest proof I have of shipping a product, not just a feature.
Status
Free while in early access - the first 100 accounts get every feature at no cost. A single paid plan is planned for after early access.