mirror of
https://github.com/jakejarvis/hoot.git
synced 2025-10-18 14:24:26 -04:00
3.4 KiB
3.4 KiB
🦉 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.
🚀 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
-
Clone & install dependencies:
git clone https://github.com/jakejarvis/hoot.git cd hoot pnpm install
-
Start the dev server:
pnpm dev
Open http://localhost:3000 in your browser.
-
(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 indrizzle.config.ts
. Client atserver/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 inserver/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/*
viaserver/db/seed/providers.ts
. - Trigram search enabled via
pg_trgm
migration indrizzle/
. - No back-compat/migration from Redis snapshots; v2 is a clean switch.
📜 License
Owl logo by Jordy Madueño from Noun Project (CC BY 3.0).