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
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
Matthew Meszaros
9731083ae2
feat: live-collaborate on automations — the builder canvas now reflects a teammate's save in real time instead of only after a reload (re-seeds when you have no unsaved edits, shows a non-destructive 'load their version / keep mine' banner when you do), fixing the seed-once canvas that never reacted to remote changes
2026-06-11 19:51:05 +02:00
Matthew Meszaros
393b683fa2
feat: lock the campaign sequence flow for members without manage-sequences — view-only members can't drag steps, draw branches, or add a step (each attempt pops the permission popup and the Add-step button shows a lock), while pan/zoom/inspect still work
2026-06-11 19:17:20 +02:00
Matthew Meszaros
605583c301
feat: proactively lock the automation builder Save button for members without the integration permission, with a lock icon and permission popup
2026-06-11 19:00:45 +02:00
Matthew Meszaros
384579a36b
feat: proactively lock the campaign Start/Pause, settings Save and schedule Save buttons for members without send/manage-campaign permission (lock icon + permission popup before any request)
2026-06-11 19:00:09 +02:00
Matthew Meszaros
9024d6bc21
feat: add proactive write-permission primitives — useWriteGuard (blocks a denied action before any request and pops the permission dialog) and PermissionButton (auto-locks with a lock icon when the member lacks the permission)
2026-06-11 18:51:59 +02:00
Matthew Meszaros
fd440627fe
fix: portal the sidebar access-locked popup to document.body so it covers the whole screen instead of clipping inside the transformed sidebar aside
2026-06-11 18:49:15 +02:00
Matthew Meszaros
a0221dd312
feat: show one clear, app-wide 'you don't have permission' popup whenever a write action (edit/save/delete) is denied with 403, naming the missing permission or plan, instead of silent failures and generic error toasts across the dashboard
2026-06-11 18:30:53 +02:00
Matthew Meszaros
44d7c2a0c1
fix: make the realtime websocket reconnect reliably — reconnect on every unintended close (not just unclean ones), detect silently-dropped connections via a heartbeat watchdog that force-closes to trigger reconnect, and reconnect immediately when the network returns or the tab is refocused
2026-06-11 18:18:24 +02:00
Matthew Meszaros
21b4ba4ea0
fix: let members with the integration permission save automations (write was gated on manage-settings while read used use-integrations, so a manager could open the builder but 403 on save) and surface the backend's real error in the save toast instead of a generic message
2026-06-11 18:15:55 +02:00
Matthew Meszaros
4440613d94
feat: sidebar shows a lock on features the member can't access and pops an explanatory access dialog on click, so a locked feature reads as unavailable instead of an empty page mistaken for 'no data'; align Accounts gate on Manage mailboxes
2026-06-11 17:17:48 +02:00
Matthew Meszaros
babde3397c
feat: apply the explicit no-access message to campaigns, contacts, analytics, and API keys pages too, so every permission-gated tab says which permission is missing instead of showing nothing
2026-06-11 13:21:34 +02:00
Matthew Meszaros
72d2af2c3d
feat: inbox and email-accounts pages now show an explicit 'you don't have access' message (with the missing permission) instead of a blank or misleading-empty screen when the member lacks unibox/campaign-view access
2026-06-11 13:19:25 +02:00
Matthew Meszaros
b07d21b907
feat: add usePermission hook + a NoAccess surface that explains which permission a member is missing instead of rendering a blank page
2026-06-11 13:19:24 +02:00
Matthew Meszaros
3654ca0809
feat: profile and workspace name fields auto-save ~700ms after typing stops (empty names stay unsaved), replacing manual Discard/Save with the live status indicator
2026-06-11 13:00:27 +02:00
Matthew Meszaros
01e23c7596
feat: notifications settings auto-save instantly on toggle with a Saving/Saved header indicator, replacing the manual Discard/Save buttons
2026-06-11 13:00:27 +02:00
Matthew Meszaros
14837ed959
feat: guard settings tab switches — block in-app navigation (and warn on reload) when a tab has unsaved or failed auto-save changes, with a Stay/Discard/Save-changes dialog
2026-06-11 13:00:27 +02:00
Matthew Meszaros
aa9273fe06
feat: add autosave primitives — useAutosave hook (instant for toggles, debounced for text, with dirty/flush/retry status), an unsaved-changes registry context, and a Saving/Saved/retry header indicator
2026-06-11 13:00:18 +02:00
Matthew Meszaros
4f6837b395
fix: refresh the active-sessions list and confirm other devices were signed out after a password change, so revoked sessions disappear live
2026-06-11 12:42:44 +02:00
Matthew Meszaros
f209eca9ad
fix: Slack notification delivery now resolves a real channel (connection config, then the org's configured Slack automation channel) instead of an always-empty connect-time field that silently dropped every message; docs and UI corrected to match
2026-06-11 12:40:31 +02:00
Matthew Meszaros
3c040649c0
fix: changing your password now revokes every other session (keeping the current device), matching the security promise in the sign-in alert and docs
2026-06-11 12:39:24 +02:00
Matthew Meszaros
5bcc2baaa8
feat: implement the coming-soon security features — logged-in change-password (verify current, policy-checked, POST /me/password) with a real dialog, and new-device sign-in alerts (security notification category fired from the token service on an unrecognized OS+browser, delivered in-app and by email), removing the comingSoon stub helper and updating docs
2026-06-11 12:30:44 +02:00
Matthew Meszaros
160dc0bc76
feat: implement the coming-soon notification delivery channels — Email (SES/SMTP to the account email) and Slack (posts to the org's connected workspace via a new integration NotifySlack), wired in both backend and consumer with per-channel gating, real toggles replacing the coming-soon labels, and updated docs
2026-06-11 12:21:48 +02:00
Matthew Meszaros
39a9752d63
feat: real tokenized invite-accept link — public /invite landing page with safe preview (org, inviter, roles), accept-by-token plus the previously-broken accept-by-invitation-id, public preview + admin copy-link endpoints, login next-param redirect, and a Copy button that yields a working /invite?token link
2026-06-11 11:57:45 +02:00
Matthew Meszaros
19f66507b4
feat: fix multi-role review findings — atomic member+roles insert on invite accept (no partial-failure stranding), gate role deletion on the actor holding the role's permissions (blocks team-managers de-privileging admins), and hydrate+chip pending-invitation role sets
2026-06-11 11:32:57 +02:00
Matthew Meszaros
8540f7db15
feat: members can hold multiple roles — join tables for member/invitation role sets (migration 000044) with effective permissions as the bitwise OR recomputed on every assignment and role edit/delete, role_ids in invite/update APIs, multi-select checkbox role picker with colored chips in roster and invite flow, freely deletable roles
2026-06-11 11:24:19 +02:00
Matthew Meszaros
80d080b982
feat: fix realtime UUID param encoding crashing org-channel joins, remove the permission matrix from Roles & access, compact the role dropdown, and drop the redundant Integrations tab from settings nav
2026-06-11 11:16:13 +02:00
Matthew Meszaros
3473d09bcc
feat: fix review findings in the roles redesign — GetMembers role_id column (members endpoint 500), TransferOwnership role_id hygiene, accept-time role re-resolution, race-free in-use delete guard covering invitations, assignment anti-escalation with self-role-change block, canManage-gated members UI, colored RolePills, fresh currentOrganization on refetch, dev JWT_SECRET wiring for make realtime, docs corrections
2026-06-11 10:45:21 +02:00
Matthew Meszaros
2badeb7f50
feat: align team-roles docs with data-driven roles (seeded editable defaults, owner as status, color in the role editor) and drop dead accent maps from the members page
2026-06-11 10:20:41 +02:00
Matthew Meszaros
091b39f34e
feat: roles become workspace data — seed editable Admin/Manager/Viewer rows per org (migration 000043 with member backfill), require role_id for invites and role changes, add role colors with a shared colored RoleSelect dropdown in the roster and invite flow, and rebuild Roles & access around real roles with an Owner reference column
2026-06-11 10:18:45 +02:00
Matthew Meszaros
0b253337fc
feat: integrate custom roles across Roles & access settings (manager replaces the coming-soon placeholder, custom roles join the permission matrix and summary cards, permission-aware canManage gating via the org context bitmask)
2026-06-11 10:08:46 +02:00
Matthew Meszaros
63b2b046f9
feat: custom roles dashboard UI (roles manager with built-in reference rows, permission-checkbox editor with start-from presets, custom roles in member role picker and invite flow, realtime spine refresh)
2026-06-11 09:45:23 +02:00
Matthew Meszaros
014cbe79fa
feat: label machine opens (Apple MPP prefetch, UA-less fetchers) with human-open upgrade semantics, exclude them from open-triggered automations, and surface the auto-open count in workspace and campaign analytics (migration 000040)
2026-06-11 08:33:09 +02:00
Matthew Meszaros
8af2950d0b
feat: reconcile missed realtime events by invalidating all queries when the websocket reconnects after a gap
2026-06-11 08:25:00 +02:00
Matthew Meszaros
a06a525cf9
feat: live team presence across the dashboard (online avatar stack in header, viewing/replying indicators on unibox threads and rows, editing collaborators in the automation builder, campaign and contact viewers) plus audit-spine query invalidation
2026-06-11 08:04:11 +02:00
Matthew Meszaros
81c6c730de
feat: animate the automation builder side panels
...
The node editor (trigger/condition/action) and the test-run/history panel
used to pop in and out with no transition. They now slide in from the
right with the same spring the app's other sheets use (AnimatePresence,
stiffness 300 / damping 32), the editor body fades when switching nodes,
the action config fields cross-fade when picking a different action or
target, and the insights panel body fades when toggling test vs history.
2026-06-10 11:52:26 +02:00
Matthew Meszaros
252be0911b
feat: make the dashboard fully mobile compatible
...
Sweep every dashboard area for phone-width (360-430px) usability while
keeping desktop rendering identical behind md:/lg: prefixes:
- stack side-by-side panes and wide form grids below md; one-pane-at-a-time
overlays with back affordances for list+detail layouts (unibox thread,
contact context panel)
- full-width drawers and width-guarded dialogs (max-w vs 100vw, scrolling
bodies, reachable footers) across settings, campaigns, contacts, CRM,
integrations, api-keys, admin
- wide tables get overflow-x-auto wrappers or hidden md:table-cell for
secondary columns; row actions stay touch-reachable
- viewport-clamped popovers/pickers via the PopoverMenu primitive
- prevent iOS Safari focus auto-zoom with a mobile-only 16px form-control
rule in global.css
- responsive React Flow canvases (campaign sequences, automations) and
recharts containers
- delete dead legacy components surfaced by the audit (old base/head
scaffolds, duplicate Tags/Folders modals, unused colors picker,
ContactEntry, contacts filter leftovers)
2026-06-10 11:37:15 +02:00
Matthew Meszaros
59a0205e33
feat: surface automation delete conflicts
...
Show the backend conflict message when deleting an automation fails because campaign run-automation steps still reference it.
2026-06-09 10:57:21 +02:00
Matthew Meszaros
599e359381
feat: improve automation builder actions
...
Add the run-another-automation native action to the builder, richer action visuals, task assignment fields, disabled-target warnings, and unsaved-change tracking for the automation editor.
2026-06-09 10:57:16 +02:00
Matthew Meszaros
9f90259a80
feat: add icons to select menus
...
Allow select options to render leading glyphs and let full-width selects match their trigger width through the popover menu.
2026-06-09 10:57:11 +02:00
Matthew Meszaros
0ee199e6ce
feat: support team task assignment in campaigns
...
Use the shared assignee/team picker in campaign action steps, persist task_assigned_team_id, and make run-automation campaign steps surface disabled and trigger-mismatch warnings.
2026-06-09 10:57:07 +02:00
Matthew Meszaros
b19a87c235
feat: add task assignee team picker
...
Introduce a shared dashboard picker that can target the fallback owner, a member, or an entire team while emitting user and team ids separately.
2026-06-09 10:57:03 +02:00
Matthew Meszaros
3236ffc459
feat: expand product docs and automation references
...
Restructure the docs navigation into product-focused pages, add automation expression reference content, and refresh related template and personalization surfaces.
2026-06-09 09:07:56 +02:00
Matthew Meszaros
af78bf4d56
feat: refine deliverability tabs
...
Updates the deliverability range and metric segmented controls to use the lighter dashboard tab treatment.
2026-06-08 15:06:03 +02:00
Matthew Meszaros
5e7bec1f24
feat: prevent app flash
...
Hides the root until the first rendered frame so the dashboard does not briefly show unstyled content during startup.
2026-06-08 15:05:47 +02:00