Matthew Meszaros
7d79dcc282
feat: append a -kafka image variant to every version the control plane hands a fleet node when the instance runs Kafka, so a joining worker pulls a build that can actually reach the bus instead of failing at boot ( #449 )
2026-09-11 22:46:02 -07:00
Matthew Meszaros
280a3e64ac
feat: publish Kafka-linked image variants ( #448 )
...
* feat: publish Kafka-linked images for backend, consumer, worker and tracking as -kafka tag variants built per-arch on native runners, because the cgo librdkafka link cannot cross-compile on the build-go path
* feat: carry BUILT_AT inside the Go Kafka targets' build-args instead of the shared build-native block, so tracking and realtime stop warning about an unconsumed arg, and emit the matrix with printf because echo expands the separating backslash-n in some shells
2026-09-11 22:31:41 -07:00
Matthew Meszaros
d42aeea1aa
Merge pull request #447 from warmbly/feat/kafka-topic-creation
...
feat: the Kafka bus creates the topics it uses
2026-09-11 21:59:41 -07:00
Matthew Meszaros
e3092f2322
feat: address the review by releasing the topic lock before the broker call so one slow creation cannot stall every publish, subscribe and close for the full admin timeout, refusing to open an admin connection once the bus is closed so a publish racing past the closed check cannot resurrect a client nothing will shut, building rather than vetting the tagged Kafka backend in CI because vet does not link and a CGO backend fails at link time, and correcting the Confluent tier wording to say auto topic creation is configurable only on Dedicated
2026-09-12 06:54:34 +02:00
Matthew Meszaros
6504d9958a
feat: create Kafka topics from the bus that uses them, because a worker's command topic is named after the node id issued at join time so the set is not knowable in advance, and the broker's auto-creation is off by default on Confluent Cloud and not configurable below Standard, which left a worker subscribed to a topic that did not exist receiving nothing and reporting no error, and compile the tagged Kafka build in CI so a backend nothing else builds cannot rot unnoticed
2026-09-12 06:02:49 +02:00
Matthew Meszaros
74771004c4
Merge pull request #446 from warmbly/feat/nats-max-bytes
...
feat: a stream size ceiling, and a latent bug in the retry path
2026-09-11 20:45:19 -07:00
Matthew Meszaros
131e9ff093
feat: give the JetStream stream a size ceiling from NATS_MAX_BYTES, accepting a byte count or a size like 2GiB, because a managed account can require every stream to declare one and Synadia's Max Bytes Required rejects creation without it, turning that refusal into an error naming the variable to set, and fix the retry path which passed a zero max age and would have recreated the stream with no age limit after a failure
2026-09-12 05:40:43 +02:00
Matthew Meszaros
f7e1deeae4
Merge pull request #445 from warmbly/feat/nats-credentials
...
feat: support NATS JWT credentials, so a managed bus is an option
2026-09-11 20:34:10 -07:00
Matthew Meszaros
f1f5249153
feat: authenticate to NATS with a user JWT and nkey seed so a managed bus like Synadia Cloud can replace a self-run one, taking the credential from a file path for containers and from a single-line base64 value for the fleet, because a node receives environment variables rather than files and the env file docker reads cannot express the multi-line credentials format, in both the Go event bus and the Rust tracking publisher
2026-09-12 05:29:09 +02:00
Matthew Meszaros
f4581108ca
Merge pull request #441 from warmbly/fix/issue-434
...
feat: per-step open, click, reply and bounce rates in Step performance
2026-09-11 10:21:04 -07:00
Matthew Meszaros
470654f5b0
feat: say machine_clicks counts the contacts whose only clicks on a step were automated rather than counting steps, document the zero-send rule on all four step rates in the OpenAPI schema, and stop get_campaign_stats dropping the machine open and click counts from both the campaign totals and each step
2026-09-11 09:12:22 -07:00
Matthew Meszaros
35d9d3d612
feat: count automated clicks from one rolled-up bool_and(machine) per step and contact joined into both the campaign summary and the per-step stats, instead of a correlated EXISTS pair per progress row, which measured 78ms against 33ms on a 50k-lead campaign with 20k logged clicks
2026-09-11 09:01:17 -07:00
Matthew Meszaros
53d25baa29
feat: read the step performance hover as 'Opens: 1 · 20.0% of 5 sent' instead of the mis-pluralised '1 opens', by labelling each StepMetric cell with its capitalised metric name and putting the count after the colon
2026-09-11 08:57:52 -07:00
Matthew Meszaros
5087023e48
feat: give every campaign step its own open, click, reply and bounce rate in Step performance, computed against that step's own sends, with the automated share of its opens and clicks carried alongside them through GetSequenceStats, the campaign analytics API, the get_campaign_stats AI tool and the docs
2026-09-11 08:56:03 -07:00
Matthew Meszaros
a542bb2c9c
Merge pull request #427 from chrisedington/feat/cleanmylist-verification
...
Add CleanMyList email verification integration
2026-09-11 06:17:37 -07:00
Matthew Meszaros
a5b0e2c2f3
Merge branch 'main' into feat/cleanmylist-verification
2026-09-11 06:12:10 -07:00
Matthew Meszaros
87e3f7006d
Merge pull request #438 from warmbly/fix/scanner-timing-window
...
feat: operator-editable automated-engagement windows, and Barracuda in the scanner catalogue (#412 follow-up)
2026-09-11 06:09:06 -07:00
Matthew Meszaros
a8c66591ce
feat: correct the isInstant comment that claimed a backwards-skewed clock must not mark events human when the code does exactly that, describing the real behaviour instead: an event stamped before its dispatch means the clocks disagree, so the timing rule abstains and leaves the verdict to the user agent and source network
2026-09-11 06:04:38 -07:00
Matthew Meszaros
9698052569
Merge branch 'main' into feat/cleanmylist-verification
2026-09-11 06:03:55 -07:00
Matthew Meszaros
27c5df5072
feat: refuse a redirect that downgrades a verification request from https to http in both provider clients, since Go keeps the Authorization header across a redirect that stays on the same host and the pasted API key would go on the wire in the clear, and label the verification action from the connection id rather than the active provider, because a degraded connection reports the built-in checker while still being a connection to manage
2026-09-11 05:26:33 -07:00
Matthew Meszaros
6c6a0d1909
feat: record a verification provider's failure before marking its connection and serialize both health writes behind a per-connection gate, since the report is a database round trip and a check resolving alongside it compared itself against a failure that had not been cached yet, withdrawing a degraded state raised by a check newer than its own and leaving the connection healthy while the account was empty
2026-09-11 04:24:17 -07:00
Matthew Meszaros
2219d764cf
feat: stop the tracking window live tests from resetting the instance settings row they run against, snapshotting the real document and restoring it verbatim instead of writing defaults back, and assert the untouched click window against that snapshot rather than against the shipped default, which silently required the database to start at defaults
2026-09-11 04:15:19 -07:00
Matthew Meszaros
0e8a05b6df
Merge remote-tracking branch 'origin/main' into fix/scanner-timing-window
2026-09-11 04:02:06 -07:00
Matthew Meszaros
3bfbb75e8c
Merge pull request #435 from rocker1166/fix/invite-mismatch-and-inbox-actions
...
fix(invite, unibox): mismatched-session invite 403, thread header Archive/Delete/Unread that survives a sync, Add as contact, reply To seed
2026-09-11 03:58:24 -07:00
Matthew Meszaros
9f61d070d4
feat: give the unibox thread header a way back out of a filing mistake, with Undo on the Archive and Delete toasts, Move to inbox while reading the Trash or Archive folder, and the actions disabled while one is in flight, plus stop the invite page offering Accept before it knows which account the browser is signed in as
2026-09-11 03:23:23 -07:00
Matthew Meszaros
da4b89da0b
feat: split a unibox message's provider placement into its own provider_folder column (migration 000146) so Archive and Delete in the thread header survive the next sync without the sync losing the ability to follow a real provider move, and narrow PATCH /unibox/folder to inbox/archive/trash behind the unibox feature gate with an audit entry so the move reaches every teammate's list live
2026-09-11 03:23:19 -07:00
Matthew Meszaros
623dc7ec61
feat: rewind the cooldown deadline as well as the observation time in the exhausted-account test so it fails when the fifteen-minute hold regresses to the ordinary one-minute lookup cache rather than only when the cache stops being deadline-keyed, and ask again next to the write whether a verifier is already connected, since validating the pasted key is a round trip to the provider and is long enough for a second connect to pass the first check
2026-09-11 03:12:28 -07:00
Matthew Meszaros
80c3c79a31
feat: add live coverage that the machine windows survive the settings document's jsonb round trip and reach the classifier, a guard that every shipped scanner CIDR is written as its own network address since the loader truncates host bits silently, and correct the comments that claimed an edit lands on the very next event when the consumer reads through a thirty second cache in its own process
2026-09-11 03:11:35 -07:00
SUMAN JANA
727ddb1482
feat: wire the unibox thread header's Mark as unread, Archive and Delete to a new PATCH /unibox/folder, add an Add as contact action for senders outside the CRM, and replace six private From-header parsers with one shared lib/helper/emailAddress that also understands the parenthesised form the IMAP sync stores, which left the reply composer's seeded To failing its own validator
2026-09-11 03:10:18 -07:00
SUMAN JANA
73f6bff2ed
feat: stop a browser signed in as someone else from being offered Accept on an invite it cannot accept, comparing the signed-in address with the invited one on the invite page and offering Switch account instead, and naming both addresses in the backend's 403 so the cause is visible
2026-09-11 03:10:18 -07:00
Matthew Meszaros
c115b44d33
feat: correct the docs wording for the automated-engagement windows so the API reference and the campaigns guide name the dispatch-to-worker clock rather than the send, and describe the click window as independently configurable with thirty seconds as its default rather than as a fixed relationship to the open window
2026-09-11 03:02:58 -07:00
Matthew Meszaros
4d0f0fb6b6
feat: hold an exhausted verification account that publishes no balance for a cooldown instead of re-deriving its health from an account check that cannot see exhaustion, since CleanMyList answers GET /v1/jobs identically whether or not there is allowance left, so the minute-long lookup cache retired every observed 402 and put the whole next batch back on doomed paid calls while Settings reported the service as healthy, and refuse a second verification connection while one is connected rather than letting creation order silently move every check onto a different bill
2026-09-11 02:57:08 -07:00
Matthew Meszaros
184a3dc08e
feat: make the automated-open and automated-click windows operator-editable under Instance settings and raise their defaults to 60s and 30s, because the ten-second window was anchored on dispatch to the worker rather than on delivery and routinely expired before the recipient-side gateway it was meant to catch had even seen the message, and add Barracuda's published Email Gateway Defense blocks to the scanner catalogue with Proofpoint, Mimecast and Cisco shipped commented out because browser isolation renders a clicked page from the vendor's own network
2026-09-11 02:53:34 -07:00
Matthew Meszaros
170c33780a
feat: pass ui_host to PostHog in the dashboard, admin panel and marketing site from its own environment variable so a proxied api_host stops breaking toolbar and session-replay links, which the SDK builds against whatever it sends events to and which a reverse proxy does not serve, defaulting to us.posthog.com so an install that does not proxy is unaffected
2026-09-11 11:34:02 +02:00
Matthew Meszaros
1866c45c67
feat: serve a PostHog reverse proxy at /ingest on the backend so the dashboard, admin panel and marketing site can report analytics and errors through this instance instead of posthog.com, which content blockers drop for a large share of visitors, splitting asset traffic to the bundle host because sending it to the ingestion host 404s, withholding the caller's cookies and Authorization from a third party, and preserving the trailing slash that path cleaning removes and PostHog's capture endpoint needs
2026-09-11 06:02:21 +02:00
Matthew Meszaros
853afe458e
Merge pull request #430 from warmbly/fix/bootstrap-and-tracking-domain-check
...
fix: two aws-bootstrap defects, and a check for tracking on your own brand
2026-09-10 20:29:46 -07:00
Matthew Meszaros
947ba4f2d0
Merge pull request #429 from warmbly/fix/rds-tls-verification
...
fix: sslmode=verify-full against RDS could never have worked
2026-09-10 20:29:35 -07:00
Matthew Meszaros
62903b3806
Merge pull request #428 from warmbly/fix/tracking-rustls-provider
...
fix: the tracking service panics on its first TLS connection
2026-09-10 20:29:23 -07:00
Matthew Meszaros
eb21d978a8
feat: stop aws-bootstrap from treating a bucket that exists in another region as done, since head-bucket answers globally and a second region silently kept its blobs in the first, stop it printing the database master password to stdout where a terminal, a CI log or an agent transcript keeps it forever, and add an instance check that reports a tracking domain sharing a registered domain with the product's own URLs
2026-09-11 05:24:57 +02:00
Matthew Meszaros
a962683511
feat: ship AWS's RDS truststore in the backend and consumer images and point the docs at it, because Amazon RDS chains to a root that is in no public trust store so the sslmode=verify-full those docs recommended failed every connection with x509 certificate signed by unknown authority, while deliberately not setting PGSSLROOTCERT by default since an RDS-only store would break a Postgres fronted by a public CA
2026-09-11 05:23:23 +02:00
Matthew Meszaros
e7f25890d2
feat: install the ring crypto provider at tracking startup so the service can open a TLS connection at all, because rustls 0.23 refuses to choose when both aws-lc-rs and ring are in the tree and panics at the first handshake, which took the whole service down the moment it pointed at a tls:// bus and which plaintext local development never reveals
2026-09-11 05:19:52 +02:00
Chris Edington
59122e6c8a
feat: add CleanMyList contact verification with API key setup and built-in fallback
2026-09-10 20:06:29 +01:00
Matthew Meszaros
1260dff108
Merge pull request #426 from warmbly/feature/posthog-error-tracking
...
feat: PostHog error tracking across every runtime, Sentry kept as an option
v0.4.4
2026-09-10 10:28:28 -07:00
Matthew Meszaros
a84ab48729
Merge branch 'main' into feature/posthog-error-tracking
2026-09-10 10:25:21 -07:00
Matthew Meszaros
3bd9d2a1d7
Merge pull request #424 from warmbly/feature/issue-421-implementation
...
feat: locate every spam-check issue in the subject or body, and analyze campaign copy with AI
2026-09-10 10:18:10 -07:00
Matthew Meszaros
84a0ca0b29
feat: correct the noteStep guidance comment to match what the callers actually pass, a bounded route pattern rather than a fixed phrase, so the rule a future caller reads is the rule the trail is built on
2026-09-10 19:16:13 +02:00
Matthew Meszaros
79127c345d
feat: drop a nil error and an empty message at the errs boundary instead of turning them into an issue with nothing in it, which the Sentry SDK used to swallow on its own and the PostHog one would have captured as a titleless exception
2026-09-10 19:15:21 +02:00
Matthew Meszaros
2ff350ecf9
feat: apply WARMBLY_POSTHOG_ERROR_TRACKING to the public form pages too, by having cmd/forms stamp an empty browser key when it is false, since the page can only act on whether a key arrived and the flag otherwise silenced the dashboard and the admin panel while leaving form pages reporting
2026-09-10 19:14:34 +02:00
Matthew Meszaros
f8625b085a
Merge remote-tracking branch 'origin/main' into feature/issue-421-implementation
2026-09-10 10:12:04 -07:00
Matthew Meszaros
ced741e352
feat: make PostHog the default error tracker across every runtime while keeping Sentry fully supported alongside or instead of it, by turning internal/observability/errs into a two-sink fan-out with a local-log fallback, adding $exception capture to the Go services, the Rust tracking service, the Elixir realtime service and the dashboard, admin and form apps, reporting gin panics with their route, request id, workspace and user, attaching that identity plus a route and failed-request trail to browser exceptions, and wiring POSTHOG_ERROR_TRACKING, the node join env, compose, source-map upload and the docs to match
2026-09-10 19:11:32 +02:00