Commit Graph
850 Commits
Author SHA1 Message Date
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 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 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 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 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 a34e1634fc feat: merge main into the placement comparison branch, keeping both the rendered-copy and the placement-batch sentences in the workspace export guide's placement row 2026-09-30 08:20:58 +02:00
Matthew Meszaros d3c0f76002 Merge remote-tracking branch 'origin/main' into calm-marlin-jks7 2026-09-30 06:52:32 +02:00
Matthew Meszaros 57a26c4ee6 feat: attribute a received warmup email moved to spam on the evidence around it before charging anyone, never for mail that arrived in spam (warmup_received.landed_spam), holding each move 30 minutes in warmup_spam_moves and deciding provider on a cross-workspace correlation or a move straight after arrival with nobody there, owner on provider-reported read, unread or star activity in mailbox_owner_activity or a repeated uncorrelated pattern in a used mailbox, nobody otherwise, weighting a spam move as one strike, withdrawing owner verdicts a later correlation explains, clearing the strikes behind a hold an admin lifts or an appeal approves, migration 000233, docs and guide 2026-09-30 06:52:32 +02: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 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 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 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 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
Matthew Meszaros a772868577 feat: render each seed's copy of a placement tracking comparison once, seal it with the workspace key in placement_renders, and send it from both halves so the pixel and wrapped links are the only difference, with a refusal frozen for the pair, the copy pruned when the comparison ends, excluded from workspace exports, and documented in the placement, export and data-control pages 2026-09-29 09:34:32 -07:00
Skylinerffm97andClaude 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
Skylinerffm97andClaude 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
Skylinerffm97andClaude 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 4d5a4e34e3 Merge remote-tracking branch 'origin/main' into fix/warmup-removal-verification 2026-09-29 04:57:45 -07:00
Matthew Meszaros e5eb3b0ff1 feat: re-decide a withdrawn warmup tampering hold on the strikes left in the seven days before it was imposed (on the pool row, or the reputation ledger for a mailbox out of every pool), stamp an old strike verified only when a worker answers its search and ask again after six hours, retry a removal check for a mailbox still loading, redeliver a failed strike, search IMAP folders in one session hold, and share the Message-ID search helpers 2026-09-29 04:57:45 -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 c5a981d86c feat: record a warmup deletion strike only after the worker searches the mailbox and finds the message in the trash or gone, so a move reported as a removal (Graph, a provider filter, a mailbox rule, a second Warmbly instance, our own filing) is never charged, withdraw strikes whose message is still in the mailbox and lift the pause or block they imposed, recheck deletion strikes recorded before the search once via warmup_tampering_events.verified_at (000229), and clarify the tampering reasons and warmup guide 2026-09-29 04:28:34 -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
Skylinerffm97andClaude Opus 5.5 032eb04fba web(nav): announce the current page in a folded section to screen readers, document collapsible sections
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 21:35:35 +02:00
Matthew Meszaros 4c1fc9604b Merge pull request #729 from warmbly/fix/cloud-warmup-standing-gates
feat: hold Warmbly Cloud's warmup standing on a linked self-hosted instance so campaign gates, pacing, lifecycle and account health enforce a cloud quarantine, block or throttle
2026-09-28 17:58:49 +00:00
Matthew Meszaros 92ff20155b Merge pull request #730 from warmbly/fix/warmup-plan-entitlements
feat: limit the Warmup plan to the premium pool and uncapped mailboxes, and lock sending, inbox, AI and integrations behind a plan that sends
2026-09-28 16:36:08 +00:00
Matthew Meszaros f9ef16a36b feat: let a Stripe subscription to a sending plan outrank a Warmup plan grant, report the daily send cap from the sender's own gate (unlimited when uncapped) and refuse a daily-send request that would cap an unlimited plan, detect the Warmup plan by id in the dashboard, show a mailbox override on the Warmup plan card, fall back to period length for the yearly price, derive WarmupPlanID from config, and correct the billing guide on what the server refuses 2026-09-28 09:24:27 -07:00
Matthew Meszaros a268e3c54a feat: limit the Warmup plan to the premium pool and uncapped mailboxes by gating sending, the inbox, AI, integrations, placement tests and paid storage on a plan that sends (HasProductPlan, with HasPremiumWarmup for pool placement), report 0 daily sends and refuse non-mailbox limit requests for workspaces that do not send, lock Warmup workspaces in the dashboard like free ones, show only the mailbox meter for them, and show the yearly price on yearly subscriptions 2026-09-28 09:16:42 -07:00
Matthew Meszaros 53327384b7 feat: carry review-required cloud blocks and the later end of an equal cloud hold into the local pool, keep a cloud hold through a failed unenroll, leave standing changes to the sync so each fires its webhook, skip unchanged standings, read risk bands through the standing-aware health read, report failed standing syncs on the job panel, and document the source field in openapi.json 2026-09-28 09:05:11 -07:00
Matthew Meszaros b3518dd775 feat: resolve the unibox contact panel's sender through the thread's campaign send when the reply comes from an address that is not a contact (alias, second domain, forward, or another workspace mailbox), via thread_id and account_id on GET /contacts/lookup with a match field, gated on unibox access and the API key mailbox allowlist, show a Replied from line and keep a loaded contact on a failed refetch, skip every workspace mailbox when picking the other party, apply the same match to Pause follow-ups when answering the sender, and document it 2026-09-28 09:03:19 -07:00
Matthew Meszaros a749a8e353 feat: hold Warmbly Cloud's warmup standing on a linked self-hosted instance, syncing each enrolled mailbox's health into cloud_link_mailboxes so campaign gates, send plans, lifecycle, risk pacing, account health and the Advisor enforce a cloud quarantine, block or throttle, fire the usual health webhooks and realtime events, and carry a hold into the local pool on unenroll 2026-09-28 08:46:40 -07:00
Matthew Meszaros 950f79c224 feat: keep a stored mailbox photo when its admin grant cannot answer even if the inbox vendor has none, hide Accounts tag chips below lg so the mailbox address keeps its width, and say in the mailbox API reference that only grant and vendor photos are re-checked weekly 2026-09-28 08:17:32 -07:00