v0.42.0
Minor Changes
-
0eb0722: Cockpit now flags a live (
maintenance) site that is still served from its
default*.netlify.apphost β i.e. it never got a custom domain. The site drops
to the π‘ Watch tier with an "on*.netlify.app(no custom domain)" reason and a
newno-domainfilter chip, surfacing a launch-completeness gap that was
otherwise invisible. Alaunch periodsite on*.netlify.appis left alone (no
domain yet is expected pre-launch). Adds a smallisNetlifyAppUrl(url)URL
predicate (sibling ofisHttpUrl) that matches the apex and any subdomain of
netlify.appwithout being fooled by look-alike hosts. -
d8b06f9: Add a one-time monthly-report announcement email, as a new
Announcement
report type riding the existing draft β approve β send pipeline. A newannounce
recipe + CLI (reddoor announcefor allmaintenancesites, or
reddoor announce <site>for one) drafts a personalized email per client
introducing the recurring monthly report: a live preview of the site's latest
Lighthouse scores (using the same client-facing labels as the real report),
recent-improvement callouts (forms now delivered via Resend; the Svelte 4 β 5
modernization β default-on fleet-wide, with the per-client approve review as the
relevance backstop), and a soft open door to expand scope. Pure-value framing, no
pricing.createDraftgains an optionalsubjectOverride. The send path is
reused unchanged β an Announcement renders by type and does not flip Status.Operational prereq: add an
Announcementoption to the AirtableReport type
single-select before running (the API can't add select options).
Patch Changes
- 7fa8e7a: Per-site submissions are now fetched with a server-side
{Site}filter, a
newest-first sort, and a boundedmaxRecords, instead of paging the entire
Submissionstable on every site-dashboard load and filtering in JS. This
removes the one unbounded full-table scan in the request path as the fleet's
submission volume grows. Internal only β no public API change. - 802e8a9: Lower the form timing-gate threshold (
MIN_FILL_MS) from 2000ms to 800ms. A
too-fast fill is dropped silently (the visitor still sees success), so the old
2s bar risked silently losing a real lead from a quick-but-genuine human
(autofill, a short form, a returning visitor). At 800ms a submit is effectively
instant β which a script does and a human realistically never beats β so the
gate still blocks instant bots while erring toward letting borderline-fast
humans through. The honeypot remains the primary bot signal; this only affects
the server form-action path (createIngestAction), as the modal/JSON path
already screens honeypot-only.