0.3.2
0.3.2 makes domain renewal state accurate, compact, and actionable.
What’s new
- Authoritative Porkbun renewal data. Connect a Porkbun account to show the real registration expiry, registrar, status, and auto-renew state for covered domains. Certificate inspection stays on direct TLS probes.
- Signed renewal webhooks. Pulse registers
domain.renewedanddomain.expiringevents, verifies HMAC signatures against the raw request body, rejects stale or malformed deliveries, stores receipts durably, and refreshes only after a confirmed Porkbun lookup. - Advance expiry alerts. Optional email alerts fire at 30 and 14 days, retain auto-renew context, deduplicate by domain and renewal cycle, and link directly to Porkbun’s domain manager.
- Clearer expiry presentation. Renewal and certificate warnings now sit beside the monitor URL, tooltips stay inline, and detail views explain the active verification source without false expired states after renewal.
- Operational controls. System settings expose connection health, covered-domain count, webhook state, polling, tests, and alert controls. The REST API, OpenAPI contract, help, deployment guide, operations guide, README, and marketing site cover the integration.
Upgrade notes
Migration 0028_dark_aaron_stack.sql adds the Porkbun integration state, durable webhook receipts, registration source and auto-renew facts, and domain-expiry notification support. Production deployments apply it through the existing migrate-before-traffic gate.
Set PORKBUN_API_KEY and PORKBUN_SECRET_KEY, deploy, then open Settings → System → Domain monitoring to check the connection and enable the webhook. Expiry alerts remain off until an administrator enables them.
Verification
- Full web lint, typecheck, 2,587 tests, and production build
- Full Go build, vet, test, and vulnerability workflow
- Isolated Neon preview migrated and tested end to end
- Production release-bound deploy proof passed
- Production Porkbun poll covers 8 monitored domains
- Production signed webhook test persisted and processed
- Invalid webhook rejected before persistence