Add a thread_id filter for scheduled Unibox sends and expose a per-thread hook for the dashboard.
Render queued sends inline in ThreadView with cancellation, refreshing the thread, scheduled list, and overview caches after cancel.
Expose the Unibox scope rail through a mobile sheet so smaller screens can switch between inbox scopes, mailboxes, tags, and scheduled views.
Simplify template rows in the reply composer to keep the picker compact.
Open the reply composer only after the user chooses a message to reply to or forward, and wire per-message actions through the thread view.
Also clean up cancelled scheduled sends from Cloud Tasks on a best-effort basis while keeping the database status as the source of truth.
Add scheduled-send scope, queued-send review and cancel flows, richer reply composer controls, snooze picker polish, and API client models for the new Unibox endpoints.
Three surfaces close the loop on the limit-increase workflow:
- admin/dashboard/LimitRequestsPage.tsx queues every pending request
with full context (org → users → field → current vs requested →
+delta) and one-click approve/reject. Both actions open a review
dialog; approve notes are optional, reject notes are required and
surface to the customer.
- web/settings/limits/page.tsx is the customer-facing form. Resource
selector, requested value, reason textarea, plus a list of every
past request with its status (pending/approved/rejected/cancelled)
and the reviewer's notes when present. Pending rows expose a
cancel link. Footer links to the ToS limits clause.
- site/terms.astro grows a new section 07 ("Usage limits and
increase requests"). Explicit: "unlimited" means no plan-tier cap
but a product-wide hard ceiling still applies, increases are at
Warmbly's sole discretion, and previously granted increases can be
revoked when reputation signals deteriorate. Bumps every existing
section heading and id from 07 onward.
Admin sidebar grows a "Limit requests" entry under Accounts (Gauge
icon). Web settings layout grows a "Limits" section under owner-only
sections.
Removes DMARC reports, DNS verifier, Postmaster snapshots, and DNS
verifications from the dashboard. Adds connect-drawer fields for the
new catalog set (HubSpot, Salesforce, Pipedrive, Close, Zapier, Make,
n8n, Slack, Discord), keeps Calendly, Cal.com, and Google Sheets.
Category order is now CRM, Automation, Notifications, Meetings, Data.
Mirrors the backend models in TypeScript and adds React-Query hooks for
catalog, connections, DMARC reports, meeting bookings, DNS verifications,
and the connect / disconnect / verify mutations.
- useContactTimeline now uses cursor-based useInfiniteQuery (50/page,
before=oldest cached at) instead of a one-shot fetch
- search input filters subject/content/campaign/sequence/mailbox/
reason/intent; matches are highlighted in the row
- date range picker (popover with from/to + 7/30/90d presets) filters
the visible list by event timestamp
- segmented type chips with motion indicator
- IntersectionObserver sentinel auto-fetches next page as user scrolls
- when filters narrow the visible set, lazy-prefetch more pages so
results aren't artificially short (bounded to 250 events / 5 pages)
- skeleton rows with staggered pulse on first load, inline spinner on
subsequent page loads, "end of history" marker when done
- drop colored timeline rail and per-type dot colors
- collapse per-event bordered cards into one bordered list container
with divided rows (matches Overview's "Latest activity" treatment)
- segmented filter strip with motion indicator, matches main tab strip
- quote-style left border for body content (notes, reply snippets)
instead of a free-floating block
- solid slate-100 round avatar with slate-700 initials (no gradient)
- single contextual status pill only when something is off
(suppressed/unsubscribed); no chip when everything's fine
- text-only segmented tab strip, drop icons + side tint band
- flat stat tiles, no gradient hero variant
- keep animated motion indicator on tabs and email copy affordance