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
|
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 |
|
Matthew Meszaros
|
b8e31433a5
|
Merge pull request #423 from warmbly/feat/frontends-on-pages
feat: serve the dashboard and admin panel from a static host
|
2026-09-10 09:07:46 -07:00 |
|
Matthew Meszaros
|
bbe9d9055a
|
feat: let web and admin be served from a static host by teaching each app's own entrypoint to render config.js wherever WARMBLY_CONFIG_OUT points, so one definition of the runtime key set serves both the container that renders it at start and a build:pages script that renders it into dist, ship a _redirects in each so a deep link stops 404ing without nginx try_files, and add scripts/check-pages-build.sh to make lint because a malformed config.js reads fine in a diff and leaves the app blank at runtime
|
2026-09-10 18:03:00 +02:00 |
|
Matthew Meszaros
|
368b2f1bef
|
Merge pull request #422 from warmbly/fix/split-cloud-bus-bundle
fix: the split-deployment bus bundle could not start, and nothing would have caught it
|
2026-09-10 08:45:17 -07:00 |
|
Matthew Meszaros
|
a08ada6666
|
feat: address the review on the bus bundle by downloading the compose file and config the documented one-command install never fetched, resolving container names through compose so --install-dir stops inspecting containers that do not exist, renewing a certificate that is present but expired instead of starting a stack that refuses every connection, refusing to write an empty credential when openssl fails, and falling back to dig or host where getent does not consult DNS
|
2026-09-10 17:39:58 +02:00 |
|
Matthew Meszaros
|
5ef8b608c6
|
feat: record the split-cloud scripts and aws-bootstrap.sh as executable, which a checkout on a filesystem that does not preserve the mode had silently dropped so make lint died with Permission denied in CI only, and assert the recorded git mode in check-split-cloud so it cannot ship non-executable again
|
2026-09-10 17:30:16 +02:00 |
|
Matthew Meszaros
|
9e689e6d91
|
feat: fix the three defects that stopped the split-deployment bus bundle from starting at all (NATS given store_dir twice on the command line and in nats.conf, which it refuses rather than reconciling; Redis unable to read its own private key because the image's entrypoint drops from root with gosu and discards the added group; and a healthcheck on localhost when the monitor binds IPv4 loopback, leaving the service unhealthy while serving fine), add bus/setup.sh so standing the box up is one idempotent command that verifies with real clients before printing the control plane's URLs, and add scripts/check-split-cloud.sh to make lint so a bundle that cannot start fails CI
|
2026-09-10 17:22:14 +02:00 |
|
Matthew Meszaros
|
a3edc3b0be
|
Merge pull request #419 from warmbly/fix/issue-415-contact-panel-rebase
Fix: re-subscribing a contact no longer pops a discard prompt
|
2026-09-10 06:57:25 -07:00 |
|
Matthew Meszaros
|
378e1d15ee
|
feat: build the custom-field record from entries so a contact field named __proto__ is a real key instead of silently setting the prototype and dropping out of what gets saved, and count a row the user has typed a value into but not named as unsaved work, so leaving the panel on it asks rather than discarding it while Save stays disabled because there is nothing to send
|
2026-09-10 06:54:58 -07:00 |
|
Matthew Meszaros
|
6a6d7fa74b
|
Merge branch 'main' into fix/issue-415-contact-panel-rebase
|
2026-09-10 06:50:02 -07:00 |
|
Matthew Meszaros
|
a04d5d98e4
|
Merge pull request #420 from warmbly/feat/worker-capacity-soft-target
Worker capacity is a placement target, not a hard gate
|
2026-09-10 06:31:24 -07:00 |
|
Matthew Meszaros
|
2998f8a8c6
|
Merge remote-tracking branch 'origin/main' into feat/worker-capacity-soft-target
|
2026-09-10 06:26:47 -07:00 |
|
Matthew Meszaros
|
fa2b5330d7
|
feat: drop the auth-pressure placement term because worker_capacity_view aggregates auth_errors (per-mailbox credential failures) and not rate_limit_errors (the 454/421 per-IP throttles it claimed to measure), measure projected utilization against an age-free Capacity.Target so a freshly joined node can relieve a full fleet instead of scoring as 200% loaded after one mailbox, bound the isolated-egress override with an explicit OverTarget check now that Eligible no longer caps it, and cap rotation moves per destination since a tick scores every mailbox against one frozen materialized-view snapshot
|
2026-09-10 05:51:17 -07:00 |
|
Matthew Meszaros
|
cd051c7150
|
Merge branch 'main' into fix/issue-415-contact-panel-rebase
|
2026-09-10 05:42:35 -07:00 |
|
Matthew Meszaros
|
e82a249792
|
Merge pull request #418 from warmbly/feat/issue-414-delete-api-key
Add a permanent delete for revoked API keys
|
2026-09-10 05:42:17 -07:00 |
|
Matthew Meszaros
|
f9d9967389
|
Merge branch 'main' into fix/issue-415-contact-panel-rebase
|
2026-09-10 05:38:58 -07:00 |
|
Matthew Meszaros
|
7fa4fdfbc4
|
feat: make worker capacity a placement target rather than a hard gate, so Eligible refuses only on health and an over-target worker costs enough score to lose to anything with room instead of returning nil and dropping assignment into selectFallback, score projected utilization including the incoming mailbox's own weight, and penalise the 454/421 auth pressure the capacity view already collected and threw away
|
2026-09-10 05:38:17 -07:00 |
|
Matthew Meszaros
|
6149f84c7d
|
feat: give warmblyctl the same apikey purge the customer CLI has, so the operator half of the API surface can delete a revoked key too and the two CLIs name the verb the same way
|
2026-09-10 05:37:28 -07:00 |
|
Matthew Meszaros
|
396bab0e06
|
Merge branch 'main' into feat/issue-414-delete-api-key
|
2026-09-10 05:36:06 -07:00 |
|
Matthew Meszaros
|
c1a3d52015
|
feat: address the review of the contact panel rebase, comparing custom-field rows structurally so adopting a server change no longer deletes a row the user has typed a value into but not yet named, comparing records key by key instead of as JSON so re-entering a field in a different order stops leaving the panel permanently unsaved, and comparing id lists sorted so a repeated id cannot pass for a different one
|
2026-09-10 05:33:26 -07:00 |
|
Matthew Meszaros
|
ca1cd6c7af
|
Merge pull request #417 from warmbly/feat/split-cloud-hosting
feat: split deployment across a container host, machines you own, and a cloud region
|
2026-09-10 05:26:36 -07:00 |
|
Matthew Meszaros
|
1e1231f3b1
|
feat: address the review of the API key delete, putting the permanent-delete route in the published OpenAPI contract with its 409, keeping one auto margin in the drawer footer so the Delete button lands on the right, and deciding the dashboard's status pill, its footer and the key-count strip on whether the key can still authenticate rather than on a status column that never says expired
|
2026-09-10 05:23:56 -07:00 |
|
Matthew Meszaros
|
64dfaa8c60
|
Merge remote-tracking branch 'origin/main' into feat/split-cloud-hosting
|
2026-09-10 14:20:22 +02:00 |
|
Matthew Meszaros
|
510ee692ba
|
feat: address the review on the split-deployment branch by moving the two broker routes onto their own NODE_BROKER_TOKEN so the internet-facing tracking and forms services no longer hold a credential that can open any organization's data key, refusing to presign any key outside the prefixes a node reaches, fixing IAM policies that named an alias ARN KMS never resolves in a Resource element, bounding both brokered HTTP clients because the sync loop's context never expires, no longer reporting a 403 from the object store as a missing body, and redacting the DSN and URL credentials the dry-run listing printed in clear
|
2026-09-10 14:19:53 +02:00 |
|
Matthew Meszaros
|
804ac149fd
|
feat: name the API key case in the docs' 409 section, so the error-codes page lists the state-based conflict alongside the duplicate-resource one
|
2026-09-10 05:13:38 -07:00 |
|
Matthew Meszaros
|
653633d8fd
|
feat: decide what counts as a changed contact field in one place, so the panel's dirty check, its save payload and the new rebase cannot drift apart, and cover the save payload with a test
|
2026-09-10 05:13:16 -07:00 |
|
Matthew Meszaros
|
66bbdfc9d9
|
Merge pull request #416 from warmbly/fix/issue-413-contact-full-name-search
Fix: contact search now matches a full name
|
2026-09-10 05:10:41 -07:00 |
|
Matthew Meszaros
|
7c10ea854c
|
feat: rebase the contact 360 panel's draft onto the record when it changes underneath, so lifting a suppression on the Overview tab (which re-subscribes the contact) stops reading back as an unsaved edit and asking to discard changes nobody made on close (issue #415)
|
2026-09-10 05:07:37 -07:00 |
|
Matthew Meszaros
|
9e37ea73a8
|
feat: add a permanent delete for API keys, DELETE /api-keys/:id/permanent plus a Delete key button under a revoked key in the dashboard drawer and warmbly key purge, taking the key's usage logs with it and refusing any key that could still authenticate so revoking stays the step that records why a credential ended (issue #414)
|
2026-09-10 05:02:05 -07:00 |
|
Matthew Meszaros
|
47ba13083e
|
feat: make a split deployment work end to end by fixing the three defects that made an off-host node impossible to configure (nodeEnvKeys shipped S3_BUCKET and KMS_KEY_ID, which nothing reads, so an AWS-backed node silently used the default bucket and key alias; a joined consumer never received PRIMARY_DB and died at boot; and node.env was rewritten on every join with no file an operator could add to), then removing the need for cloud credentials on a node at all with brokered KMS and blob providers that renderNodeEnv hands out automatically, plus deploy/split-cloud, scripts/aws-bootstrap.sh, two fleet instance checks and the docs
|
2026-09-10 13:58:59 +02:00 |
|
Matthew Meszaros
|
9d6f71d683
|
feat: match every word of a contact search against first name, last name, email, company and phone instead of taking the query whole, so "Test Demo" finds the contact whose name is split across two columns (issue #413), cap a search at six words, and say in the contacts guide what search matches
|
2026-09-10 04:53:50 -07:00 |
|
Matthew Meszaros
|
3ab2323fe9
|
Merge pull request #412 from warmbly/fix/issue-410-scanner-networks
feat: native scanner-network filtering for tracking opens and clicks (#410)
|
2026-09-10 04:38:00 -07:00 |
|
Matthew Meszaros
|
2599d6abb2
|
feat: stop handing the website-tracking identification ticket to a recognised scanner, which filed its walk of a tracked link as the recipient's own page view, read TRACKING_SCANNER_BUILTINS the way the backend's configuration registry does so off no longer means on, and ship the whole-cloud Microsoft and Google ASN entries commented out because a recipient browsing from Azure or Google Cloud sits inside them
|
2026-09-10 04:32:52 -07:00 |
|
Matthew Meszaros
|
08f1420c0b
|
Merge branch 'main' into fix/issue-410-scanner-networks
|
2026-09-10 04:32:36 -07:00 |
|
Matthew Meszaros
|
70ef48a3de
|
Merge pull request #411 from warmbly/fix/issue-409-outlook-consent-prompt
fix: stop forcing prompt=consent on Microsoft 365 mailbox sign-in (#409)
|
2026-09-10 03:58:33 -07:00 |
|
Matthew Meszaros
|
82baf6b884
|
feat: name the source-network rule alongside the timing rules in the campaigns guide's account of what makes a click automated, so the guides page and the analytics page describe the same three rules
|
2026-09-10 03:41:53 -07:00 |
|
Matthew Meszaros
|
ca4c1279ab
|
feat: strip a scanner-catalogue comment before splitting the line on commas, so the shipped file's own prose stops being read as entries and warning about each fragment at every tracking boot, and count unreadable entries so a typo in an operator's list is visible
|
2026-09-10 03:41:10 -07:00 |
|
Matthew Meszaros
|
6684dafe3a
|
feat: classify opens and clicks that arrive from a known mail-filtering network as automated, so Microsoft 365 Defender's delivery-time pixel fetches and Safe Links URL detonations stop counting as engagement (issue #410), with a shipped scanner catalogue, TRACKING_SCANNER_* overrides and optional ASN matching from a trusted edge header
|
2026-09-10 03:38:50 -07:00 |
|
Matthew Meszaros
|
6dcbc6d6a7
|
feat: stop sending prompt=consent on the Outlook/Microsoft 365 authorize request, which made Entra ID re-run the consent eligibility check per sign-in and refuse every non-admin with AADSTS90095 even under a tenant-wide admin grant (issue #409), and ask for prompt=select_account instead so the account picker survives while Google keeps access_type=offline plus forced consent for its refresh token
|
2026-09-10 03:24:16 -07:00 |
|
Matthew Meszaros
|
1ec872cc30
|
Merge pull request #407 from warmbly/fix/issue-405-modseq-without-condstore
fix(imap): stop sending MODSEQ to servers without CONDSTORE, which failed every sync pass on IONOS
v0.4.3
|
2026-09-09 19:49:37 -07:00 |
|
Matthew Meszaros
|
6fe92c985f
|
feat: stop asking a server without CONDSTORE for MODSEQ, which made every FETCH a malformed fetch-att that IONOS answered BAD so the mailbox synced nothing on every pass (issue #405), and gate the LIST RETURN options on LIST-EXTENDED for the same reason
|
2026-09-09 19:45:01 -07:00 |
|
Matthew Meszaros
|
79a5927df9
|
Merge pull request #406 from warmbly/fix/issue-405-imap-error-noise
fix(consumer): one mailbox error row per unresolved code, not one per sync pass
v0.4.2
|
2026-09-09 10:17:40 -07:00 |
|
Matthew Meszaros
|
054115ba91
|
Merge branch 'main' into fix/issue-405-imap-error-noise
|
2026-09-09 10:13:28 -07:00 |
|
Matthew Meszaros
|
a9e57f515d
|
Merge pull request #402 from rocker1166/fix/unibox-threading-and-transport-errors
fix(imap, unibox): show the server's text for a codeless IMAP error; stop the contact rail covering the thread when the viewport narrows
|
2026-09-09 10:13:12 -07:00 |
|
Matthew Meszaros
|
2d20e1a6a0
|
Merge branch 'main' into fix/unibox-threading-and-transport-errors
|
2026-09-09 10:08:57 -07:00 |
|
Matthew Meszaros
|
bb2b2b1743
|
feat: make the one-unresolved-error-per-code rule a partial unique index with a conflict path, collapsing the duplicate rows a repeating mail error already left behind
|
2026-09-09 09:46:39 -07:00 |
|
Matthew Meszaros
|
817233cc09
|
feat: record one unresolved row per mailbox error code instead of one per sync pass, and clear IMAP_UNKNOWN when a pass completes (issue #405)
|
2026-09-09 09:30:17 -07:00 |
|
Matthew Meszaros
|
568bdb48ba
|
feat: never render an empty IMAP error detail and close the CRM rail when the viewport narrows past lg
|
2026-09-09 09:24:43 -07:00 |
|
Matthew Meszaros
|
a3e70a1420
|
Merge pull request #404 from warmbly/fix/main-ci-failure-and-issue-400
feat: unbreak the backend image build and give self-hosted instances certificates for customer tracking and forms domains
|
2026-09-09 09:11:52 -07:00 |
|