Skip to content

Releases: reddoorla/reddoor-maintenance

v0.47.0

18 Jun 17:05
efe7cc7

Choose a tag to compare

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 the announce recipe via the report pipeline's soft-failing GA + Search Console
    enrichment (fetchGaUsers / fetchSearch, now exported) and stored on the Reports
    row (ReportEnrichment; updateReportScores extended for the reuse path).

    Also fixes a latent send-path gap: sendOne re-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 new announcementSiteExtras(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 announceScoreNote copy 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).
  • 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: the Search query is treated as a case-insensitive substring hint
    (contains instead of equals). 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
    exported pickBrandQuery (most-searched) and selectBrandPosition (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

18 Jun 01:36
9d946e8

Choose a tag to compare

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 / maintenanceChecks copy 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 unused announceMonitorItems copy key is dropped.

v0.45.0

18 Jun 01:23
9790dcb

Choose a tag to compare

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
    --preview too.
  • 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 —
    so checklistFor("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

17 Jun 23:12
0448d2c

Choose a tag to compare

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 Certificate is 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",
    Bottlenecks is cut (overlapped automated Lighthouse Performance), and two items
    are added — "Page Titles & Meta" (catches the recurring empty-title regression)
    and "Links & Navigation". ALL_CHECKLIST_FIELDS is 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

17 Jun 22:18
a1bb7b1

Choose a tag to compare

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"); a None pace is omitted so no cadence is over-claimed.
    The score preview is framed as the latest full site test. Adds ReportCadence /
    ReportFrequency types and ReportData.cadence; the announce recipe 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

17 Jun 18:35
0e4fdbe

Choose a tag to compare

Minor Changes

  • 0eb0722: Cockpit now flags a live (maintenance) site that is still served from its
    default *.netlify.app host — 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
    new no-domain filter chip, surfacing a launch-completeness gap that was
    otherwise invisible. A launch period site on *.netlify.app is left alone (no
    domain yet is expected pre-launch). Adds a small isNetlifyAppUrl(url) URL
    predicate (sibling of isHttpUrl) that matches the apex and any subdomain of
    netlify.app without 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 new announce
    recipe + CLI (reddoor announce for all maintenance sites, 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. createDraft gains an optional subjectOverride. The send path is
    reused unchanged — an Announcement renders by type and does not flip Status.

    Operational prereq: add an Announcement option to the Airtable Report 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 bounded maxRecords, instead of paging the entire
    Submissions table 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

17 Jun 06:32
d31b308

Choose a tag to compare

Minor Changes

  • c79e8d5: Field-based notification routing for form submissions. A site can now set a
    Notify Routing JSON 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's interest to 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

16 Jun 16:29
32a02c1

Choose a tag to compare

Minor Changes

  • bea8d7b: Newsletter submissions can now be added directly to a per-site Mailchimp audience
    (no Zapier hop) when the site's new Mailchimp 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 Webhook remains available for other integrations.

v0.39.0

15 Jun 21:06
c772544

Choose a tag to compare

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

15 Jun 19:47
62a7521

Choose a tag to compare

Minor Changes

  • 2624486: Add createIngestEndpoint — a JSON POST-handler factory for client-driven
    forms (modals/lightboxes/fetch), the sibling of createIngestAction. Screens
    the honeypot, validates formType against SUBMISSION_FORM_TYPES, forwards to
    the dashboard ingest, and returns { ok }-shaped JSON.