Versions the prior `## Unreleased` chat-actions block as 0.1.1 (it shipped with migration 009 a few days back) and adds 0.2.0 covering the Flows feature, color themes, and the various engine + UX work that landed alongside. Also bumps package.json: 0.1.0 → 0.2.0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.0 KiB
Changelog
User-visible changes in wacrm. Self-hosters: when pulling an update,
check this file for any migration required notes and apply the
matching SQL files from supabase/migrations/ against your Supabase
project before restarting the app.
Versions follow Keep a Changelog.
Pre-1.0, MINOR bumps cover new modules; PATCH bumps cover bug fixes
and polish.
[0.2.0] — 2026-05-22
The Flows release. Adds a no-code, branching, button-driven WhatsApp conversation engine that runs alongside Automations. Also ships a 5-theme color picker in Settings and opens Flows to all users.
Added
Flows — branching chatbot conversations
- Module + schema. New
flows,flow_nodes,flow_runs,flow_run_eventstables with partial unique indexes that enforce one active run per contact. Widenedmessages.content_typeCHECK to accept'interactive'; addedinteractive_reply_idcolumn so the inbox can render button/list taps. (#112) - Runner engine.
dispatchInboundToFlowsparses every inbound webhook, decides whether the message is a reply on an active run or a fresh trigger, advances the state machine, and reports back to the webhook so consumed messages don't also fire automations. Idempotent on Meta'smessage_id. (#114) - No-code builder UI at
/flows. Linear-list editor with per-node config forms, live validator, draft/active/archived status, and a 5-route REST API (GET/POST /api/flows,GET/PUT/DELETE /api/flows/[id],POST /api/flows/[id]/activate,GET /api/flows/[id]/runs,GET /api/flows/templates). (#115) - Templates + v1.5 node types. Three starter templates
(Welcome menu, FAQ bot, Lead capture) cloneable from the New-flow
dialog. Three new node types:
collect_input(capture customer text into a variable),condition(branch on var / tag / contact field),set_tag(add or remove a tag).{{vars.X}}interpolation in send_message + collect_input prompts. Per-flow run-history viewer at/flows/[id]/runs. (#117) - Stale-run sweep cron at
GET /api/flows/cron— marks runs past their configured timeout (default 24h) astimed_outso abandoned conversations free up the contact for new triggers. ReusesAUTOMATION_CRON_SECRET. (#114)
Color themes
- 5 color themes (Violet default, Emerald, Cobalt, Amber, Rose)
selectable from a new Appearance tab in Settings. CSS variables
scoped under
html[data-theme="..."], applied at runtime viadataset.theme, persisted tolocalStorage. Inline boot script inlayout.tsxreplays the choice before first paint so there's no flash of the default. (#132) - Theme tokenization sweep — every previously hard-coded
violet-*Tailwind class replaced withprimarytokens across ~49 files. Picking a non-violet theme now themes the whole app, not just the chrome. (#133)
Changed
Flows — soft-GA
- Flows is now available to every authenticated user. The per-account beta gate is gone; the sidebar entry + page header carry a small "Beta" chip as the only remaining signal. (#134)
- Editor UX:
- Internal
node_key+ per-button/rowreply_ididentifiers hidden behind a per-node "Show advanced" disclosure. (#118) send_listnodes can have multiple sections. (#119)- Collapsed node cards show a 1-line content preview per node type (text excerpt, button titles, condition summary, etc.). (#120)
- Validation issues are clickable: jump to + flash the offending node. (#121)
- Unsaved-changes "● Edited" indicator +
beforeunloadreload guard. (#122) - New-flow dialog actually widens to fit the 3 template cards
(was capped at 384px by a baked-in
sm:max-w-smfrom shadcn). (#129, #131) - Validation panel pinned to the viewport bottom so activate-readiness follows the user as they scroll through nodes. (#130)
- Internal
Engine reliability
- Atomic
execution_countincrement via SECURITY DEFINER RPC — prevents lost counts when two webhooks start runs concurrently. Mirrors the automations engine pattern. (#124) - Preload all flow_nodes once per dispatch — one SELECT per inbound instead of one per advance-loop iteration. A 5-node auto-advance chain now costs 1 round trip, not 5. (#125)
- Wasted re-read dropped after reprompt reset;
loadActiveRunswitched to defensive.limit(1)so a migration glitch producing duplicates can't crash dispatch. (#126)
Security
- PII redacted from
reply_receivedevent payload — customer text is no longer persisted toflow_run_events.payload; only the length is. Acollect_inputprompt asking "what's your card number?" used to leave the PAN sitting in the events table. (#123) - Constant-time cron-secret compare on
/api/flows/cron(crypto.timingSafeEqual) to close a theoretical timing-side-channel on thex-cron-secretheader check. (#127)
Fixed
/flowsno longer spuriously redirects to/dashboardwhen navigating in. Root cause:useAuthflippedloading: falsebefore the profile fetch resolved.use-authnow exposes a separateprofileLoadingboolean. (#128)
Migration required
Apply, in order, against your Supabase project:
supabase/migrations/010_flows.sql— Flows core tables, indexes, RLS policies, and themessagesschema widening.supabase/migrations/011_profile_beta_features.sql— adds theprofiles.beta_featurescolumn. Surviving for future betas; Flows no longer reads it.supabase/migrations/012_flows_increment_counter.sql— atomic counter RPC. Without this the engine still runs butflows.execution_countis racy.
Each migration is idempotent — safe to re-run if you're not sure whether you applied a previous one.
Removed
src/lib/flows/feature-flag.ts+ its tests. Flows is open to all users; theprofiles.beta_featurescolumn itself survives for future beta gates. (#134)
[0.1.1] — 2026-05-19
Added
- Chat actions in the inbox: emoji reactions, reply-with-quote, and copy-text on individual messages. Hover on desktop, long-press on touch. Outbound reactions and replies forward to WhatsApp via the Cloud API; inbound reactions and swipe-replies from customers arrive through the webhook and appear in real time.
Migration required
- Apply
supabase/migrations/009_message_actions.sqlto your Supabase project. It addsmessages.reply_to_message_idand the newmessage_reactionstable (with RLS and realtime). The migration is idempotent — safe to re-run.
Changed
- The webhook no longer stores inbound customer reactions as fake
text messages. They are written to
message_reactionsinstead, so any custom queries that counted reactions as messages will need updating.
[0.1.0]
Initial template release. Core CRM: inbox, contacts, pipelines, broadcasts, automations (with a Wait-step cron drain), WhatsApp Cloud API integration, Supabase auth + RLS.