1
mirror of https://github.com/jakejarvis/hoot.git synced 2025-10-18 07:24:26 -04:00
2025-09-22 10:58:27 -04:00
2025-10-14 13:27:48 -04:00

🦉 Hoot - Domain Intelligence Tool

Hoot.sh 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 Hoot 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/hoot.git
    cd hoot
    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

Owl logo by Jordy Madueño from Noun Project (CC BY 3.0).

Description
Languages
TypeScript 98.9%
CSS 1.1%