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 |
|