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
|
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 |
|
Matthew Meszaros
|
3bfc36c71a
|
feat: add the segment condition builder drawer with a live match count and the campaign, segment and enum multi-pickers it uses
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
d831aba034
|
feat: add segment_ids to the dashboard contact search model and route segment audit events and contact changes to the segments queries on the realtime spine
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
960f42b846
|
feat: add the dashboard segment model, API client and react-query hooks for segments, fields, preview, overrides, member modes, contact-side membership and campaign enrolment
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
51ce95b9bc
|
feat: add live Postgres tests for the segment compiler covering every field family, all/any matching, manual overrides, nested segments, the contact-side view, search by segment_ids and idempotent campaign enrolment
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
daf946fc45
|
feat: add the add_to_segment and remove_from_segment sequence action steps, executed on both the scheduled campaign path and the instant reply path, wired into the backend and consumer
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
14a21bf9bd
|
feat: expose the segments API (list, fields, preview, create, get, patch, delete, members, member lookup, overrides, add-to-campaign) and GET /contacts/:id/segments behind contact permissions, wire the service into the backend and audit each mutation on the realtime spine
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
87b3a00aa2
|
feat: add the segment service with create/update validation, nested reference and loop checks, delete refusal when another segment depends on it, preview, member overrides, campaign enrolment that wakes the campaign, and the field catalog with the org's custom fields
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
1eb3dbe481
|
feat: let the contacts search and export accept segment_ids so any contact query can be scoped to a segment, and label add/remove-segment steps in the lead progress view
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
2308bd814a
|
feat: add the segment repository: CRUD with per-org name uniqueness and cap, live member counts, preview count, manual override writes and lookups, reference detection, contact-side membership view, overrides listing and one-step campaign enrolment that logs activities
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
0f66807546
|
feat: compile a segment definition into a bound-parameter WHERE fragment over contacts, covering text, enum, bool, date, number, category, campaign and nested-segment conditions plus manual include/exclude overrides, with cycle and depth guards
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
fd80c56136
|
feat: add the segment model with the typed condition DSL, the filterable field catalog, operator sets per field kind, validation and normalization of every condition, and the segment audit entity type
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
3391f6a4ec
|
feat: add the segments and segment_members tables (migration 000110) and register both in the workspace export/import spec under the Contacts group
|
2026-08-29 23:45:05 -07:00 |
|
Matthew Meszaros
|
393caf6b3a
|
feat: link the Compose self-hosting guide's Beyond compose section to the new Deploying without Docker page and the deploy/systemd and deploy/nginx assets
|
2026-08-29 23:37:22 -07:00 |
|
Matthew Meszaros
|
e1599f6dc0
|
feat: register the bare-metal page in the Self-hosting docs section directly after the Compose deployment guide
|
2026-08-29 23:37:22 -07:00 |
|
Matthew Meszaros
|
cc6783cb0a
|
feat: add docs page Deploying without Docker covering backing services, building the Go, Rust, Elixir and Vite artifacts from source, hand-written config.js, warmbly.env and worker.env, systemd, nginx, claiming, native remote workers, upgrades, backups and troubleshooting
|
2026-08-29 23:37:22 -07:00 |
|
Matthew Meszaros
|
b9152ea460
|
feat: document the systemd and nginx directories in deploy/README.md and point the new Deploying without Docker section at the docs guide
|
2026-08-29 23:37:22 -07:00 |
|
Matthew Meszaros
|
ee3379e399
|
feat: add deploy/nginx/warmbly.conf serving the static web and admin builds with no-store index.html and config.js and reverse-proxying the API, websocket and tracking hosts over TLS
|
2026-08-29 23:37:22 -07:00 |
|
Matthew Meszaros
|
2d6bec4025
|
feat: add deploy/systemd units for backend, consumer, worker, tracking and realtime so a Docker-free install runs every service as the unprivileged warmbly user from /opt/warmbly with EnvironmentFile config
|
2026-08-29 23:37:22 -07:00 |
|
Matthew Meszaros
|
a02ff7c936
|
feat: address verification overhaul for #264: MillionVerifier as a pay-as-you-go integration plugin with org-sealed key and automatic fallback to the built-in check, built-in prober gains domain cache, Microsoft/Yahoo fingerprinting, MX fallback, disposable/role sub-statuses and a self-check breaker, imports and POST /contacts accept verification results in any known provider vocabulary with auto-detected columns, verdict provenance and expiry columns (migration 000110), campaigns park at paused_undeliverable with re-verify/send-anyway instead of finishing, POST/GET /contacts/verification bulk actions and overview, launch gate override via acknowledge_list_risk, animated verification marks, banner and settings card in the dashboard, and docs
|
2026-08-29 23:11:22 -07:00 |
|
Matthew Meszaros
|
5f8954f4a0
|
Merge pull request #263 from warmbly/feature/cloud-managed-mailboxes
Cloud-managed mailboxes for linked instances: Google/Microsoft sign-in through Warmbly Cloud, brokered tokens, adopt from workspace
|
2026-08-29 10:14:01 -07:00 |
|
Matthew Meszaros
|
254e41f685
|
Merge remote-tracking branch 'origin/main' into feature/cloud-managed-mailboxes
|
2026-08-29 10:08:39 -07:00 |
|
Matthew Meszaros
|
d5524a1863
|
Merge pull request #262 from warmbly/feature/self-hosted-warmup-pool-access
feat: self-hosted instances warm their mailboxes in the hosted pool (Warmbly Cloud link)
|
2026-08-29 10:08:18 -07:00 |
|
Matthew Meszaros
|
44b2c18906
|
feat: address review on cloud-managed mailboxes: the consumer now asks the cloud to vouch for a warmup token in a mailbox it warms (GET /pool-link/instance/mailboxes/:id/warmup-tokens/:token) and files anything unverified as ordinary mail instead of dropping on a sender-controlled header, disconnect keeps local mirrors and the link until the cloud confirms the instance is released so managed mailboxes cannot be stranded, and long narrative comments are cut to one line
|
2026-08-29 10:07:36 -07:00 |
|
Matthew Meszaros
|
1e47648208
|
feat: show the 'warmup cannot run with one mailbox' pool-size notice only on self-hosted instances, since a hosted workspace warms against the shared pool and one mailbox already has hundreds of partners there
|
2026-08-29 09:52:19 -07:00 |
|
Matthew Meszaros
|
2a831e9783
|
feat: let a linked self-hosted instance sign Google and Microsoft mailboxes in through Warmbly Cloud's own OAuth apps and send with cloud-brokered access tokens: the cloud runs the consent (pool_link_mailboxes.managed, brokered state in Redis, the existing /addresses/*/callback completes it and redirects to the instance's /cloud-oauth/done), keeps the refresh grant, mints short-lived tokens at /pool-link/instance/mailboxes/:id/token and refuses them for revoked links, removed, inactive or blocked mailboxes; the instance mirrors such mailboxes without a credential (cloud_link_mailboxes.managed), ships them to the worker as brokered so goog/msgraph init on a token source that pulls from /api/v1/internal/cloud-link/token/:id, lets the consumer ignore cloud warmup tokens for enrolled mailboxes, and can adopt mailboxes connected directly on the workspace; Add account shows the cloud path and the adoptable list, and the Warmbly Cloud guide documents the model
|
2026-08-29 09:50:52 -07:00 |
|
Matthew Meszaros
|
febe5bb0d7
|
feat: let the /connect code input accept a pasted ABCD-EFGH code by stripping the dash and lowercase through input-otp's pasteTransformer before its alphanumeric pattern check, which was rejecting the whole paste
|
2026-08-29 09:19:31 -07:00 |
|
Matthew Meszaros
|
41d52723b6
|
feat: rebuild the Warmbly Cloud /connect approval page on the auth screen's sky as a three step card (code, review, linked) with the OTP slot input for the ABCD-EFGH code, the requesting instance shown as an identity card with a live instance-to-cloud diagram, workspace choice as selectable rows instead of a native select, inline unknown-code recovery, and a way back to the instance once linked
|
2026-08-29 09:13:46 -07:00 |
|
Matthew Meszaros
|
315509d0da
|
feat: replace the purple lock card with a full-screen plan chooser on the auth screen's sky (warm 10 mailboxes free, self-host and link, or choose a plan), give the hosted Accounts page a two-path panel (connect a mailbox here, or self-host for free and link the instance) that collapses to a usage strip once mailboxes exist, drop indigo from the access dialog, describe the free plan honestly in the catalog, and default the transactional email footer to the real company details (Mindroot Ltd, 16543299, 71-75 Shelton Street)
|
2026-08-29 08:48:13 -07:00 |
|
Matthew Meszaros
|
d621d9b79b
|
feat: sign a new account in as part of registration: createAccount returns the user, both the verification-free and the code-confirm paths mint a session through finishLoginAs (2FA challenge included), /auth/register/confirm answers with that session instead of 204, and the dashboard drops into the workspace right after signing up instead of bouncing to the sign-in form
|
2026-08-29 08:41:34 -07:00 |
|