Commit Graph
3074 Commits
Author SHA1 Message Date
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 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
Matthew Meszaros 4bfebe8538 feat: write a relayed folder answer straight to the unibox row without reading it first, since the unibox GetByID marks an unread message seen and archiving unread mail must leave it unread, with a consumer test that fails on any read 2026-09-30 05:11:17 -07:00
Matthew Meszaros d06829e7c3 Merge pull request #758 from warmbly/feature/unibox-rail-favorites
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 rename, reorder and undo (closes #743)
2026-09-30 12:00:48 +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 cf56f81127 Merge pull request #745 from warmbly/fix/placement-compare-frozen-copy
feat: send both halves of a placement tracking comparison the same rendered copy
v0.6.15
2026-09-30 06:32:44 +00: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 d3fc3133da feat: renumber the placement_renders migration from 000230 to 000234 so it follows 000233 on main instead of colliding with the released 000230_campaign_lead_cc 2026-09-30 08:20:39 +02:00
Matthew Meszaros e6fc0ffc64 Merge pull request #755 from warmbly/fix/warmup-single-spam-flag-pause
feat: attribute warmup spam moves on evidence before charging the recipient
2026-09-30 05:14:54 +00:00
Matthew Meszaros 0ce8a6ee79 feat: claim each held warmup spam move with a lease, fix its verdict before applying any effect and complete it only after every sender and recipient write succeeds, so consumer replicas never charge a strike that disagrees with the recorded verdict and a failed write re-applies the same verdict 2026-09-30 07:08:40 +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 feafc8ea0d Merge pull request #754 from warmbly/fix/contact-bulk-request-limit
feat: raise contact bulk selection limits and name categories and labels Labels everywhere
2026-09-30 04:28:32 +00: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 dbe99602b2 Merge pull request #751 from warmbly/fix/recent-posthog-errors-2
feat: register bus schemas on release and gate the fleet on them, check schema compatibility in CI, and fix recent error-tracking issues
v0.6.14
2026-09-29 18:30:55 +00: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 17a0ebfac0 feat: record the jobs.worker-events schema snapshot with the UPDATE_FOLDER event and the fields main added since the snapshot was taken 2026-09-29 20:15:17 +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 d998619455 feat: renumber the placement batch migration to 000232 after main took 000230 and 000231 for lead CC, and require that version in the batch live tests 2026-09-29 10:53:12 -07:00
Matthew Meszaros 974c68cd92 feat: bound the Gmail folder reconciliation's inbox listing by the oldest stored row in any reconciled folder, so an archived, spam or trash row older than every inbox row that Gmail moved back to the inbox is still found 2026-09-29 10:51:54 -07: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 a8f0787ab5 Merge pull request #746 from warmbly/feat/lead-cc
feat: per-lead CC so colleagues share one campaign thread (#731)
2026-09-29 17:20:11 +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