Changelog

1.3.3

  • theme-init.js and islands.js are content-hashed and cache for a year. theme-init still runs before paint. favicon.ico caches for one day.
  • Verification email can use a Resend-compatible HTTPS API or SMTP. DNS records are in docs/ops/email.md.

1.3.2

  • Marketing pages are static HTML. Theme, language, pricing, and the demo no longer hydrate the whole page with React.
  • Images, fonts, and hashed files cache for a year. HTML caches for 60 seconds.

1.3.1

  • FireHOL level 1 and level 2 are off by default because they include DShield (SANS ISC) data, which forbids resale. The default blocklist is stamparm ipsum level 3 (The Unlicense), with attribution.
  • The data-sources page states the licence for each feed. security.txt Policy points at the security page.
  • The API host serves /openapi.yaml. /docs on that host redirects to the documentation site.

1.3.0

  • The public site and the dashboard share one type and color system, with /vi and /en.
  • The public demo adds GET /v1/demo/me, which scores the caller when the API sits behind a trusted proxy.

1.2.0

  • The dashboard is Next.js 16. npm audit at high severity is clean.
  • A live key needs a verified email. Disposable inboxes are blocked. The free plan allows 100 calls a day, reset at midnight Asia/Ho_Chi_Minh.
  • Spamhaus DROP is on by default, with credit. Handler tests run on Postgres and Redis. CI requires 70% coverage.

1.1.0

  • reasons[] includes signal, weight, source, and text, plus data_freshness.
  • API keys are stored as a peppered HMAC and shown once.
  • Login lockout, 429 rate limits, CORS limited to the site origins, and queried IPs are not stored.