Releases: reddoorla/reddoor-maintenance
v0.47.0
Minor Changes
-
27f064d: The announcement email now shows the testing/maintenance checks as a checkmark
list (a green ✓ per item under each pace, mirroring the report's checklist) and
gains a TRAFFIC & SEARCH section — visitors for the last ~30 days with an
up/down trend vs the prior window, plus the page-1 Google position — fetched live
by theannouncerecipe via the report pipeline's soft-failing GA + Search Console
enrichment (fetchGaUsers/fetchSearch, now exported) and stored on the Reports
row (ReportEnrichment;updateReportScoresextended for the reuse path).Also fixes a latent send-path gap:
sendOnere-rendered a sent Announcement WITHOUT
its cadence/improvements (they aren't stored on the row), silently dropping the whole
"WHAT TO EXPECT" section from the delivered email. A newannouncementSiteExtras(site)
helper re-derives them from the Websites row and is shared by both the draft preview
and the send re-render, so the sent email matches what the operator reviewed. -
636cfd3: Announcement + report email polish:
- The score-preview accessibility label is now "Readability (A11y)" (was
"Readability") in both the announcement and the monthly report, so the parenthetical
makes the meaning explicit. - The announcement's WHAT TO EXPECT checks now use the report's own green check image
(cid:rd-check-png, attached inline at send) placed after each label, so the
announcement's checks match the monthly report exactly (replacing the inline✓glyph;
alt="✓"is the fallback shown in the attachment-less review preview). - New optional
announceScoreNotecopy field renders a thin-italic gloss under the
Lighthouse scores ("These are independent Google Lighthouse scores, each out of 100 —
higher is better."); a blank value omits it. - The Testing checklist item "Verified After Updates" is relabeled "Tested After
Updates" (display-only — the Airtable checkbox column key is unchanged, so no
live-base migration).
- The score-preview accessibility label is now "Readability (A11y)" (was
-
b09bf20: Search Console brand matching is now robust to phrasing. The report/announcement
"brand search position" no longer depends on the operator typing the exact query
string: theSearch queryis treated as a case-insensitive substring hint
(containsinstead ofequals). Among the matching user queries we report the
position of the exact-match query when present (a precisely-configured brand query
is honored verbatim — no longer-tail variant can hijack the number), otherwise the
most-searched matching query (highest impressions, tie-break best position). New
exportedpickBrandQuery(most-searched) andselectBrandPosition(exact-first then
fallback). So "red door creative" is honored exactly, "red door" still resolves to the
brand's top query, and a near-miss like "reddoor creative la" no longer silently returns
nothing. Backward-compatible — an exact string contains itself, so every currently-working
site keeps its result.
v0.46.0
Minor Changes
- 19f4bd9: The announcement email's "WHAT TO EXPECT" section now spells out what each pace
covers: under "Full site testing" and "Routine maintenance" it lists that pass's
specific checks inline (middot-separated), pulled from the same
testingChecklist/maintenanceCheckscopy arrays the monthly report renders —
so the announcement and the report can never drift. The now-redundant standalone
"WHAT WE MONITOR" block is removed (its items are covered by the expanded section
plus the score preview), and the unusedannounceMonitorItemscopy key is dropped.
v0.45.0
Minor Changes
- 3d2f0df:
report <slug>gains a--type <Maintenance|Testing>flag so the operator can
draft a Testing report (not just the default Maintenance) for a single site on
demand. Type parsing is case-insensitive and validated before any Airtable access,
so a bad value fails fast without credentials; Launch and Announcement are
rejected with a pointer to their own commands (launch/announce). Works with
--previewtoo. - bdc2813: A Testing report now gates on all 13 checklist items (the 6 maintenance items
plus the 7 testing items), not just the 7 testing ones. A testing pass also
performs the maintenance checks — and the Testing email already shows both lists —
sochecklistFor("Testing")returns maintenance-then-testing, the dashboard
renders all 13 checkboxes, and approve/send stay blocked until every one is
checked. Maintenance reports are unchanged (still gate on their 6 items);
Launch/Announcement remain ungated.
v0.44.0
Minor Changes
- 698b097: Revise the maintenance and testing checklists (the operator gate + client-email
lines, kept in sync). Maintenance stays 6 items but is sharpened:Reviewed Logs
→ "Deploy & Function Health",DNS Checked→ "Domain, DNS & SSL" (absorbs SSL),
Reviewed Certificateis cut (Netlify auto-renews — it overlapped), and a new
"Uptime Checked" is added. Testing grows 6 → 7:Package Updates→ "Verified
After Updates",Animation Functionality→ "Interactions & Animations",
Bottlenecksis cut (overlapped automated Lighthouse Performance), and two items
are added — "Page Titles & Meta" (catches the recurring empty-title regression)
and "Links & Navigation".ALL_CHECKLIST_FIELDSis now 13; "Google Indexed"
stays at maintenance index 3 so the email keeps injecting the live search
position. The two cut Airtable columns are retired (renamed, no longer read) and
can be deleted in the UI.
v0.43.0
Minor Changes
- 1908fba: Reframe the announcement email (shipped in 0.42.0) from "your new monthly report"
to an ongoing site-care message. It now states each client's testing and
maintenance cadence, read from the Websites row (testing freq/
maintenence freq) and rendered as a "WHAT TO EXPECT" section (e.g. "Full site
testing — every quarter"); aNonepace is omitted so no cadence is over-claimed.
The score preview is framed as the latest full site test. AddsReportCadence/
ReportFrequencytypes andReportData.cadence; theannouncerecipe passes
each site's frequencies and uses a "Your testing & maintenance schedule for
" subject. - 6a08456: Maintenance/Testing reports now gate on a per-item operator checklist: 12 checkbox fields on the Reports row, flippable in Airtable AND as interactive checkboxes on the dashboard per-site page; the Approve button is disabled and the approve action + send path both refuse until every item for the report's type is checked. The client email is unchanged. Launch/Announcement reports are not gated.
- bbfedd9: Cockpit + per-site dashboard visibility: labels on Lighthouse scores, a setup (N/4) tooltip listing missing onboarding items + a setup section on the per-site page, GA/Search report-source data + a site-details section on the per-site page, and a Home link on the per-site page.
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.
v0.41.0
Minor Changes
- c79e8d5: Field-based notification routing for form submissions. A site can now set a
Notify RoutingJSON column on its Airtable Websites row
({field, routes, default?, cc?}) to address the submission notification by the
value of a submission field (e.g. route a contact form'sinterestto a
different recipient per option), with support for multiple recipients and CC.
Recipients resolve server-side from Airtable only — the submitting site never
supplies an address. The config is parsed defensively (bad/blank JSON → the
site keeps its existing single-POC behavior) and is inert until set, so the
change is a no-op for every current site. The verify guard is preserved:
pre-launch sites still route to the operator with no routing or CC.
v0.40.0
Minor Changes
- bea8d7b: Newsletter submissions can now be added directly to a per-site Mailchimp audience
(no Zapier hop) when the site's newMailchimp API Key+Mailchimp Audience ID
Airtable columns are set. The dashboard ingest upserts the subscriber
(PUT /lists/{id}/members/{hash}, idempotent,status_if_new: subscribed)
best-effort — never blocking or failing the submission. The generic
Newsletter Webhookremains available for other integrations.
v0.39.0
Minor Changes
- f55a128: Submission notification emails now include the submission's
extraFields— the
site-specific context a recipient most needs (the artwork an inquiry is about,
the event an rsvp is for, the company on a contact). Previously these were
stored in Airtable but omitted from the email; now they render as labeled rows
(HTML-escaped, empty values dropped, malformed JSON tolerated).
Patch Changes
- 59da053: Add the reddoor mark as a favicon on the dashboard pages (fleet cockpit + per-site
dashboard), inlined as a data-URI so the function-rendered HTML carries the brand
with no static-asset request.
v0.37.0
Minor Changes
- 2624486: Add
createIngestEndpoint— a JSONPOST-handler factory for client-driven
forms (modals/lightboxes/fetch), the sibling ofcreateIngestAction. Screens
the honeypot, validatesformTypeagainstSUBMISSION_FORM_TYPES, forwards to
the dashboard ingest, and returns{ ok }-shaped JSON.