Features
- Multi-site — add sites, generate/rotate IndexNow keys, bulk Submit / Sync / Verify / Delete
- Sitemap diffing — fetches sitemaps, submits only new or changed URLs, batches up to 10,000 per request
- Three submission modes per site — manual (dashboard button), scheduled (hourly / 6 h / daily cron), or webhook (POST /hook/:siteId from your CMS or build pipeline)
- Key file helper — copy or download the exact <key>.txt content directly from the dashboard
- Discord notifications — optional webhook with per-event toggles and a test button
- Simple auth — optional login gate via ADMIN_EMAIL / ADMIN_PASSWORD. Set AUTH_ENABLED=false to skip entirely
- One process — Fastify serves the API and React dashboard on a single port. SQLite, no external services
Quick start
Add a site, host the generated key file at https://<your-domain>/<key>.txt, then submit.
Auth
Set ADMIN_EMAIL, ADMIN_PASSWORD, and AUTH_SECRET in .env to enable the login gate. Leave them empty or set AUTH_ENABLED=false to run without auth. Changing credentials never affects your stored sites or URLs.
Production
See .env.example for all options. The SQLite database lives at ./data/indexnow.db — back that file up and you've backed up everything.
Docker
Open http://your-server:3020 and sign in.
Stack
Fastify · Drizzle + better-sqlite3 · React + shadcn/ui + Tailwind v4 · node-cron
- src/server/ Fastify, auth, Drizzle schema, submission engine, cron
- src/client/ React SPA (Vite)
- drizzle/ SQL migrations (applied automatically at boot)
Contributing
PRs welcome — see CONTRIBUTING.md. Run pnpm exec tsc --noEmit && pnpm build before pushing.
Security
See SECURITY.md. Do not open a public issue for security problems.
License
MIT License