Matthew Meszaros
|
4e2fdec482
|
feat: document the resumable gateway (resume/replay, seq, resume_failed) in realtime.mdx and publish a machine-readable AsyncAPI 3.1 spec at docs/asyncapi.json describing the org channel, join/resume, HELLO, events, intents, and presence
|
2026-06-13 11:29:12 +02:00 |
|
Matthew Meszaros
|
4552ab4e31
|
feat: make the org realtime channel a resumable gateway — assign a monotonic per-org sequence + buffer each event in a capped Redis stream (Realtime.EventLog) before broadcast, advertise the current seq in the HELLO and stamp it on every event, and replay the missed gap (re-filtered) on reconnect via resume.last_seq or signal a full resync when the buffer no longer covers the client
|
2026-06-13 11:23:07 +02:00 |
|
Matthew Meszaros
|
3c7c0b6411
|
fix: finish the opaque-cursor doc sweep — change the offset query params to cursor on the CRM search operations in the OpenAPI spec, and drop the dead SearchContacts.Offset field and its docs (clamped but never used in SQL)
|
2026-06-13 11:00:59 +02:00 |
|
Matthew Meszaros
|
aed4a06190
|
feat: unify pagination by making the offset-based CRM deals/tasks search and meetings endpoints expose the same opaque next_cursor and {total, next_cursor, has_more} envelope as every keyset list (offset hidden inside the token), updating web clients, the OpenAPI spec, and the reference docs
|
2026-06-13 10:47:17 +02:00 |
|
Matthew Meszaros
|
3b987f38d0
|
feat: replace the fabricated SDK code samples and First-class SDKs claims on the developers page with honest plain-HTTP examples and an accurate OpenAPI-and-generate-your-own-client story
|
2026-06-13 07:29:17 +02:00 |
|
Matthew Meszaros
|
013a73b9be
|
feat: publish a machine-readable OpenAPI 3.1 spec at docs/openapi.json covering 204 operations across the public API, with an OpenAPI docs page describing how to generate clients from it
|
2026-06-13 07:29:17 +02:00 |
|
Matthew Meszaros
|
57e8705a82
|
feat: make public API list cursors opaque base64 tokens (internal/utils/paging) instead of raw record UUIDs, decoding on input with a 400 on a bad cursor; admin endpoints keep transparent UUID cursors
|
2026-06-13 07:18:23 +02:00 |
|
Matthew Meszaros
|
587eae774e
|
feat: serve the entire customer API (auth + resources) only under /v1 with no unversioned alias, and repoint the web and admin clients to the versioned base accordingly
|
2026-06-13 07:18:23 +02:00 |
|
Matthew Meszaros
|
7901e9a92c
|
feat: wire the Pub/Sub realtime provisioning, the instant-branch automation runner, and the campaign-chain reconciler into the backend and consumer binaries
|
2026-06-13 06:27:06 +02:00 |
|
Matthew Meszaros
|
49b01c6b67
|
feat: version the public API under /v1 by mounting the customer surface under both /v1 and the bare paths, adding an API-Version response header and Deprecation/Sunset headers nudging API-key callers off the unversioned aliases
|
2026-06-13 06:27:01 +02:00 |
|
Matthew Meszaros
|
71abb12a38
|
feat: stop campaigns silently stalling on a transient scheduler error by retrying instead of completing the task, end past-end-date campaigns cleanly, record scheduler failures to the campaign log, add a campaign-chain reconciler, and surface failures live in the dashboard activity panel
|
2026-06-13 06:27:01 +02:00 |
|
Matthew Meszaros
|
919af47d29
|
feat: select the realtime transport by PUBSUB_ENABLED in backend/consumer and auto-provision the Pub/Sub topics and per-topic subscriptions on boot so prod never publishes to a subscription the Elixir fanout never created
|
2026-06-13 06:26:48 +02:00 |
|
Matthew Meszaros
|
c5911fe37a
|
feat: fire run_automation on campaign instant branches (reply/open/click) through a wired AutomationRunner instead of stamping the action node sent without ever running the flow
|
2026-06-13 06:26:48 +02:00 |
|
Matthew Meszaros
|
969d53af6d
|
feat: animate the top-left Add-step dropdown the same as the drag-create menu (AnimatePresence scale + fade growing from the top-left) instead of appearing instantly
|
2026-06-12 17:47:05 +02:00 |
|
Matthew Meszaros
|
cc52878966
|
fix: apply cargo fmt to the tracking service (line wrapping in abuse.rs, config.rs, links.rs) so the Rust CI format check passes
|
2026-06-12 17:45:32 +02:00 |
|
Matthew Meszaros
|
c5ced50868
|
fix: apply mix format to the realtime service (supervisor child-list indentation in application.ex + org_channel.ex) so the Elixir CI format check passes
|
2026-06-12 17:45:32 +02:00 |
|
Matthew Meszaros
|
e321d582dc
|
feat: smoother campaign steps canvas — position-preserving layout (no jump on connect/disconnect), an animated drag-create dropdown, Condition adds the if-branch directly instead of a router you drag from, an open then dot instead of an auto-STOP, then-targets placed to the right for clean branch lanes, and the label-email action
|
2026-06-12 16:44:29 +02:00 |
|
Matthew Meszaros
|
c41205ec9a
|
feat: rework the automation canvas — drag a node's dot to empty for an animated create dropdown (reliable react-flow pane detection), unified dagre spacing for smoother branch lines, and the label-email built-in action gated to reply triggers
|
2026-06-12 16:44:29 +02:00 |
|
Matthew Meszaros
|
13e7663b03
|
feat: add the label_email action to the web action models — the campaign label_ids field plus the automation NATIVE_ACTIONS/labels/needs entries and a triggerCarriesThread reply-trigger gate
|
2026-06-12 16:44:29 +02:00 |
|
Matthew Meszaros
|
92a74d9364
|
feat: document the label-email action in the steps and automations guides — reply-only, applies the shared category labels to the conversation the contact replied on, gated to the reply trigger
|
2026-06-12 16:44:29 +02:00 |
|
Matthew Meszaros
|
ba89a932cd
|
feat: run the label_email action on reply — campaign instant and scheduled paths via advanced LabelThread/LabelLatestThreadForContact, automations via execNativeAction reading thread_id and _user_id from the reply payload — and move the native-actions adapter to a shared package wired into the consumer too so reply/bounce/warmup automation actions stop silently failing
|
2026-06-12 16:44:16 +02:00 |
|
Matthew Meszaros
|
4762256c49
|
feat: add the warmbly.label_email native action type and the label_ids action config field across the campaign ActionConfig and the IntegrationAction enum + IsNativeAction
|
2026-06-12 16:44:07 +02:00 |
|
Matthew Meszaros
|
496e474756
|
feat: add additive unibox thread-label repo methods — AddThreadLabels (insert-only, category-ownership guarded) and LatestThreadIDForContact (exact from_addr address match, never an ILIKE substring) — to back a reply-only label-email action
|
2026-06-12 16:44:07 +02:00 |
|
Matthew Meszaros
|
5c7045d742
|
fix: open the drag-create dropdown reliably by detecting drops on the react-flow pane (via onConnectStart ref + pane-class check) instead of connectionState.toNode, and route IF-block drags through the menu too so you can chain another condition
|
2026-06-12 12:55:54 +02:00 |
|
Matthew Meszaros
|
eb74b7dafb
|
feat: fix the Steps tab still pointing at /sequences and replace remaining user-facing Sequences with Steps (route page + folder renamed to steps, document title regex, permission labels, not-found hint, campaign count)
|
2026-06-12 10:03:02 +02:00 |
|
Matthew Meszaros
|
aba0878833
|
feat: replace the per-node amber if-dot with a single output dot that opens a drag-drop create menu (email, action, or condition) on release, and add a Condition router node (kind wait) you can chain into nested decision trees
|
2026-06-12 09:51:11 +02:00 |
|
Matthew Meszaros
|
a7a43e0c4c
|
feat: rename the campaign sequences resource to steps across the API and URL (/campaigns/:id/steps), the JSON fields (target_step_id, step_id/step_name/step_index, analytics steps[], create body steps), the web client/models/route segment/labels, the audit step entity type, and the wire-contract docs; internal Go type names and the Kafka avro schema stay
|
2026-06-12 09:38:11 +02:00 |
|
Matthew Meszaros
|
a69bf78b2c
|
feat: move the full email toolset (template picker, save as template, write with AI, content score) into the shared EmailContentEditor and have the original step composer use it too, so every A/B variant has the identical tools as the main email
|
2026-06-12 09:09:34 +02:00 |
|
Matthew Meszaros
|
e7977d7bdf
|
feat: edit a step's email and its A/B variants in one horizontal tab bar (Original as the first tab plus a tab per variant, each showing its split share), with an embedded SequenceView for the original arm
|
2026-06-12 08:39:12 +02:00 |
|
Matthew Meszaros
|
2c4b0a07df
|
feat: give A/B variants the same composer as the main email via a shared EmailContentEditor (subject + body + Edit/Preview render + template validation), so a variant is edited and content-checked exactly like the step's own email
|
2026-06-12 08:32:56 +02:00 |
|
Matthew Meszaros
|
85d5d04afe
|
feat: clarify in the sequences guide that the A/B original is a control arm in the weighted split with a live per-arm share shown in the editor
|
2026-06-12 08:04:44 +02:00 |
|
Matthew Meszaros
|
8de7e32857
|
feat: treat a campaign step's own email as the A/B control arm so contacts split across the original plus active variants by weight, and redesign the step variants editor to show the original and variants as one weighted set with live split percentages
|
2026-06-12 08:04:03 +02:00 |
|
Matthew Meszaros
|
7b34b96b37
|
feat: keep the per-user realtime connection cap at 10 but reap dead connections via a periodic liveness sweep and process pids, so the count reflects real presence and stale sockets never hold a slot
|
2026-06-12 07:46:13 +02:00 |
|
Matthew Meszaros
|
5d2882ccf8
|
feat: strip leaked agent reasoning and select the corrected final draft for campaigns and deliverability reference pages, removing duplicate frontmatter, an em dash, and a Cyrillic placeholder char
|
2026-06-12 07:39:57 +02:00 |
|
Matthew Meszaros
|
bfd67bfa2a
|
feat: correct API key prefix examples to the real wmbly_ format and link the endpoint reference from the API docs index
|
2026-06-12 07:29:45 +02:00 |
|
Matthew Meszaros
|
54a1aee753
|
feat: add full per-resource API endpoint reference under docs/api/reference (mailboxes, campaigns, contacts, unibox, crm, analytics, api-keys, webhooks, integrations, deliverability/ops, account/org) with request and response structures
|
2026-06-12 07:28:19 +02:00 |
|
Matthew Meszaros
|
3cbfc06bc4
|
feat: add WebSocket intents (selective event-family subscription) and a HELLO-style org join reply advertising heartbeat cadence, and correct realtime docs on connection rejections and at-most-once delivery
|
2026-06-12 07:17:09 +02:00 |
|
Matthew Meszaros
|
50a134c827
|
feat: document org team-presence privacy controls in the collaboration guide and realtime API reference
|
2026-06-12 05:59:02 +02:00 |
|
Matthew Meszaros
|
6e9f2b4807
|
feat: add a Team presence section to workspace settings with admin-gated Show who's online and Show activity toggles, and make ToggleRow support a controlled persisted mode
|
2026-06-12 05:59:01 +02:00 |
|
Matthew Meszaros
|
4f1ac8c273
|
feat: enforce org team-presence privacy in the realtime OrgChannel — gate Presence.track on show_online, strip viewing/editing detail when show_activity is off, and re-track/untrack live on PRESENCE_POLICY_UPDATED
|
2026-06-12 05:59:01 +02:00 |
|
Matthew Meszaros
|
0fd3d03f55
|
feat: add org-wide team presence privacy columns (presence_show_online, presence_show_activity) with update plumbing and a PRESENCE_POLICY_UPDATED realtime event so a settings change re-gates connected sockets live
|
2026-06-12 05:59:01 +02:00 |
|
Matthew Meszaros
|
8547fe97eb
|
feat: scope unibox MarkSeenBulk by organization so a non-owner member opening a thread clears the shared org-wide unread state instead of updating zero rows
|
2026-06-12 05:14:50 +02:00 |
|
Matthew Meszaros
|
4db027a342
|
feat: scope unibox GetByThread by organization instead of user_id so non-owner members see the full conversation they already see in the org-scoped inbox list, not an empty thread
|
2026-06-12 05:10:00 +02:00 |
|
Matthew Meszaros
|
81f81fbe20
|
feat: normalize automation updated_at to a primitive before comparing it (the API client revives it into a Date, so === compared by reference and the editor always flagged its own save as a teammate change)
|
2026-06-12 04:58:46 +02:00 |
|
Matthew Meszaros
|
ba3ab98e1e
|
feat: bridge realtime events over Redis pub/sub when Google Pub/Sub is unconfigured (RedisBus publisher in backend/consumer plus Realtime.Redis.EventSubscriber and a shared EventBroadcaster) so dashboard live updates and presence-driven collaboration actually fire in local dev
|
2026-06-12 04:49:58 +02:00 |
|
Matthew Meszaros
|
21f25a5361
|
feat: use automation updated_at as the remote-version token in AutomationFlow so the editor stops falsely toasting its own save as a teammate change
|
2026-06-12 04:34:13 +02:00 |
|
Matthew Meszaros
|
f6540d9f2f
|
feat: rejoin org/user channels and force isConnected toggle on zombie-socket wake so a backgrounded dashboard tab resumes realtime events and presence without a reload
|
2026-06-12 04:34:13 +02:00 |
|
Matthew Meszaros
|
48ce9074eb
|
feat: automation presence reflects intent — editors claim 'editing', view-only members claim 'viewing', so the resource viewers stack and online dropdown show accurate activity
|
2026-06-11 19:55:01 +02:00 |
|
Matthew Meszaros
|
c2215a62c1
|
feat: richer online-presence dropdown — click to pin, profile pictures, a live online + editing count, and clear per-person activity ('Editing an automation', 'Viewing a conversation', 'Replying to a message') with color-coded icons instead of a bare 'editing'
|
2026-06-11 19:54:44 +02:00 |
|
Matthew Meszaros
|
801c6b8619
|
fix: faster, research-backed websocket reconnect — replace the slow 1s/2s/4s exponential backoff with a fast-start schedule (first retry ~120ms) plus jitter, lower the heartbeat to 25s/8s for quicker dead-connection detection, retry token-fetch failures on the same fast backoff, and clear a Safari-suspended CONNECTING zombie socket on tab refocus so it reconnects instantly instead of hanging
|
2026-06-11 19:52:55 +02:00 |
|