Matthew Meszaros
751dd5e08c
feat: turn off Stripe automatic tax on subscription and credit checkout, plan changes and proration previews in internal/app/stripe/service.go, keeping required billing address, business name and tax ID collection
2026-10-04 09:59:24 +02:00
Matthew Meszaros
315b19a63a
Merge pull request #821 from warmbly/feature/salesforce-native-crm-integration
...
feat: native Salesforce sync with activity logging, writeback, pause rules, imports and in-app Salesforce cards
2026-10-04 07:21:11 +00:00
Matthew Meszaros
d112657cf2
feat: wire suppression, subscription and hold dependencies into the consumer's Salesforce service, give Salesforce token refreshes their own single-flight keyspace, release the outbox lease in memory after each terminal write so writeback notes land and only on rows with a logged Task, drop stale Salesforce import previews, keep keys from the import row menu from opening the edit dialog, and document the Salesforce callback URL and OAuth variables
2026-10-04 09:10:37 +02:00
Matthew Meszaros
6b7e254e56
feat: add native Salesforce sync with Lead and Contact matching and links, a leased activity outbox that logs sends, replies, bounces, opt-outs and meetings as Tasks, Lead Status and Email Opt Out writeback, a pull loop with CRM pause rules, list view and Campaign imports, sandbox and My Domain OAuth that refreshes expired sessions, a Salesforce settings page with contact and inbox cards in web, and docs
2026-10-04 08:54:27 +02:00
Matthew Meszaros
6c127df9b0
Merge pull request #820 from warmbly/feature/hubspot-native-integration
...
feat: HubSpot CRM mode with write-through deals, tasks and notes, email activity logging, exit rules, list import, setup wizard and in-HubSpot card and workflow action
2026-10-04 06:24:56 +00:00
Matthew Meszaros
900806f328
feat: make HubSpot sync jobs lease-safe with per-claim tokens and one-at-a-time claims, log each email once across retries with the interested-reply outcome as its own job, move merged HubSpot contacts in a transaction, run backfill as one cursor job that skips refused records, rebuild the HubSpot client after a reconnect, accept a single portalId on card requests, and remember the Warmbly property group only after it exists
2026-10-04 08:18:16 +02:00
Matthew Meszaros
37e91fc89f
feat: add HubSpot CRM mode where HubSpot deals, pipelines, tasks, notes and owners are mirrored and written through, sends and replies log as HubSpot emails, exit rules hold campaigns, list import, sync health, setup wizard in web, HubSpot app project with record card and workflow action, and docs
2026-10-04 07:47:51 +02:00
Matthew Meszaros
b84d70c31d
Merge pull request #818 from warmbly/claude/api-contract-2026-10-04
...
feat: describe the stored send-plan snapshot in the OpenAPI document (stale flag on CampaignSendPlan)
2026-10-04 05:31:35 +00:00
Claude
71f69f1856
feat: advance campaigns.updated_at in setForCampaignTx when linking segments inserts new campaign_segments rows so the send-plan snapshot is invalidated when an audience grows
2026-10-04 05:14:34 +00:00
Claude
de230af27d
feat: advance campaigns.updated_at when a segment set change detaches linked segments in setForCampaignTx, including clearing the set, so the send-plan snapshot is invalidated after leads are withdrawn
2026-10-04 05:02:11 +00:00
Claude
51482769f5
feat: advance campaigns.updated_at when a campaign's senders are replaced and when a tag or folder-only update runs so the send-plan snapshot keyed on it is invalidated and stops being served with stale false
2026-10-04 04:48:44 +00:00
Claude
e2911fb01a
feat: say in the docs/public/openapi.json CampaignSendPlan stale description that a snapshot older than its maximum age is also served as stale when the campaign has not changed
2026-10-04 02:04:41 +00:00
Claude
e39ff8318d
feat: describe the stored send-plan snapshot in docs/public/openapi.json by adding the required stale flag and computed_at meaning to CampaignSendPlan and noting the background snapshot on GET /campaigns/{id}/send-plan
2026-10-04 02:01:51 +00:00
Matthew Meszaros
2032b0492c
Merge pull request #817 from warmbly/fix/microsoft-admin-consent
...
feat: Microsoft 365 organization grant through the v2.0 admin consent page, and an admin approval link for single-mailbox Outlook sign-in
v0.6.24
2026-10-03 18:38:25 +00:00
Matthew Meszaros
75840247c8
feat: replace the stored Outlook admin approval link on every Outlook sign-in start in useMailboxOAuth, clearing it when the start response carries none
2026-10-03 20:33:53 +02:00
Matthew Meszaros
8883a1df6b
feat: connect Microsoft 365 organizations through Microsoft's v2.0 admin consent page followed by a sign-in on the same state, read the approving admin's directory role from the Graph token as well as the ID token, return an organization-wide approval link for single-mailbox Outlook sign-in (admin_consent_url) and show it in the connect panel, and document publisher verification and the admin approval path
2026-10-03 20:17:38 +02:00
Matthew Meszaros
e43b9e837e
Merge pull request #816 from warmbly/docs/agent-qa-pr-video-research
...
feat: add the qa/ proof harness that records scripted Playwright flows as 1080p H.264 walkthroughs and stills against an isolated per-worktree stack and publishes them to the PR with gh --attach
2026-10-03 16:56:27 +00:00
Matthew Meszaros
efb9d0b433
feat: add the qa/ proof harness that records scripted Playwright flows as 1080p H.264 walkthroughs and stills against an isolated per-worktree stack (lite, full, sandbox) and publishes them to the PR with gh --attach, with before/after follow-up comments, a machine-wide recording lock, idle auto-stop, a qa-ci typecheck job and AGENTS.md rules for when to record
2026-10-03 09:54:59 -07:00
Matthew Meszaros
b9da4a2c40
Merge pull request #815 from warmbly/feat/dark-theme
...
feat: add a Linear-style dark theme to the dashboard (web/) with Light, Dark and System options in the user menu, Settings > Profile > Appearance and the command palette, light by default, and an Appearance guide in docs
2026-10-03 16:03:47 +00:00
Matthew Meszaros
f05bd572d2
feat: repaint dither charts on a theme switch, apply cross-tab theme changes from the current storage value without writing them back, treat HTML colour attributes as designed mail, keep editor dark text to light inline fills, and give the step button spinner its colour
2026-10-03 08:58:36 -07:00
Matthew Meszaros
232d226211
Merge remote-tracking branch 'origin/main' into feat/dark-theme
2026-10-03 08:49:37 -07:00
Matthew Meszaros
f1e3ea5bd9
feat: add a Linear-style dark theme to the dashboard (web/) with Light, Dark and System options in the user menu, Settings > Profile > Appearance and the command palette, light by default, and an Appearance guide in docs
2026-10-03 08:49:37 -07:00
Matthew Meszaros
8d9e285a54
Merge pull request #814 from warmbly/feature/slack-assistant-integration
...
feat: add Warmbly for Slack with the AI assistant, inbox threads, notification routing and account linking
v0.6.23
2026-10-03 14:04:56 +00:00
Matthew Meszaros
0a95444c2f
feat: send Slack inbox replies once in the background, keep AI drafts only after draft_reply succeeds, refuse thread locks on Redis errors, log Slack delivery failures and keep unreadable Slack connection config
2026-10-03 15:53:01 +02:00
Matthew Meszaros
61d16dfe9a
feat: add Warmbly for Slack with the AI assistant in DMs, mentions and the assistant pane, unified inbox threads with reply, AI draft and lead actions, per-category notification routing and DMs, account linking, dashboard Slack settings, manifest and docs
2026-10-03 15:35:11 +02:00
Matthew Meszaros
e5b842acf5
Merge pull request #813 from warmbly/claude/slack-session-4pcd0y
...
feat: serve campaign send plans from a background snapshot so large-campaign reads stay fast
2026-10-03 12:38:35 +00:00
Claude
bbb692e9d6
feat: instrument campaign SendPlan read path with lookup and planner stage timings and retain safe timeout diagnostics in internal/app/campaign/handlers.go
2026-10-03 12:15:32 +00:00
Claude
e3c5bd24a1
feat: guard campaign send-plan snapshot writes against version regression so a late older planner walk cannot overwrite a newer snapshot
2026-10-03 12:03:49 +00:00
Claude
84a5eee5c6
feat: bound campaign send-plan snapshot freshness by age and skip fresh snapshots via jobrun.Loop to avoid redundant cross-replica planner work
2026-10-03 11:22:12 +00:00
Claude
bb580164e6
feat: compute each active campaign's send plan in a background snapshotter (internal/app/campaign) stored in campaign_send_plan_snapshots so GET /campaigns/:id/send-plan serves a stored snapshot instead of walking the planner on the request
2026-10-03 11:04:22 +00:00
Matthew Meszaros
c3da0d684b
Merge pull request #805 from Skylinerffm97/feat/unibox-long-press-menu
...
feat(unibox): open the row menu on a long press on touch screens
v0.6.22
2026-10-03 07:57:35 +00:00
Matthew Meszaros
4815f7b43c
Merge pull request #809 from warmbly/claude/fix-798-inbound-bounce-errors
...
Make inbound bounce/complaint ingestion distinguish technical failures from genuine no-match
2026-10-03 07:01:07 +00:00
Matthew Meszaros
77ec1df58b
Merge pull request #810 from warmbly/claude/fix-801-scheduler-keyset-paging
...
feat: bound campaign recipient selection with a two-phase ordered-candidate scan
2026-10-03 06:59:33 +00:00
Matthew Meszaros
6b38dd5e47
Merge pull request #811 from warmbly/claude/fix-796-analytics-accounts-pagination
...
feat: paginate and batch account analytics status reads
2026-10-03 06:59:24 +00:00
Matthew Meszaros
0c0d2a0223
Merge pull request #808 from warmbly/claude/fix-797-sendplan-coalescing
...
feat: coalesce cold-cache send-plan reads onto one planner walk
2026-10-03 06:59:08 +00:00
Matthew Meszaros
c84368f2c4
feat: ignore Android's native contextmenu in useAnchoredMenu once a touch press has moved past the 10 px drift, so a scroll that stalls on a unibox row never opens its menu, with a hook test for the moved press
2026-10-03 08:59:01 +02:00
Matthew Meszaros
6799b64b16
Merge pull request #807 from warmbly/claude/fix-799-overview-cache-singleflight
...
fix: bound unibox overview cache to one in-flight computation per scope
2026-10-03 06:58:03 +00:00
Claude
6d9f87e456
feat: run the send-plan coalescing walk on a bounded caller-independent context and let a canceled getOrCompute waiter return its own ctx.Err() promptly without affecting the shared flight
2026-10-03 06:49:24 +00:00
Claude
3288238cc0
feat: paginate and batch GET /analytics/accounts so account status reads are bounded per page and the overflow past 1000 mailboxes is reachable via cursor
2026-10-03 06:46:20 +00:00
Claude
a77f25ce4f
feat: bound campaign recipient selection via a cheap ordered-candidate enumeration plus chunked routedLeadsQuery hydration in FindRoutedPairs, with a campaign_leads(campaign_id,position,contact_id) index
2026-10-03 06:40:38 +00:00
Claude
80594bb120
feat: classify inbound bounce/complaint technical lookup failures as retryable and propagate them from the consumer handlers instead of dropping them as no-match
2026-10-03 06:37:35 +00:00
Claude
c0ac841c3e
feat: coalesce concurrent cold-cache send-plan reads onto one planner walk via readCache.getOrCompute in internal/app/campaign
2026-10-03 06:35:46 +00:00
Claude
fc4832a5b3
feat: bound unibox overview_cache to one in-flight computation per scope by joining active flights regardless of age instead of starting overlapping ones past the freshness window
2026-10-03 06:33:57 +00:00
Matthew Meszaros
a184877cc7
Merge pull request #802 from Skylinerffm97/fix/click-outside-iframe-taps-ios
...
fix(web): close dropdowns on a tap inside the email body on iOS Safari
2026-10-03 05:11:54 +00:00
Matthew Meszaros
9ef54798dc
Merge pull request #804 from Skylinerffm97/fix/unibox-mark-unread
...
fix(unibox): make Mark as unread stick, and let it reach a sent-only conversation
2026-10-03 05:11:39 +00:00
Matthew Meszaros
7286dc216e
Merge pull request #806 from warmbly/fix/reply-repair-indexed-lookups
...
feat: make the incoming reply repair query use its indexes, and fix a dial race in DialSubmission
v0.6.21
2026-10-03 04:35:32 +00:00
Matthew Meszaros
8db2409a81
feat: read dialTCP and smtpsEgress once at the top of DialSubmission and hand them to the dial goroutines and closeLosers, so the 465/587 race's goroutines that outlive the call never read the package variables a later dial or test may be replacing
2026-10-03 06:24:09 +02:00
Matthew Meszaros
45786649c7
feat: let the incoming reply repair query use idx_tasks_message_id and idx_contacts_org_email by matching each In-Reply-To in its bracketed and bare forms against the raw task Message-ID and resolving the mailbox's workspace before the contact address match, so a batch over the 45-day window finishes instead of hitting the statement timeout every minute
2026-10-03 06:07:20 +02:00
Skylinerffm97 and Claude Opus 5.5
3f6617000a
feat(unibox): open the row menu on a long press on touch screens
...
iOS Safari fires no contextmenu on a long press, so the conversation rows and the scope rail had no way to reach the right-click menu on a phone. useAnchoredMenu now opens the same menu after a 500 ms touch hold at the finger, cancels on a move over 10 px, swallows the click and touchend that follow the hold (so the row does not open and no menu item under the finger fires), and ignores Android's native contextmenu after a fired hold. Mouse and pen are unchanged.
Herkunft: [Claude]
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 16:14:35 +02:00
Matthew Meszaros
2710f81d86
Merge pull request #803 from warmbly/fix/unibox-tests-wait-for-rows
...
feat: make the unibox tests wait for rows instead of a fixed settle
v0.6.20
2026-10-02 14:03:32 +00:00