Commit Graph

  • a618d064bf feat: state in the down migration which case does not round-trip, a free plan already at zero before 000148 ran, since the up migration recorded no prior value and a zero it did not write cannot be told from one it did feat/no-ai-on-free-plan Matthew Meszaros 2026-09-12 18:04:09 +02:00
  • 2ec20e6d1e feat: take AI off the free plan, zeroing the free allowance and gating the writing assistant to paid like the inbox agent already was, because a trial that can only ever be told it has no credits reads as a broken feature rather than a locked one Matthew Meszaros 2026-09-12 17:54:02 +02:00
  • d8d929c3f0 fix: stop the contacts and campaign-leads table overflowing its panel on a long company name (#461) main Matthew Meszaros 2026-09-12 08:33:15 -07:00
  • 9f4b66c48b feat: record the one bound the clipped-text tooltip keeps, that text replaced by a realtime update under a resting cursor reads its previous value until the pointer leaves and returns, since closing it would cost a layout read per row per frame on mousemove to buy a sub-second window on a tooltip fix/issue-461 Matthew Meszaros 2026-09-12 08:22:57 -07:00
  • bc6c4a0b7e feat: settle who owns a cell's title attribute between React and the clipped-text tooltip helper, matching on the exact string the helper last wrote rather than on the element, so a caller that starts supplying a title after the helper has already titled that node keeps it, and giving a lead's status label the failure reason as a React-managed title so a transition into failed while the pointer rests on the pill overwrites the status word the helper left there instead of stranding it over the reason for the life of the node Matthew Meszaros 2026-09-12 08:12:52 -07:00
  • 79758e38fa feat: stop the clipped-text tooltip helper removing a title it did not set, which would have cost the next caller a React-managed tooltip for good after one hover since React rewrites that attribute only when the prop changes, tracking the elements it titled in a WeakSet instead; and settle the contact row's tag area on one chip plus a count, because two tags sharing a now fixed-width Name column with the name left each of them about three legible characters, while dropping the per-chip clamp that had capped every compact chip at 72px at every width and put a long tag out of reach of a touch or keyboard user Matthew Meszaros 2026-09-12 08:01:46 -07:00
  • 0b12102be8 feat: name the clipped-text tooltip helper's file after what it actually exports, clippedTitle, now that the module hands out a spreadable pair of mouse handlers rather than the single titleWhenClipped function it started as Matthew Meszaros 2026-09-12 07:52:13 -07:00
  • 62e98358c2 feat: keep the contacts list's subscribed state and the campaign lead's progress readable by a screen reader below sm, where both pills are their icon alone and the word was display:none, by holding the label in a permanently screen-reader-only span and hiding the visible copy from the accessibility tree instead, which also keeps the sm+ label's truncation intact where sm:not-sr-only would have reset the overflow and white-space that truncate depends on Matthew Meszaros 2026-09-12 07:23:53 -07:00
  • f00dd0fdf6 feat: stop the contacts and campaign-leads table widening past its panel when a long company name arrives, by moving it off auto table layout, where one cell's nowrap text sets its column's min-content and pushes a horizontal scrollbar under the whole list, onto table-fixed with a declared width per column and clipping in every cell, Name the one auto column so it takes all the slack, each free-text column truncating into a native tooltip that only appears where the text was actually cut off, and the column set restaged per breakpoint so the sized columns never sum past the content panel at any width (#461) Matthew Meszaros 2026-09-12 07:15:59 -07:00
  • 1f7e036659 fix: mailbox onboarding accepts connections that cannot work, and hides why (#465) v0.4.6 Matthew Meszaros 2026-09-12 08:07:20 -07:00
  • d456bc48c6 feat: fix the Warmbly Cloud pool link across both roles (#262): take an enrolled mailbox out of this instance's own warmup pool so local partners stop writing to it and their unverifiable warmup stops landing in the owner's unibox, recognise the cloud's warmup mail whose verify header did not survive delivery through a new warmup-deliveries lookup that ignores consumed_at because instance and cloud read the same mailbox, move the managed-mailbox access token route behind NODE_BROKER_TOKEN so the internet-facing tracking and forms services can no longer mint a live provider token, scope pause and resume to the caller's workspace, keep an enrolled mailbox listed once it goes inactive, release the cloud copy when the local mirror row cannot be written, refuse the one-time handshake when CREDENTIALS_ENCRYPTION_KEY is missing, blank an expired code's plaintext instance token, and stop errx answering 200 for a status outside its table Matthew Meszaros 2026-09-12 06:58:25 -07:00
  • 06b8db5529 feat: report the one silent state a campaign had no words for, a mailbox pool that is part out of budget and part outside its own sending hours, which fell between the 'every mailbox is capped, sending resumes tomorrow' line and the deliberately unlogged closed-hours band and so left an active campaign sending nothing with an empty activity feed; give it its own line under the mailboxes_unavailable event the pool's other refusals already use, naming how many mailboxes are in each state and carrying the moment the pool comes back in metadata rather than promising a day, while leaving daily_cap_reached to mean exactly what it meant before, every usable mailbox spent and nothing coming back until tomorrow Matthew Meszaros 2026-09-12 03:47:36 -07:00
  • c4aece241b feat: scope the tag, category and folder registries and unibox conversation labels to the organization instead of the creating user, so a teammate sees and can edit the labels the owner made, splitting a label two workspaces shared into one copy each and guarding every label write against ids from another workspace (#457) Matthew Meszaros 2026-09-12 03:37:31 -07:00
  • 7abb896e7e feat: deduplicate the folder usage set in the 000147 split pass, because unlike the tag and category sets it has no UNION to collapse it, so a folder on two campaigns in one workspace counted as two workspaces and minted itself twice there fix/issue-436 Matthew Meszaros 2026-09-12 03:19:56 -07:00
  • 1ca4fece6f feat: split a label two workspaces shared into one copy each during migration 000147 rather than stranding the other workspace's links, scope the conversation-label reads and the automation thread lookup to the organization, and read a relation's current set within its scope so an out-of-scope link is never echoed back Matthew Meszaros 2026-09-12 03:16:32 -07:00
  • ade86d1b86 feat: scope the tag, category and folder registries plus unibox conversation labels to the organization instead of the creating user (migration 000147), so a teammate sees and can edit the labels the owner made (#436), and guard every label write in email/campaign/contact/form/unibox repositories against ids belonging to another workspace Matthew Meszaros 2026-09-12 02:47:28 -07:00
  • 5869a2148f feat: stop a campaign sending outside its sending window, and past its end date, when a follow-up is overdue: the placer's schedule gates are asked about the moment a step became due, and nextScheduleSlot deliberately returns an instant that was already inside a window unchanged, so a step that came due at 2pm still read as due at 11pm and the task sent it there, while the end-date comparison found a candidate predating the end date; floor an overdue candidate at now so the window, the weekday mask and the end date are all asked about the send that is actually about to happen, with live tests for a closed window, a passed end date and the overdue step that must still go out promptly while the window is open Matthew Meszaros 2026-09-12 03:29:33 -07:00
  • 7754dac629 Merge pull request #458 from warmbly/feature/contact-page-real-data Matthew Meszaros 2026-09-12 03:15:04 -07:00
  • 5857a6ddd8 Merge remote-tracking branch 'origin/main' into feature/contact-page-real-data Matthew Meszaros 2026-09-12 03:13:42 -07:00
  • 47defafa09 feat: fix the six self-host defects reported in issue #439 (#456) Matthew Meszaros 2026-09-12 03:13:38 -07:00
  • 9ce576bb3f feat: rebuild the marketing contact page as a minimal list of real channels (team@warmbly.com, the Discord, GitHub issues and discussions, docs, status) and the Mindroot Ltd registration, dropping the invented Delaware entity, postal address, team locations, business hours and SLA Matthew Meszaros 2026-09-12 03:02:57 -07:00
  • dc9ce403de feat: stop one un-sendable lead parking a whole campaign and stop the contact drawer's next-action time walking forward on every refresh (issue #437): route up to config.CampaignPlacementCandidates due leads per pass instead of one, classify a placement refusal that belongs to a single lead (ESP-strict finding no mailbox for that recipient's provider, a bound lead inside its own mailbox's minimum gap or waiting for it to reopen, a recipient's send-time-optimized hours) as the new ErrLeadDeferred so the pass moves to the lead behind them and only defers the campaign when every candidate is refused, log the ESP-strict deferral once a day rather than once per refused lead per tick, and make PreviewContactSend a pure read that answers unchanged state identically on every call by running placement with the even-distribution, jitter, conflict-resolution, distribution-curve and sub-minute layers off, taking a behaviour profile's gap at its floor instead of drawing it, picking the mailbox deterministically instead of re-rolling rotation, reporting the next sending day's first open minute instead of a jittered twenty-four-hours-from-now, and reporting a due step's time as the campaign chain's own stored wakeup Matthew Meszaros 2026-09-12 02:58:48 -07:00
  • b0050507e4 fix: tell a joining node a tag that exists, falling back to the published prod tag instead of a latest this project has never published, and drop the WORKER_IMAGE docs left behind by the removed push-based provisioning (#455) v0.4.5 Matthew Meszaros 2026-09-12 01:00:11 -07:00
  • 26f4549f63 fix: redact the credential from the Redis URL the realtime service logs on every boot, keeping the address that makes the line useful (#454) Matthew Meszaros 2026-09-12 00:52:18 -07:00
  • ca1c10ec72 fix: give the realtime Redis event bridge the same wildcard TLS options as the command pool, because it is a second connection that a managed Redis rejects and it is the one that delivers every realtime event (#453) Matthew Meszaros 2026-09-12 00:41:30 -07:00
  • a4f503f620 fix: realtime cannot complete either of its TLS connections (#452) Matthew Meszaros 2026-09-12 00:29:34 -07:00
  • ee9e8706fb feat: build librdkafka with OpenSSL in the tracking service so security.protocol=SASL_SSL works, which every managed broker requires and which the cmake-build-only feature set silently disabled (#451) Matthew Meszaros 2026-09-11 23:37:20 -07:00
  • fa252aebe8 Merge pull request #443 from warmbly/feature/editor-image-links-and-buttons Matthew Meszaros 2026-09-11 23:06:29 -07:00
  • 8a2856fce0 Merge branch 'main' into feature/editor-image-links-and-buttons Matthew Meszaros 2026-09-11 23:02:15 -07:00
  • e8186e5f52 fix: the tracking service must not write Avro to a JSON consumer (#450) Matthew Meszaros 2026-09-11 23:00:15 -07:00
  • ea8d15374e Merge branch 'main' into feature/editor-image-links-and-buttons Matthew Meszaros 2026-09-11 22:56:16 -07:00
  • 184cc951f0 Merge pull request #444 from warmbly/fix/issue-432 Matthew Meszaros 2026-09-11 22:52:54 -07:00
  • 88b483d227 Merge branch 'main' into fix/issue-432 Matthew Meszaros 2026-09-11 22:47:54 -07:00
  • 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) Matthew Meszaros 2026-09-11 22:46:02 -07:00
  • 1f1112fe93 feat: drop the AI edit's parked review selection when the popover closes, because a result that changes nothing commits no new value and so leaves the layout effect nothing to run on, and the range would then be worn by whatever unrelated edit commits next and yank the caret back into a rewrite the user had already dismissed Matthew Meszaros 2026-09-11 22:42:50 -07:00
  • f41eac289d Merge branch 'main' into fix/issue-432 Matthew Meszaros 2026-09-11 22:35:43 -07:00
  • 20b13dcea7 Merge branch 'main' into feature/editor-image-links-and-buttons Matthew Meszaros 2026-09-11 22:34:38 -07:00
  • 280a3e64ac feat: publish Kafka-linked image variants (#448) Matthew Meszaros 2026-09-11 22:31:41 -07:00
  • 4bf412c226 feat: decide the AI edit's No change signal from the value the composer will actually hold rather than from the model's answer, since a rewrite whose every added character falls past the body-length cap leaves the textarea exactly as it was and reporting Rewritten over an unchanged body is the one thing that signal exists to prevent Matthew Meszaros 2026-09-11 22:30:32 -07:00
  • a3aec0a9cb Merge branch 'main' into feature/editor-image-links-and-buttons Matthew Meszaros 2026-09-11 22:27:11 -07:00
  • ea321ebefb feat: put the AI edit's review selection back after React commits the value rather than before it, since React writes the textarea's value during commit and that write moves the cursor to the end, leaving the rewrite unselected and Undo's restored range never reaching the DOM, and strengthen the Undo test to assert the range a follow-up run targets instead of the restored value, which Undo sets regardless and which therefore pinned none of the behaviour the commit before it fixed Matthew Meszaros 2026-09-11 22:22:55 -07:00
  • d42aeea1aa Merge pull request #447 from warmbly/feat/kafka-topic-creation Matthew Meszaros 2026-09-11 21:59:41 -07:00
  • 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 Matthew Meszaros 2026-09-12 06:54:34 +02:00
  • af7256ac85 feat: address the third review pass on the Edit with AI fix by recording the range a rewrite replaced instead of working it back out of the lengths afterwards, because the composer's body cap can cut the tail off what was written and the old arithmetic then reconstructed a range that was never selected, so Again re-sent the wrong words and Undo restored the wrong selection, with a test mounting the real textarea host against a small cap to pin both Matthew Meszaros 2026-09-11 21:33:46 -07:00
  • 069ab15194 feat: address the second review pass on the Edit with AI fix by reading a markdown destination with balanced parentheses so a link the model normalises out of the angle-bracket form it was given comes back whole instead of truncated at the first paren with a stray one left in the copy, restoring only spaces and tabs around the model's answer so a selection that ran to the start of the next paragraph joins the two the way a paste would rather than gaining a blank paragraph nobody typed, and capping the completion at a flat 4096 tokens, above the 3072 it was and below the smallest completion limit in common use, because a request over a backend's own cap earns a 400 naming max_tokens that openAIProvider.adaptParams latches for the life of the process and degrades every later call Matthew Meszaros 2026-09-11 21:21:40 -07:00
  • 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 Matthew Meszaros 2026-09-12 06:02:49 +02:00
  • 704e793c8a Merge branch 'main' into feature/editor-image-links-and-buttons Matthew Meszaros 2026-09-11 20:57:20 -07:00
  • 74771004c4 Merge pull request #446 from warmbly/feat/nats-max-bytes Matthew Meszaros 2026-09-11 20:45:19 -07:00
  • 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 Matthew Meszaros 2026-09-12 05:40:43 +02:00
  • f7e1deeae4 Merge pull request #445 from warmbly/feat/nats-credentials Matthew Meszaros 2026-09-11 20:34:10 -07:00
  • 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 Matthew Meszaros 2026-09-12 05:29:09 +02:00
  • 1bdd1da800 feat: address the CodeRabbit review on the Edit with AI fix by leaving the caret after text written at a collapsed position instead of in front of it (an insertion maps to itself unless the position associates rightwards, so continuing to type went before the insert), splitting the model's blocks one separator at a time so a blank paragraph the author used as spacing survives a rewrite instead of being swallowed by a greedy newline run, carrying a link destination that holds a paren or a space through in markdown's angle-bracket form rather than dropping the link, putting the author's boundary whitespace back on the model's trimmed answer in both hosts so a selection ending on a space does not glue the rewrite to the next word and "did anything change?" compares exactly what was written, and sizing the completion cap from the passage's own rune count so an 8000-rune CJK body is not truncated by a cap chosen for English Matthew Meszaros 2026-09-11 20:23:53 -07:00
  • 63440e9abb feat: pick a button's label colour by comparing both contrast ratios instead of testing luminance against a threshold, move the sky, emerald and amber swatches to the shade where a white label clears 4.5:1, and clamp the floating node bar inside every viewport edge rather than only the right one Matthew Meszaros 2026-09-11 20:16:07 -07:00
  • 6501cb599c feat: fix the "Edit with AI" rewrite in the campaign body and the unibox composer for issue #432 by running /generation/edit on a new generation.BuildEditRules system prompt through AIProvider.Complete instead of the cold-outreach writer prompt that redefined the model's role, capped it at 80 words and imposed a five-part email skeleton on every instruction, raising the completion cap so a full-body rewrite is no longer truncated at 1024 tokens and counting the request limits in runes rather than bytes, carrying merge variables, AI blocks, conditionals, form links and link destinations through the round trip in web/src/components/app/ai/richTextPassage.ts instead of deleting every atom node via doc.textBetween, replacing the passage with paste semantics so a phrase rewritten inside a sentence stops splitting its paragraph into three, saying "No change" when the model hands the passage back untouched, and clamping the floating AI card to the surface it is editing so it no longer draws outside the step drawer over the flow canvas Matthew Meszaros 2026-09-11 20:04:32 -07:00
  • 3ee636e2e6 Merge branch 'main' into feature/editor-image-links-and-buttons Matthew Meszaros 2026-09-11 20:01:18 -07:00
  • 7ff9f4d2c6 feat: let a campaign body image carry a link and add a call-to-action button to the editor toolbar, both rendered as mail-safe markup (an anchor-wrapped img, a one-cell table whose cell holds the colour and padding for Outlook's Word engine), with the plain-text half now keeping every link destination Matthew Meszaros 2026-09-11 20:01:16 -07:00
  • f4581108ca Merge pull request #441 from warmbly/fix/issue-434 Matthew Meszaros 2026-09-11 10:21:04 -07:00
  • 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 Matthew Meszaros 2026-09-11 09:12:22 -07:00
  • 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 Matthew Meszaros 2026-09-11 09:01:17 -07:00
  • 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 Matthew Meszaros 2026-09-11 08:57:52 -07:00
  • 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 Matthew Meszaros 2026-09-11 08:56:03 -07:00
  • a542bb2c9c Merge pull request #427 from chrisedington/feat/cleanmylist-verification Matthew Meszaros 2026-09-11 06:17:37 -07:00
  • a5b0e2c2f3 Merge branch 'main' into feat/cleanmylist-verification Matthew Meszaros 2026-09-11 06:12:10 -07:00
  • 87e3f7006d Merge pull request #438 from warmbly/fix/scanner-timing-window Matthew Meszaros 2026-09-11 06:09:06 -07:00
  • 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 Matthew Meszaros 2026-09-11 06:04:38 -07:00
  • 9698052569 Merge branch 'main' into feat/cleanmylist-verification Matthew Meszaros 2026-09-11 06:03:55 -07:00
  • 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 Matthew Meszaros 2026-09-11 05:26:33 -07:00
  • 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 Matthew Meszaros 2026-09-11 04:24:17 -07:00
  • 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 Matthew Meszaros 2026-09-11 04:15:19 -07:00
  • 0e8a05b6df Merge remote-tracking branch 'origin/main' into fix/scanner-timing-window Matthew Meszaros 2026-09-11 04:02:06 -07:00
  • 3bfbb75e8c Merge pull request #435 from rocker1166/fix/invite-mismatch-and-inbox-actions Matthew Meszaros 2026-09-11 03:58:24 -07:00
  • 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 Matthew Meszaros 2026-09-11 03:23:23 -07:00
  • 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 Matthew Meszaros 2026-09-11 03:23:19 -07:00
  • 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 Matthew Meszaros 2026-09-11 03:12:28 -07:00
  • 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 Matthew Meszaros 2026-09-11 03:11:35 -07:00
  • 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 SUMAN JANA 2026-09-11 03:10:18 -07:00
  • 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 SUMAN JANA 2026-09-11 07:19:25 +00:00
  • 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 Matthew Meszaros 2026-09-11 03:02:58 -07:00
  • 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 Matthew Meszaros 2026-09-11 02:57:08 -07:00
  • 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 Matthew Meszaros 2026-09-11 02:53:34 -07:00
  • 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 Matthew Meszaros 2026-09-11 11:34:02 +02:00
  • 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 Matthew Meszaros 2026-09-11 06:02:21 +02:00
  • 853afe458e Merge pull request #430 from warmbly/fix/bootstrap-and-tracking-domain-check Matthew Meszaros 2026-09-10 20:29:46 -07:00
  • 947ba4f2d0 Merge pull request #429 from warmbly/fix/rds-tls-verification Matthew Meszaros 2026-09-10 20:29:35 -07:00
  • 62903b3806 Merge pull request #428 from warmbly/fix/tracking-rustls-provider Matthew Meszaros 2026-09-10 20:29:23 -07:00
  • 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 Matthew Meszaros 2026-09-11 05:24:57 +02:00
  • 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 Matthew Meszaros 2026-09-11 05:23:23 +02:00
  • 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 Matthew Meszaros 2026-09-11 05:19:52 +02:00
  • 59122e6c8a feat: add CleanMyList contact verification with API key setup and built-in fallback Chris Edington 2026-09-10 20:06:29 +01:00
  • 1260dff108 Merge pull request #426 from warmbly/feature/posthog-error-tracking v0.4.4 Matthew Meszaros 2026-09-10 10:28:28 -07:00
  • a84ab48729 Merge branch 'main' into feature/posthog-error-tracking Matthew Meszaros 2026-09-10 10:25:21 -07:00
  • 3bd9d2a1d7 Merge pull request #424 from warmbly/feature/issue-421-implementation Matthew Meszaros 2026-09-10 10:18:10 -07:00
  • 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 Matthew Meszaros 2026-09-10 19:16:13 +02:00
  • 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 Matthew Meszaros 2026-09-10 19:15:21 +02:00
  • 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 Matthew Meszaros 2026-09-10 19:14:34 +02:00
  • f8625b085a Merge remote-tracking branch 'origin/main' into feature/issue-421-implementation Matthew Meszaros 2026-09-10 10:12:04 -07:00
  • 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 Matthew Meszaros 2026-09-10 19:11:32 +02:00
  • abe9800d5b Merge pull request #425 from warmbly/fix/dockerfile-cache-mount-ids Matthew Meszaros 2026-09-10 10:09:33 -07:00
  • 4b93e849a1 feat: drop the occurrence struct left behind in the round-robin span emitter, which the map of per-term span lists replaced before it was ever used and which golangci-lint's unused check does not flag for an unreferenced type Matthew Meszaros 2026-09-10 10:07:18 -07:00
  • 512451c8d6 feat: give every BuildKit cache mount an explicit id so the Dockerfiles build on hosted builders that reject an unnamed one, which is what stopped the backend, consumer, worker, forms, cli, updater and tracking images from building on Railway with 'flag --mount=type=cache is missing an id argument' Matthew Meszaros 2026-09-10 19:05:01 +02:00