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
d64adcc191
Merge remote-tracking branch 'origin/main' into feat/cloud-domain-redirects
2026-09-30 07:18:51 -07: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
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
Matthew Meszaros
b4312d7ec1
feat: keep favorites starred during a Favorites edit, re-highlight in Favorites after a scope is reached by shortcut or Back, name the target of a renamed view on hover, word the hide toast by where the highlight is, route the edit-mode star through the menu's add, cap favorite names by code point, and memoize the mailbox, label and tag rail rows
2026-09-30 04:57:00 -07:00
Matthew Meszaros
e3c9ddde01
feat: add an optional Favorites section to the top of the unibox scope rail that gathers starred Mail, Views, Mailboxes, Labels and Tags rows with live counts, starred from any row's menu or the Mail and Views edit mode, folding, moving, reordering and renaming like the other sections, removable with undo, remembered per browser, with tests and the unibox guide updated ( closes #743 )
2026-09-30 04:43:27 -07:00
Matthew Meszaros
b2d6d100dd
feat: relay unibox Archive, Delete and Move to inbox to the mailbox itself through a new MESSAGE_FOLDER worker command (Gmail label batchModify, Outlook well-known folder moves with the message map re-keyed around each Graph id change, IMAP MOVE after locating each message by Message-ID), answered by relayed UPDATE_FOLDER events that write only provider_folder and the moved handles, relaying every row a filing moved so an Undo right after Archive still reaches the mailbox, with a per-mailbox Mirror Archive and Delete switch (email_accounts.relay_folder_moves, migration 000235, on by default), warmup receipts, drafts and non-Gmail sent copies left in place, and the unibox, mailboxes, API, events and OpenAPI docs updated
2026-09-30 04:41:03 -07:00
Matthew Meszaros
fa72fe6d57
Merge pull request #753 from Skylinerffm97/fix/navtip-stale-open
...
web(nav): open no rail tips on collapse for rows hovered while expanded
2026-09-30 11:14:05 +00:00
Skylinerffm97
77f38fad1a
feat: keep dashboard sidebar tooltips shut on collapse for rows hovered while expanded by letting only the collapsed rail open a NavTip and dropping any stale open state when the mode flips, with a unibox layout test for the collapse and round trip ( fixes #742 )
2026-09-30 04:09:20 -07:00
Matthew Meszaros
184e26a427
feat: call contact categories and inbox labels one name, Labels, across the dashboard (contacts tab moved to /app/contacts/labels with a redirect, pickers, filters, import, export, forms, segment field, timeline, and the Add label, Remove label and Label conversation automation actions), backend messages, AI tool descriptions and docs, keeping every API field name unchanged
2026-09-30 06:17:57 +02:00
Matthew Meszaros
045d13d281
feat: let segment membership writes take the same contact selection limits as every other bulk action, raise select-all to 250,000 contacts and explicit id batches to 10,000, check the research batch cap in the dashboard before confirming, and document the new limits in the guides, error codes and OpenAPI spec
2026-09-30 06:13:14 +02:00
Matthew Meszaros
792b0506bc
feat: return the passkey button to ready after an aborted explicit sign-in so it can be retried, and document that a new worker command type must be safe to lose while the fleet is still on the previous release
2026-09-29 20:27:26 +02:00
Matthew Meszaros
e76cdc6f3a
Merge remote-tracking branch 'origin/main' into fix/recent-posthog-errors-2
2026-09-29 20:13:29 +02:00
Matthew Meszaros
4b0446042a
Merge pull request #750 from warmbly/feature/batch-inbox-placement-tests
...
feat: run one inbox placement test across many sending mailboxes as a placement batch, with server-side sender scopes, sampling, bounded concurrent execution, fleet grouping and coverage
2026-09-29 17:59:48 +00:00
Matthew Meszaros
d162f0aaf6
Merge pull request #748 from warmbly/fix/gmail-archive-unibox-inbox-sync
...
feat: file Gmail mail where Gmail moves it (archive, delete, spam, back to inbox) via an UPDATE_FOLDER event resolved against provider_folder, repair rows already stranded in the unibox Inbox with a six-hourly Gmail folder reconciliation, and close the open unibox conversation on a scope change with a close button in the reader header
2026-09-29 17:57:41 +00:00
Matthew Meszaros
80ecadb1e6
Merge remote-tracking branch 'origin/main' into feature/batch-inbox-placement-tests
2026-09-29 10:51:41 -07:00
Matthew Meszaros
3290360333
feat: keep the Gmail folder reconciliation going past a message Gmail refuses, list the inbox by label, remove rows Gmail no longer has, retry a failed pass after 15 minutes, report each Gmail move once per tick, answer the internal listing with a fixed error, and keep the conversation open when widening to All mail
2026-09-29 10:40:34 -07:00
Matthew Meszaros
d902fc226e
Merge pull request #744 from Skylinerffm97/feat/unibox-scope-rail-customize
...
web(unibox): fold the scope rail sections and let people hide Mail and Views rows
2026-09-29 17:33:41 +00:00
Matthew Meszaros
fd8b9ac844
feat: animate the unibox scope rail (row folds, sliding active highlight, edit-mode swap), let people drag or keyboard-reorder Mail and Views rows and move whole sections, add row and section menus with right-click, hide-with-undo and reset, and give the shared PopoverMenu pointer anchoring, arrow-key and typeahead navigation and focus return
2026-09-29 10:30:03 -07:00
Matthew Meszaros
505d10cdc8
Merge pull request #747 from warmbly/fix/sidebar-rail-and-lead-checkboxes
...
feat: steady sidebar icons on collapse and themed lead-list checkboxes
2026-09-29 17:23:19 +00:00
Matthew Meszaros
b0408cf5a0
Merge pull request #749 from warmbly/fix/import-file-cells-stay-text
...
feat: keep uploaded file cells (import preview sample rows, column samples and headers, failed-row emails and values) as text in the dashboard API client instead of reviving timestamp-shaped cells into Dates that crash the contact import mapper
2026-09-29 17:23:12 +00:00
Matthew Meszaros
ca66b25d8d
feat: register the release's bus schemas from the booting backend and hold the fleet on its current release until the backend runs the new one and the schema registry accepts them, check every published schema against a recorded snapshot in CI (make schemas) so a change the registry would refuse fails before merge, pin a FORWARD or FULL registry subject to BACKWARD on refusal, bound advisor narration so the run still lands, store unlabelled 8-bit mail with its invalid UTF-8 replaced, treat a pending or credential-less passkey ceremony as a cancellation, and drop link-scanner rejections from site error tracking
2026-09-29 19:20:07 +02:00
Matthew Meszaros
f3004510f1
feat: keep uploaded file cells (import preview sample rows, column samples and headers, failed-row emails and values) as text in the dashboard API client instead of reviving timestamp-shaped cells into Dates that crash the contact import mapper
2026-09-29 10:19:50 -07:00
Matthew Meszaros
d99a09825f
feat: run one inbox placement test across many sending mailboxes as a placement batch (issue #736 ): server-side sender scopes (a campaign's senders or the whole workspace, filtered by provider, domain, tag and untested days) and sampling (random, percent stratified by provider or domain, per domain, per provider) snapshotted at creation, a runner that starts senders under per-workspace and instance-wide concurrency and a start rate with defer or skip for unavailable mailboxes, aggregate placement by sending domain, sending provider and recipient provider, fleet coverage, cancel, credits agreed per batch, org transfer, operator settings in the admin panel, dashboard pages and dialog, CLI commands, agent tools, OpenAPI and docs
2026-09-29 10:19:46 -07:00
Matthew Meszaros
39ccb8ad27
feat: keep sidebar icons and the profile avatar at one position while the rail collapses by matching the row and avatar margins and padding in both shapes, and use the shared sky Checkbox for the new campaign flow's lead-list cards and the placement seed chooser instead of black check squares
2026-09-29 10:19:35 -07:00
Matthew Meszaros
5fdb2e40a5
feat: keep a refused lead copy from spending the lead's send attempts, drop campaign-wide CC and BCC addresses that bounced on the campaign, resolve copies only for email steps, fail a reply or link unsubscribe when the lead's copies cannot be read instead of guessing, credit a copy's message to a lead only when it replies in a thread, show each copy's status in the Leads CC badge, and close the CC picker on Escape from any focused child
2026-09-29 10:11:17 -07:00
Matthew Meszaros
0ed98a8c55
feat: copy up to two colleagues on every email a campaign sends one lead (campaign_lead_cc, migrations 000230-000231) with a drawer CC editor that suggests same-company contacts, hold a copied contact's own lead so nobody gets two threads, count a copy's reply as the lead's, opt out every copy on a link unsubscribe, drop a bounced or refused copy without bouncing the lead, skip suppressed campaign CC and BCC addresses, and document the endpoints, CLI, skills and OpenAPI
2026-09-29 09:53:27 -07:00
Matthew Meszaros
e2f319cfd8
feat: file Gmail mail where Gmail moves it (archive, delete, spam, back to inbox) via an UPDATE_FOLDER event resolved against provider_folder, repair rows already stranded in the unibox Inbox with a six-hourly Gmail folder reconciliation, and close the open unibox conversation on a scope change with a close button in the reader header
2026-09-29 09:43:13 -07:00
Skylinerffm97 and Claude Opus 5.5
4cffd2259e
web(unibox): one Mail block without the gap, and a quiet pencil that darkens on hover
...
The gap split Drafts/Sent/Scheduled/Archive/Trash off from the rest, but they
are all mail. The pencil now rests at the section label's slate-400 and only
darkens on hover or focus, like the rest of the header.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-29 16:27:47 +02:00
Skylinerffm97 and Claude Opus 5.5
daebe3bf20
web(unibox): slate-500 for the hidden-rows hint and the pencil at rest (4.7:1)
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-29 16:05:51 +02:00
Skylinerffm97 and Claude Opus 5.5
b4b6595f47
web(unibox): read the hidden-rows hint with the pencil and give both the header label's weight
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-29 16:01:33 +02:00
Skylinerffm97 and Claude Sonnet 5.5
2fcd90291a
web(unibox): edit rail rows with a pencil and show how many are hidden
...
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-09-29 15:51:41 +02:00
Skylinerffm97 and Claude Opus 5.5
9f06aa4f1c
web(unibox): say highlighted count in the rail's dot comments too
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-29 15:31:09 +02:00
Skylinerffm97 and Claude Opus 5.5
d2304d9444
web(unibox): tighten the scope rail's folded dot, edit-mode focus and a11y
...
The dot on a folded header now says what raises it (a highlighted count, which
Scheduled, Awaiting reply and Agent drafts use too, not only unread mail), the
fold button holds still while rows are edited, focus moves into the checkboxes
and back to the options button, rows carry aria-current, and aria-controls
always has a target.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-29 15:27:47 +02:00
Skylinerffm97 and Claude Sonnet 5.5
e4988e3e5f
web(unibox): fold the scope rail sections and let people hide Mail and Views rows
...
Every rail section (Mail, Views, Mailboxes, Labels, Tags) now folds through one
shared header, and the fold is remembered in the persisted store under stable
ids. A folded section still shows the scope you are on and flags hidden unread
mail with a dot. Mail and Views get a three-dot menu with Edit rows: in edit
mode each row is a checkbox, Done or Escape ends it, and hidden rows are only
taken off the rail, so shortcuts, URLs and the active scope keep working.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com >
2026-09-29 15:12:08 +02:00
Matthew Meszaros
06db0c7cf5
Merge pull request #738 from warmbly/feat/campaign-create-flow
...
feat: rebuild the new campaign flow as Leads, Emails, Schedule and Review with a live launch plan and server drafts that reopen from the campaigns list, simulate the campaign estimate day by day under warmup graduation and warmup sharing the send spacing, and retire one-time emails
2026-09-29 12:19:52 +00:00
Matthew Meszaros
1846661218
feat: keep leads a segment link enrolled but that left the segment in the draft audience count, fall back to the default window when a saved one runs backwards, and leave a draft's steps untouched when a step the flow did not load or create appears
2026-09-29 05:14:07 -07:00
Matthew Meszaros
deea70fd42
feat: anchor the campaign estimate timeline tooltip on the hovered bar instead of a fraction of the row width
2026-09-29 05:03:38 -07:00
Matthew Meszaros
b6075391a3
feat: count only a draft's non-segment leads alongside its chosen lists in the campaign estimate and fill unsent estimate settings from the saved campaign, keep branches added on the Steps tab while the new campaign flow is open, renumber automatic step names, and read a draft's lead count without analytics access
2026-09-29 04:52:37 -07:00
Matthew Meszaros
9ed3c6eaae
feat: keep campaigns.kind until every node stops reading it, count a saved draft's own leads and hand-picked senders in the campaign estimate via campaign_id with the 08:00-18:00 window as the default, make a failed draft save retry as an update, keep Steps-tab step names, gate draft reopening on manage campaigns and save schedule-only edits on close
2026-09-29 04:43:25 -07:00
Matthew Meszaros
0c0b932691
feat: mark the sidebar row for the current page with aria-current so a folded section announces where you are, and assert in the unibox layout test that the collapsed rail keeps its label in the link as a faded column rather than an sr-only span
2026-09-29 04:28:59 -07:00
Matthew Meszaros
bed5194d66
feat: animate collapsing the sidebar to its icon rail by morphing each nav row, the collapse toggle and the profile card in place (icons hold position while labels fade and clip), shrinking the section headers away, folding out rail sections with nothing left to show, and cross-fading the live stats panel with an eased height
2026-09-29 01:49:38 -07:00
Matthew Meszaros
f88ecd7b4c
feat: rebuild the new campaign flow as Leads, Emails, Schedule and Review with a lead-list picker, the full step editor and a live launch plan, keep unlaunched campaigns as server drafts that reopen in the flow from the campaigns list and a Continue setup button, simulate POST /campaigns-estimate day by day under warmup graduation, warmup mail sharing the send spacing, other campaigns, health holds and follow-up waits, retire one-time emails (migration 000229 drops campaigns.kind, the list type filter and badge go), enlarge the step subject field, and lift the editor popovers above dialogs
2026-09-29 01:37:07 -07:00
Matthew Meszaros
77194fb460
feat: animate folding the sidebar's Email, CRM and Resources sections row by row, keep the current page visible in a folded section, flag an Advisor finding on the rows a section hides with a dot on its header, widen the header into a full-width target with a hover chevron, key the fold state by stable section ids inside the persisted warmbly-storage, and update the unibox layout guide
2026-09-29 01:33:20 -07:00