1
mirror of https://github.com/jakejarvis/hoot.git synced 2025-10-18 20:14:25 -04:00
Jake Jarvis 86cadac589 Refactor SVG logo component for cleaner code
Removed unnecessary attributes from the SVG element and updated path elements to include the 'currentColor' fill.
2025-10-18 20:05:29 -04:00
2025-10-18 13:59:11 -04:00
2025-09-22 10:58:27 -04:00
2025-10-14 13:27:48 -04:00

🦉 Domainstack - Domain Intelligence Tool

Domainstack is a all-in-one app for exploring domain names. Easily search for any domain (like github.com) and get instant insights including WHOIS info, DNS records, SSL certificates, HTTP headers, hosting details, and geolocation.

Screenshot of Domainstack domain analysis page for GitHub.com


🚀 Features

  • Super Simple Search: Enter any domain name and instantly view everything you need.
  • Comprehensive Reports: See registration info, hosting & email, DNS records, SSL certificates, and HTTP headers.
  • Interactive UI: Expand/collapse sections, copy data, and enjoy beautiful dark mode.
  • Fast & Private: Data is fetched live, with caching for speed—no sign-up required.
  • Favicons & Screenshots: Extract favicons and capture homepage screenshots, cached on UploadThing for quick reuse.

🛠️ Tech Stack

  • Next.js 15 (App Router)
  • React 19
  • TypeScript
  • Tailwind CSS v4
  • tRPC API endpoints
  • Upstash Redis for caching
  • UploadThing for favicon & screenshot storage
  • rdapper for RDAP registration lookups with WHOIS fallback
  • Puppeteer for server-side screenshots
  • Mapbox for embedded IP geolocation maps
  • PostHog for product analytics
  • Biome linting and formatting

🌱 Getting Started

  1. Clone & install dependencies:

    git clone https://github.com/jakejarvis/domainstack.io.git
    cd domainstack.io
    pnpm install
    
  2. Start the dev server:

    pnpm dev
    

    Open http://localhost:3000 in your browser.

  3. (Optional) Configure .env.local:
    See .env.example for Redis and UploadThing credentials (needed for caching and favicon/screenshot features).


🔄 v2 Cutover: Postgres + Drizzle + Inngest

  • Primary store: Postgres (Neon). All domain sections persist to tables in server/db/schema.ts via Drizzle.
  • Drizzle: Schema/migrations in drizzle/. Config in drizzle.config.ts. Client at server/db/client.ts.
  • Redis role: Short-lived locks, rate limiting, and image/report caches only (no primary data). See lib/cache.ts, lib/report-cache.ts.
  • Background jobs (Inngest):
    • app/api/inngest/route.ts serves functions.
    • section-revalidate: re-fetch a section for a domain.
    • domain-inspected: fans out per-section revalidation.
    • scan-due: cron to enqueue revalidations for stale rows.
  • TTL & freshness: Policies in server/db/ttl.ts. Each service reads from Postgres first and revalidates when stale.
  • Services: server/services/* now read/write Postgres via repos in server/repos/*.

Environment

  • DATABASE_URL (required)
  • Redis/UploadThing/PostHog remain as before (see .env.example).

Commands

# Drizzle
pnpm drizzle:generate
pnpm drizzle:migrate

# Dev / checks / tests
pnpm dev
pnpm lint
pnpm typecheck
pnpm test:run

Notes

  • Provider catalog is seeded from lib/providers/rules/* via server/db/seed/providers.ts.
  • Trigram search enabled via pg_trgm migration in drizzle/.
  • No back-compat/migration from Redis snapshots; v2 is a clean switch.

📜 License

MIT

Toybrick by Ary Prasetyo from Noun Project (CC BY 3.0)

Description
Languages
TypeScript 98.9%
CSS 1.1%