π Domainstack - Domain Intelligence Tool
Domainstack is an all-in-one app for exploring domain names. Search any domain (e.g., github.com) and get instant insights including WHOIS/RDAP lookups, DNS records, SSL certificates, HTTP headers, hosting details, geolocation, and SEO signals.
- Instant domain reports: Registration, DNS, certificates, HTTP headers, hosting & email, and geolocation.
- SEO insights: Extract titles, meta tags, social previews, canonical data, and
robots.txtsignals. - Screenshots & favicons: Server-side screenshots and favicon extraction, cached in Cloudflare R2.
- Fast, private, no sign-up: Live fetches with smart caching.
- Reliable data pipeline: Postgres persistence (Drizzle), background revalidation (Inngest), and Redis for short-lived caching/locks.
- Next.js 15 (App Router) + React 19 + TypeScript
- Tailwind CSS v4
- tRPC API
- Postgres + Drizzle ORM
- Inngest for background jobs and scheduled revalidation
- Upstash Redis for caching, rate limits, and locks
- Cloudflare R2 (S3 API) for favicon/screenshot storage
- rdapper for RDAP lookups with WHOIS fallback
- Puppeteer (with
@sparticuz/chromiumon server) for screenshots - Mapbox for IP geolocation maps
- PostHog analytics
- Vitest for testing and Biome for lint/format
git clone https://github.com/jakejarvis/domainstack.io.git
cd domainstack.io
pnpm installCreate .env.local (used by pnpm dev):
# --- Database (local) ---
# TCP URL used by Drizzle CLI & direct TCP usage
DATABASE_URL=postgres://postgres:postgres@localhost:5432/main
# --- Redis (local via SRH) ---
# SRH mimics Upstash REST locally; point your appβs Upstash client here.
KV_REST_API_URL=http://localhost:8079
KV_REST_API_TOKEN=dev-token
# --- Inngest Dev Server ---
INNGEST_DEV=1
INNGEST_BASE_URL=http://localhost:8288
# If your Inngest handler lives at a custom route, set:
INNGEST_SERVE_PATH=/api/inngest
# --- Object Storage (Cloudflare R2 in prod; MinIO locally) ---
# Local S3 emulator (MinIO) β the start script will auto-create the bucket when this endpoint is set:
R2_ENDPOINT=http://localhost:9000
R2_BUCKET=development
R2_ACCESS_KEY_ID=minioadmin
R2_SECRET_ACCESS_KEY=minioadmin
R2_PUBLIC_BASE_URL=http://localhost:9000/developmentWe provide a single docker-compose.yml and a helper script (start-dev-infra.sh) that boots all services and waits for them to be ready:
- Postgres on
localhost:5432 - Neon wsproxy on
localhost:5433(WebSocket proxy used by the Neon serverless driver) - Redis on
localhost:6379 - Serverless Redis HTTP (SRH) on
http://localhost:8079(Upstash-compatible REST proxy) - Inngest Dev Server on
http://localhost:8288 - MinIO (S3 API) on
http://localhost:9000(console athttp://localhost:9001)
Run:
pnpm docker:upOn Linux, if
host.docker.internalisnβt available, addextra_hoststo the Inngest and MinIO services indocker-compose.yml:extra_hosts: ["host.docker.internal:host-gateway"]
To stop everything cleanly:
pnpm docker:downpnpm db:generate # generate SQL from schema
pnpm db:migrate # apply migrations to local Postgres
pnpm db:seed:providers # seed known providers in lib/providers/rules/Run in a second terminal window:
pnpm devpnpm dev # start Next.js dev server
pnpm docker:up # start Dockerized local services and wait until ready
pnpm docker:down # stop all Dockerized local services (docker compose down)
pnpm lint # Biome lint/format checks
pnpm typecheck # tsc --noEmit
pnpm test:run # Vitest
# Drizzle
pnpm db:generate # generate SQL migrations from schema
pnpm db:migrate # apply db migrations
pnpm db:studio # open Drizzle Studio against your current env URL
pnpm db:seed:providersToybrick by Ary Prasetyo from Noun Project (CC BY 3.0)
