Matthew Meszaros
596c395cd0
Merge pull request #792 from warmbly/fix/menus-close-on-email-body-tap
...
feat: close every dashboard dropdown on a tap inside a same-origin iframe such as the unibox email body
2026-10-02 05:37:50 +00:00
Matthew Meszaros
7707f6fb02
Merge pull request #789 from warmbly/fix/unibox-unread-latest-received
...
feat: mark only a conversation's newest received message unread on Mark as unread, never a sent or draft copy
2026-10-02 05:37:48 +00:00
Matthew Meszaros
4183929b29
feat: note in AGENTS.md that useClickOutside also closes on a tap landing in a same-origin iframe
2026-10-01 22:32:51 -07:00
Matthew Meszaros
b2eba2b566
Merge pull request #786 from warmbly/fix/jobrun-persisted-schedule
...
feat: resume every scheduled job from its stored next_run_at after a restart instead of starting a fresh interval, run a job that came due while the process was down right after its phase offset, and claim each slot with a compare-and-swap on next_run_at so a job hosted by several processes runs once per slot
2026-10-02 05:32:37 +00:00
Matthew Meszaros
b894d8f8b9
Merge pull request #790 from warmbly/fix/unibox-leave-select-mode
...
feat: add a Cancel selection button next to the All box in the unibox list header so Select mode can be left on a phone
2026-10-02 05:29:48 +00:00
Matthew Meszaros
e137530895
feat: run the jobrun scheduler tests on the testing/synctest fake clock and cover a claim that errors with or without its write landing, so each slot still runs exactly once
2026-10-01 22:29:39 -07:00
Matthew Meszaros
f01016c64f
feat: close every dashboard dropdown on a tap inside a same-origin iframe such as the unibox email body by listening on the frame's own document in useClickOutside, re-attaching when the frame reloads, since a tap on a phone never moves focus into the frame
2026-10-01 22:27:45 -07:00
Matthew Meszaros
839235069e
feat: add a Cancel selection button next to the All box in the unibox list header so Select mode can be left on a phone without ticking a row or switching folders
2026-10-01 22:25:06 -07:00
Matthew Meszaros
72b332b944
Merge pull request #787 from warmbly/fix/unibox-mark-unread-sticks
...
feat: keep a unibox conversation unread after Mark as unread by skipping the reader's auto-read once the store has moved off its thread
2026-10-02 05:23:09 +00:00
Matthew Meszaros
a84b3bbbf3
feat: mark only a conversation's newest received message unread on Mark as unread, never a sent or draft copy, from the reader, the row menu, the selection bar, PATCH /unibox/seen and the mark_thread_seen AI tool, with the guide and API docs updated
2026-10-01 22:22:56 -07:00
Matthew Meszaros
7841e34119
feat: keep a unibox conversation unread after Mark as unread by skipping the reader's auto-read once the store has moved off its thread, and close the reader when the selection bar marks the open conversation unread
2026-10-01 22:16:59 -07:00
Matthew Meszaros
7c8ed01775
feat: resume every scheduled job from its stored next_run_at after a restart instead of starting a fresh interval, run a job that came due while the process was down right after its phase offset, and claim each slot with a compare-and-swap on next_run_at so a job hosted by several processes runs once per slot
2026-10-01 22:16:16 -07:00
Matthew Meszaros
bada69a408
Merge pull request #781 from warmbly/fix/workspace-selector-click-outside
...
feat: close every dashboard dropdown through one useClickOutside(open, onClose, refs) hook so a press outside, Escape (innermost first) or another dropdown opening closes it
v0.6.18
2026-10-01 17:27:39 +00:00
Matthew Meszaros
8faefb88be
feat: leave Escape to a confirm or modal opened above an open dropdown in useClickOutside, drop ImageMenu's duplicate Escape guard, and restore the useDismissAdvisorFinding and useDismissMailboxImport mutation names the hook rename caught
2026-10-01 10:14:55 -07:00
Matthew Meszaros
76f43b9796
feat: close every dashboard dropdown through one useClickOutside(open, onClose, refs) hook that the shared PopoverMenu, the old useClickOutside callers and the hand-rolled pickers now all use, so a press outside (including inside a floating dialog card or an email iframe) closes it, Escape closes only the innermost one and returns focus to its trigger, and opening one closes the others
2026-10-01 08:38:57 -07:00
Matthew Meszaros
143afaaa5b
Merge pull request #775 from warmbly/fix/cloud-warmup-stalls
...
feat: make Warmbly Cloud warmup start and explain itself for linked mailboxes
2026-10-01 10:35:19 +00:00
Matthew Meszaros
e920b61371
feat: clear a reported warmup send failure only on a confirmed delivery, word the not-loaded send failure as a possible cause, leave placement seeds out of the adopted-mailbox warmup repair, and describe send_failure as a failure reason in the API schema
2026-10-01 03:20:41 -07:00
Matthew Meszaros
a844c506a0
feat: make Warmbly Cloud warmup start and explain itself for linked mailboxes: apply the instance's warmup settings, start warmup on adopted mailboxes, read the warmup day mask Monday-first, report the last refused warmup send and the partner cap to the instance and dashboard, hand changed SMTP credentials to the cloud, refuse cleartext mailboxes at enrollment, and show cloud warmup with the warming animation and a clear Cloud marker
2026-10-01 03:01:36 -07:00
Matthew Meszaros
e25b31f992
Merge pull request #772 from warmbly/fix/unibox-template-html-body
...
feat: send a unibox template's HTML body as written by giving the compose and reply composers an HTML mode, keep that HTML in compose and reply drafts, and render the text part server-side for HTML-only sends
v0.6.17
2026-10-01 04:22:11 +00:00
Matthew Meszaros
e20efd2544
feat: let a portaled popover inside the unibox composers close itself on Escape instead of the composer closing around it
2026-09-30 21:17:28 -07:00
Matthew Meszaros
2a78dc1a25
Merge remote-tracking branch 'origin/main' into fix/unibox-template-html-body
2026-09-30 21:15:35 -07:00
Matthew Meszaros
cfdc0c3d01
feat: keep the signature editor's own plain-text rendering, reuse the campaign HTML-to-text helper in the composers, leave a synced text part to the server, cap HTML bodies in bytes, refuse a send whose HTML was emptied, and keep Escape and AI drafts from discarding HTML composer work
2026-09-30 21:15:29 -07:00
Matthew Meszaros
a072f2a618
Merge pull request #771 from warmbly/fix/mailbox-switch-back-on
...
feat: let a switched-off mailbox be switched back on from its row menu, warmup menu, drawer, settings and the selection bar, and make the Advisor's stop-cold-sending fixes hold the mailbox from campaigns instead of switching it off
2026-10-01 04:08:07 +00:00
Matthew Meszaros
91130a7102
Merge pull request #773 from warmbly/test/unibox-row-menu-one-open
...
feat: test that unibox conversation row menus stay one at a time across right-clicks and close on a press outside them
2026-10-01 04:04:50 +00:00
Matthew Meszaros
f41b377f0c
feat: offer the Advisor's campaign hold only while a mailbox is still sending cold, reseed warmup when an AI tool switches a mailbox on or starts warmup, and fix the mailbox switch's bulk selection, double clicks and revoked-mailbox hints
2026-09-30 21:02:00 -07:00
Matthew Meszaros
ba6c5aa614
feat: test that unibox conversation row menus stay one at a time across right-clicks and close on a press outside them
2026-09-30 21:00:55 -07:00
Matthew Meszaros
85abe0c0ef
Merge pull request #769 from warmbly/fix/popover-menu-outside-close
...
feat: close every PopoverMenu on a press outside it (pointerdown, capture phase, so taps count) and on Escape innermost first, keep one menu open at a time across the dashboard while nested menus stay open, give scope rail row counts room beside the always-visible phone "…" and line section header menus up with the row menus, and say in the unibox guide how the rail menus close
2026-10-01 03:49:55 +00:00
Matthew Meszaros
588591684b
feat: send a unibox template's HTML body as written by giving the compose and reply composers an HTML mode, keep that HTML in compose and reply drafts, and render the text part server-side for HTML-only sends
2026-09-30 20:46:22 -07:00
Matthew Meszaros
7e204ee745
Merge pull request #770 from warmbly/feature/unibox-conversation-context-menu
...
feat: add a right-click menu to unibox conversation rows with open in new tab, read state, snooze, labels and filing, acting on the whole selection from a ticked row
2026-10-01 03:46:07 +00:00
Matthew Meszaros
4e81213557
feat: close every PopoverMenu on a press outside it (pointerdown, capture phase, so taps count) and on Escape innermost first, keep one menu open at a time across the dashboard while nested menus stay open, give scope rail row counts room beside the always-visible phone "…" and line section header menus up with the row menus, and say in the unibox guide how the rail menus close
2026-09-30 20:45:50 -07:00
Matthew Meszaros
7ea17c0150
feat: let a switched-off mailbox be switched back on from its row menu, warmup menu, drawer, settings and the selection bar, and make the Advisor's stop-cold-sending fixes hold the mailbox from campaigns instead of switching it off
2026-09-30 20:45:42 -07:00
Matthew Meszaros
27f0792a39
Merge pull request #768 from warmbly/fix/warmup-prune-args
...
feat: pass each warmup retention prune statement only the arguments it references, so the mailbox_owner_activity delete no longer fails PruneWarmupEventsBefore
2026-10-01 03:43:50 +00:00
Matthew Meszaros
a4b85ebcf9
feat: add a right-click menu to unibox conversation rows (open in new tab, read state, snooze, labels, archive or move to inbox, delete) that acts on the whole selection from a ticked row, closes the open conversation when it files or marks it unread, and share useAnchoredMenu and the label panel with the scope rail and reader
2026-09-30 20:39:10 -07:00
Matthew Meszaros
6e40290798
Merge pull request #766 from Skylinerffm97/feat/unibox-scope-rail-resize
...
[Feature] web(unibox): let the scope rail be resized like the conversation list
2026-10-01 03:35:26 +00:00
Matthew Meszaros
f3e9505457
feat: pass each warmup retention prune statement only the arguments it references, so the mailbox_owner_activity delete no longer fails PruneWarmupEventsBefore and the warmup_received and warmup_tokens prunes after it run, with the live retention test covering the owner activity window
2026-09-30 20:32:28 -07:00
Skylinerffm97
3ec2ff7d95
web(unibox): let the scope rail be resized like the conversation list
...
A drag handle between the scope rail and the list reuses useResizablePane:
drag, arrow keys (Shift for a bigger step), Home/End, Enter or a double-click
to restore the default 220px. The width is kept in the persisted store and
clamped on rehydration; the list re-measures its cap when the rail moves.
2026-09-30 17:18:40 +02:00
Matthew Meszaros
41a388e80a
Merge pull request #760 from warmbly/feat/cloud-domain-redirects
...
feat: check that a verified root redirect actually reaches visitors by opening the domain over http and https and naming what answered instead (Traefik, nginx, Caddy, a rewritten Host header, a missing certificate, a closed port) with per-proxy fix steps in the sending domain drawer, and let a self-hosted instance linked to Warmbly Cloud have Cloud serve and certify its redirects (connect in place from the redirect tab, the bulk dialog or a page banner), with Cloud-side linked-instance redirect endpoints under a per-instance limit, migration 000237, labelled tracking answers and a 503 when the redirect lookup is unavailable, and the sending domains, Warmbly Cloud, data control, install, OpenAPI, API and error code docs updated
v0.6.16
2026-09-30 14:52:51 +00:00
Matthew Meszaros
fbadb837b8
feat: put a linked instance's existing Cloud redirect back when its update is refused, and say in the sending domains guide which unconfirmed checks still show Live
2026-09-30 07:40:22 -07:00
Matthew Meszaros
371eafd9da
feat: renumber the domain redirect serving migration to 000238 after main released 000237
2026-09-30 07:19:59 -07:00
Matthew Meszaros
d64adcc191
Merge remote-tracking branch 'origin/main' into feat/cloud-domain-redirects
2026-09-30 07:18:51 -07:00
Matthew Meszaros
89c0550046
Merge pull request #762 from warmbly/fix/auth-and-permission-hardening
...
feat: harden webhook, passkey, session, OAuth permission and integration signing invariants, and hold remote images in received mail until loaded
2026-09-30 14:05:05 +00:00
Matthew Meszaros
e9b802e99c
feat: insert the received-mail CSP into the parsed document's real head, tie remote-image consent to the message it was given for, check every RevokeOnRefreshReuse error in the live test, and name the signing-key length refusal in the OpenAPI 400
2026-09-30 07:01:13 -07:00
Matthew Meszaros
7b526be901
feat: write a Cloud-served root redirect here before asking Warmbly Cloud (one workspace per domain, enforced by a unique index), roll it back on Cloud's refusal and keep it pending through an outage, release Cloud redirects no workspace here has any more from the sweep, resend a target Cloud holds stale, stop a mirrored redirect only on Cloud's definite refusals, read a proxy gateway error as transient and order the certificate and port verdicts correctly, validate linked domains with the shared hostname check, share one proxy name map, and trim comments
2026-09-30 06:59:55 -07:00
Matthew Meszaros
75f764dc67
feat: require a verified Cloud Tasks token with a pinned audience on task webhooks, manage_settings on integration OAuth and a fresh membership check at every mailbox and integration OAuth finish, user verification for passkey sign-in, ended sessions before a password reset or ban reports success, and a revoked session when a rotated refresh token is replayed; remove the internal DEK delete route, log credential path parameters by name, hold remote images in received mail until the reader loads them, add Calendly and Cal.com signing keys with inbound URL rotation, keep automation signing secrets out of connection responses, and apply the password rules to the bootstrap password
2026-09-30 06:46:24 -07:00
Matthew Meszaros
ef83f10a7e
feat: refuse a root redirect upsert that meets the domain's row held by another owner (a linked instance or the workspace) instead of rewriting it, keep the Warmbly Cloud option closed for a Cloud-served redirect once the link or offer is gone, and say in the sending domains guide that the dashboard preselects Cloud while the API keeps this instance
2026-09-30 06:29:53 -07:00
Matthew Meszaros
d457ad86e3
feat: keep Warmbly Cloud's link-token answers from ever reaching the dashboard as a 401, stop a Cloud-served redirect Cloud refuses to take back, drop a new Cloud row its own check refused, store only reach values this schema knows when mirroring a newer Cloud, read an offer-less Cloud as not serving redirects, confirm bulk moves against the server actually sent, poll the Cloud offer once a minute, and probe without keep-alive connections
2026-09-30 06:21:29 -07:00
Matthew Meszaros
41d43f64be
feat: check that a verified root redirect actually reaches visitors by opening the domain over http and https and naming what answered instead (Traefik, nginx, Caddy, a rewritten Host header, a missing certificate, a closed port) with per-proxy fix steps in the sending domain drawer, and let a self-hosted instance linked to Warmbly Cloud have Cloud serve and certify its redirects (connect in place from the redirect tab, the bulk dialog or a page banner), with Cloud-side linked-instance redirect endpoints under a per-instance limit, migration 000237, labelled tracking answers and a 503 when the redirect lookup is unavailable, and the sending domains, Warmbly Cloud, data control, install, OpenAPI, API and error code docs updated
2026-09-30 06:04:00 -07:00
Matthew Meszaros
282280c596
Merge pull request #759 from warmbly/feature/common-reply-inbox-sender-tracking
...
feat: send each mailbox's reply-to as a Reply-To header and credit replies landing in that shared reply inbox to the campaign and its sending mailbox, shown in the unibox, recent activity and reply webhook (#756 )
2026-09-30 12:41:21 +00:00
Matthew Meszaros
1f0c6ca6d6
feat: send each mailbox's reply-to as a Reply-To header on campaign, unibox, test and placement mail (never warmup), record it on every campaign send attempt (tasks.reply_to, migration 000236) and credit a reply landing in that shared reply inbox to the campaign and its sending mailbox across reply attribution, the sync priority lane and copied-contact replies, show the sending mailbox on thread messages, recent activity and the reply webhook, start unibox and inbox-agent replies from the mailbox that emailed the contact, flag an untracked reply-to in mailbox settings, let the sandbox simulator answer Reply-To, and document the shared reply inbox ( #756 )
2026-09-30 05:33:34 -07:00
Matthew Meszaros
a3c8fa661f
Merge pull request #757 from warmbly/feat/unibox-folder-relay
...
feat: relay unibox Archive, Delete and Move to inbox to the mailbox (#752 )
2026-09-30 12:15:26 +00:00