Product mail is a branded HTML template
Alerts, password resets and client reports now arrive as HTML rather than plain text, from the same `lib/email.ts` path that already preferred Cloudflare Email Sending over a vendor key.
Newest first, and each entry names the commit that carried it so the change can be read directly. Faults are listed here next to features: a fix to something we got wrong is worth more to a reader than an announcement.
RSS · Service status · Check methodology
Alerts, password resets and client reports now arrive as HTML rather than plain text, from the same `lib/email.ts` path that already preferred Cloudflare Email Sending over a vendor key.
· Rank tracking
A vendor poll that never returned left a rank config running indefinitely. It now times out, fails the run rather than the config, and pairs sandbox rows by id when the tag is dropped. Both found by a check written before the fix.
· Local SEO
The first review fetch sets a baseline and sends nothing — a baseline is a snapshot, not news. Later runs compare against it, so a business with 400 reviews does not get 400 alerts on setup.
· Monitoring
The monitoring screen counted against one number while the API enforced another. The screen now reads the same limit the check does.
· Monitoring
A monitor re-checks a URL on a five-minute clock, compares the run to itself, and emails only when something changed. Critical is a page that left the index or an AI crawler's reach; a check that did not run last time is not a regression. A run costs 0 credits and that is asserted in two ways.
· AI visibility
A diagnosis handed the reader a link to crawlwise's own pages instead of theirs. It now names the reader's site, which is what the step was always supposed to say.
· Local SEO
A local task whose collector died sat pending for ever while the generic sweep quietly reclaimed its hold — so a late collection would have delivered bought data for free. Sweeping now runs first, to completion, for that reason.
· AI visibility
Four models asked a prompt, one row per model per prompt, and an ordered diagnosis that explains the silence: a crawler that cannot read the site is the answer and everything below it is deferred. There is no AI visibility score anywhere, and the word survives in the source only in the sentence explaining why.