Commit Graph
1935 Commits
Author SHA1 Message Date
Matthew Meszaros 55307b0ad9 feat: fix the segment dialog UI and make a contact created inside a segment join it (issue #285): the add-to-campaign picker now shows a humanised, colour-toned campaign status instead of the raw PAUSED_NO_ACCOUNTS enum, its footer wraps instead of clipping the hint mid-sentence and the Add leads button no longer breaks across two lines, campaign status labels move to a shared components/app/campaigns/status module, the Segments, Categories and Segment pages plus every unmapped settings and onboarding route get a document title so they stop reading Page not found, and POST /contacts takes a segments array that pins the new contacts in as include overrides (validated before the write, best-effort after it) which the New contact dialog sends when opened from a segment page 2026-09-01 02:57:30 -07:00
Matthew Meszaros 7b6830daa5 feat: say segments out loud in the API scope catalog: the READ_CONTACTS and WRITE_CONTACTS descriptions served to the API key dialog (and the docs permission table) now name segments, since segment CRUD, previews, member overrides and enrolment ride on the contact scopes and the picker never said so 2026-09-01 01:32:56 -07:00
Matthew Meszaros 8db032a656 feat: address review on segment-campaign linking: a campaign_lead_removals table (migration 000115, orgtransfer-registered) records hand-removed leads so the automatic segment sync never re-adds them while a manual add or the one-shot enrol clears the record, PUT /campaigns/:id/segments rejects an omitted segment_ids so {} cannot detach everything, rows.Err checks on the four new link queries so a truncated read cannot commit as success, write-path enrolment syncs detached from the request goroutine with a per-org in-flight dedupe, per-campaign 30s deadlines in the sweep instead of one shared budget, and an error-with-retry state in the linked-segments dialog 2026-09-01 00:33:42 -07:00
Matthew Meszaros 66a105fb9f feat: make segments a live campaign audience and round out lead management (issue #277): a campaign_segments link table with GET/PUT /campaigns/:id/segments (max 20, replace semantics), immediate enrolment of linked-segment members as leads plus targeted re-syncs on contact writes, segment edits, pin-ins and imports and a 2-minute backend sweep for drift, waking active campaigns and restarting completed ones through the full launch checks; a Segments manager dialog and toolbar button on the campaign Leads tab; Remove from campaign as the row action and a selection-bar bulk action so leads can leave a campaign without deleting the contact; campaign and segment pickers in the CSV import wizard backed by a new segment_ids import option that pins imported rows as include overrides; a delete guard naming linked campaigns; orgtransfer registration, live repo tests and docs for all of it 2026-08-31 08:45:27 -07:00
Matthew Meszaros ddb0e349ad Merge pull request #281 from warmbly/fix/account-reverification-button-missing
Add the missing mailbox re-verification flow
2026-08-31 06:34:45 -07:00
Matthew Meszaros 773a3ecaf2 Merge remote-tracking branch 'origin/main' into fix/account-reverification-button-missing 2026-08-31 06:26:40 -07:00
Matthew Meszaros c2f5cc4e9e feat: address review on the reconnect flow: a reauth whose repeat consent omits the refresh token now refuses (typed error) when the stored one cannot be read instead of sealing an empty string over it, and credential errors resolve only after the reactivation Update succeeds so a failed reactivation keeps the banner and its reconnect button 2026-08-31 06:26:39 -07:00
Matthew Meszaros acec534b6b feat: give the mailbox drawer's ramp-hold, lifecycle and cold-ramp notice cards top padding (px-5 py-4 like every other Overview section) so they no longer touch the section divider above them 2026-08-31 06:16:15 -07:00
Matthew Meszaros 2d0db3ef63 Merge pull request #282 from warmbly/fix/issue-273
Fix missing line breaks in imported messages: read unibox bodies from the key the worker writes
2026-08-31 06:13:57 -07:00
Matthew Meszaros 70ca90a3e0 feat: fix the reconnect reactivation 500 found in live testing: reconnectAccount now loads the row via GetByID itself because the org-scoped Get selects no user_id and the owner-scoped Update was handed an empty uuid; UpdateSMTPIMAPCredentials switches to GetByID with an explicit tenancy check, and the test stub's Get now mimics the real partial row 2026-08-31 05:53:12 -07:00
Matthew Meszaros 6918ee06b0 Merge remote-tracking branch 'origin/main' into fix/issue-273 2026-08-31 05:49:38 -07:00
Matthew Meszaros 846d502284 Merge pull request #280 from warmbly/fix/cold-email-sending-defaults
feat: make the per-mailbox daily campaign cap configurable up to 5,000/day
2026-08-31 05:43:40 -07:00
Matthew Meszaros 6ea9ecbc82 Merge remote-tracking branch 'origin/main' into fix/issue-273 2026-08-31 05:40:29 -07:00
Matthew Meszaros 9d9c126b76 feat: hyphenate the 24-hour window compound in the mailboxes guide gap-throughput note 2026-08-31 05:39:53 -07:00
Matthew Meszaros a657da3a1d Merge remote-tracking branch 'origin/main' into fix/cold-email-sending-defaults 2026-08-31 05:39:46 -07:00
Matthew Meszaros 5abfb69882 feat: address Greptile review on #282: re-measure useFlipPlacement/useFlipAlignment on window resize so an open popover keeps a valid side when the toolbar reflows, and trim the unibox body-key and hook comments down to their one-line invariants 2026-08-31 05:36:24 -07:00
Matthew Meszaros c28179e61f feat: raise the campaigns ramp_start/ramp_ceiling DB CHECK constraints to 5000 (migration 000113) so raised API bounds cannot 500 on the constraint, validate the effective ramp pair against stored values on partial updates, and fix the campaign/mailbox guides on the effective cap and the 600s gap throughput bound 2026-08-31 05:31:13 -07:00
Matthew Meszaros 3a8015b12e Merge pull request #278 from warmbly/feature/live-panel-redesign
Redesign the sidebar LivePanel: visuals over text
2026-08-31 05:29:51 -07:00
Matthew Meszaros 896fc60f4d feat: add the missing mailbox re-verification flow (issue #274): POST /emails/onboarding/oauth/reauth/:id re-runs the provider consent for an existing Gmail/Outlook mailbox (login_hint preselect, same-address check, token rewrite keeping the stored refresh token) and PUT /emails/onboarding/smtp-imap/:id replaces SMTP/IMAP credentials after live validation; both resolve the credential-class error rows and reactivate the mailbox onto its worker, the drawer's Needs attention banner gains Re-authorize and Update credentials buttons, and the mailboxes guide documents reconnecting 2026-08-31 05:29:35 -07:00
Matthew Meszaros dfca54959f Merge branch 'main' into feature/live-panel-redesign 2026-08-31 05:27:56 -07:00
Matthew Meszaros 1a991a5d7a Merge pull request #279 from warmbly/feature/segment-api-crud
feat: surface the segment ID in the dashboard and docs for segment API integrators
2026-08-31 05:20:20 -07:00
Matthew Meszaros f35d7e5037 feat: address CodeRabbit review on the segment ID chip: narrow the API reference sentence to endpoints that operate on an existing segment, add an aria-label and a polite sr-only status to the copy button so the copied state reaches assistive technology 2026-08-31 04:19:20 -07:00
Matthew Meszaros 1194f819d0 Merge remote-tracking branch 'origin/main' into feature/segment-api-crud 2026-08-31 04:18:44 -07:00
Matthew Meszaros 760cb5651c feat: fix issue 273: read unibox message bodies from the key the worker actually writes (users/<owner>/emails/<mailbox>/<message>.emsg via config.StorageEndpointEmailBody) instead of the never-written emails/<owner>/<id> key, so opened messages render the full stored plain+HTML body with its line breaks instead of degrading to the collapsed one-line snippet with the truncated-message notice; thread the mailbox account id through GetBody, GetByID and the body-text search backfill, drop the dead PutBody/GetEmailKey, and in the contact activity detail stop content escaping the drawer: measured left/right alignment for the date-range popover (new useFlipAlignment hook) and wrap-anywhere on expanded detail values so long URLs cannot widen the grid past the card 2026-08-31 03:54:59 -07:00
Matthew Meszaros d936f04973 Merge branch 'main' into feature/live-panel-redesign 2026-08-31 03:53:06 -07:00
Matthew Meszaros ec1ac7080a feat: derive the LivePanel capacity denominator from the sum of each mailbox's configured campaign_limit (falling back to the 50/day default) instead of a flat mailbox count times 50, so tuned per-mailbox limits move the meter 2026-08-31 03:52:38 -07:00
Matthew Meszaros d7a17a0149 feat: make the per-mailbox daily campaign cap configurable up to 5000 (issue #276): raise campaign_limit, campaign daily_limit and ramp start/ceiling validation to config.LimitMax, warn in the dashboard above 100/day, and update aitools, zapier and docs copy to match 2026-08-31 03:50:36 -07:00
Matthew Meszaros 55156a8964 feat: surface the segment ID for API integrators: a click-to-copy ID chip in the segment page header, a Copy segment ID entry in the segments list row menu, a Segments in the API section in the segments guide pointing at the CRUD, members and enrolment endpoints, and a note in the API reference on where the dashboard shows the ID 2026-08-31 03:47:12 -07:00
Matthew Meszaros 3fc4fd0bb0 feat: redesign the sidebar LivePanel around visuals instead of text rows: a hero sent-today number that scrubs day-by-day when hovering the new smooth 14-day area sparkline (replacing the bar strip), a sky capacity meter for today vs the derived daily cap, icon glance chips for mailboxes, active senders and unread inbox, a zero-filled continuous trend axis so quiet days are not squeezed out, and no LIVE status row since realtime updates already read as live 2026-08-31 03:41:27 -07:00
Matthew Meszaros f11115b642 Add greptile config.json to stop automatic pr reviews 2026-08-31 12:12:14 +02:00
Matthew Meszaros ecf6699c24 Merge pull request #270 from warmbly/feature/contact-segments
feat: contact segments (saved audiences) with live SQL evaluation, manual overrides and one-step campaign enrolment
2026-08-30 02:36:29 -07:00
Matthew Meszaros 7a7c6051bc Merge remote-tracking branch 'origin/main' into feature/contact-segments 2026-08-30 02:07:56 -07:00
Matthew Meszaros b99e77c389 feat: replace the contact filter side sheet with an inline interactive filter bar: always-visible Category, Segment, Status and Campaign pills that apply on the spot, an Add filter menu for custom fields, date added, last updated, campaign count and (on Leads) lead status and engagement, editable pills with remove, a live matching count, Clear and Save as segment, half-filled custom-field pills kept out of the request, and docs for filtering the list 2026-08-30 01:57:38 -07:00
Matthew Meszaros 7dc6a9a26c feat: fold segments into the contacts area instead of a separate nav item: a Contacts layout with All contacts, Segments and Categories tabs, segment pages moved to /app/contacts/segments, a new Categories tab with live counts, rename, color, create and delete, a Save as segment button in the contact filter panel that opens the editor with the filters mapped to conditions, and ?category= pre-filtering of the contact list 2026-08-30 01:50:57 -07:00
Matthew Meszaros f00375b533 Merge pull request #271 from warmbly/fix/issue-265
Deploying without Docker: guide, systemd units and nginx site
2026-08-30 01:15:38 -07:00
Matthew Meszaros 072ff1a39c Merge branch 'main' into fix/issue-265 2026-08-30 01:05:03 -07:00
Matthew Meszaros ac8fc31830 Merge pull request #269 from warmbly/feature/effortless-issue-264-proposal
Address verification overhaul: MillionVerifier plugin, imported results, campaigns never stop on verification (#264)
2026-08-30 00:29:06 -07:00
Matthew Meszaros 802c0913b0 feat: address review on the bare-metal guide: bind NATS to loopback through /etc/nats.conf and document token plus TLS auth before opening it to remote workers, clone and build as the unprivileged user with sudo install into /opt/warmbly/bin, and issue certificates with certbot certonly --standalone before enabling the nginx site 2026-08-30 00:21:16 -07:00
Matthew Meszaros 623862b9f8 feat: point every server block in deploy/nginx/warmbly.conf at one Let's Encrypt certificate under live/app.example.com and explain that it must be issued standalone before the site is enabled 2026-08-30 00:21:16 -07:00
Matthew Meszaros 2e376bcd4a feat: make the tracking publisher honor user:pass@ or token@ credentials in NATS_URL by lifting them into async-nats ConnectOptions, since async-nats ignores URL userinfo unlike the Go client, and redact the userinfo from the connect log line 2026-08-30 00:21:16 -07:00
Matthew Meszaros 03c71603bf feat: count undeliverable leads by running the campaign router with the verification gate ignored, so a lead whose flow already ended (STOP branch, no outgoing connection, every step attempted) is not counted and a finished campaign completes instead of parking at paused_undeliverable 2026-08-30 00:14:44 -07:00
Matthew Meszaros 3bd9325bee feat: address review on segments: gate the add-to-campaign and from-segment actions behind the manage-campaigns permission on the segment page, the segments list and the campaign Leads tab so the dashboard never offers an enrolment the API would refuse, trim the segment package and migration comments to the one invariant they carry, and drop the em dash from the editor comment 2026-08-30 00:11:19 -07:00
Matthew Meszaros 52916ab60d feat: verification evidence engine and Greptile fixes for #264: contact_verification_evidence ledger (migration 000111) fed by clean deliveries, human opens, clicks, replies and recipient-naming bounces from the send, tracking, reply and bounce paths, a decaying score that lets real mail outrank a probe and a newer bounce outrank older engagement, verification_confidence on every contact with a reasons list and animated Deliverability card in the contact drawer, per-organization probe breakers, undeliverable counts that ignore finished leads, tighter wiring comments, and docs 2026-08-29 23:49:33 -07:00
Matthew Meszaros 50663ef652 feat: document the segments endpoints, condition format, segment_ids search filter and the add/remove-segment sequence actions in the API reference, and note that segments travel in workspace archives 2026-08-29 23:45:06 -07:00
Matthew Meszaros abd2ebca97 feat: document segments in a new guide (building, overrides, sequence actions, using, limits), register it in the guides index and link it from the contacts guide 2026-08-29 23:45:06 -07:00
Matthew Meszaros 15dface385 feat: add the Add to segment and Remove from segment action nodes to the campaign sequence canvas with a segment picker 2026-08-29 23:45:06 -07:00
Matthew Meszaros b638ac6b24 feat: show every segment with membership and pin in / pin out / back-to-automatic controls in the contact drawer overview 2026-08-29 23:45:06 -07:00
Matthew Meszaros 716186d503 feat: add a Segments picker to the contact filters drawer and count a segment scope as an active filter for exports 2026-08-29 23:45:06 -07:00
Matthew Meszaros ad40be9276 feat: scope the contacts table by segment, add the Segment and Remove-from-segment selection bar actions, let the add-from-contacts dialog target a segment, and add the add-to-campaign and from-segment lead dialogs 2026-08-29 23:45:05 -07:00
Matthew Meszaros c8b901b204 feat: add the Segments list and detail pages with duplicate, delete, add-to-campaign and a pinned-contacts panel, register the routes, the sidebar entry and the breadcrumb labels 2026-08-29 23:45:05 -07:00