v1.0.0
What's Changed
✨ New Features
- feat: update chat widget by @sung17 in #475
- feat: Organization settings by @sung17 in #449
- feat: add user quota by @realcodesiman in #494
- feat: Email template by @sung17 in #489
- feat: remove mcp server by @realcodesiman in #496
- feat(platform): add configurable storage URL for CDN and whitelabel support by @realcodesiman in #500
- feat(cli,mcp-server): dynamic tool generation from public OpenAPI spec by @sung17 in #490
- feat(manage): add SaaS portal nav to manage sidebar with dev proxy by @realcodesiman in #501
- feat(ai): implement ai generate image by @nguyenvantruc92 in #342
- feat: update email by @sung17 in #459
- feat: E-commerce products by @sung17 in #413
- feat: broadcast subscribe/unsubscribe step handlers by @viethung0o0 in #485
- feat(api/v1): workspace token auth improvements and core APIs by @realcodesiman in #444
- feat: Qr Code and Landing page by @sung17 in #510
- feat: AI file support epub, ptt, pttx extension by @nguyenvantruc92 in #516
- feat(mac): monthly active contact tracking, billing rollups, and analytics by @viethung0o0 in #365
- feat: Add tiktok channel by @sung17 in #497
- feat: implement integration claude AI and deepseek AI by @nguyenvantruc92 in #517
- feat(channels): add encrypted pending-auth and page-select step for Facebook OAuth by @sung17 in #531
- feat(coexist): refactor bulk import, add comprehensive test suites, and fix template handlers by @viethung0o0 in #533
- feat(admin): add platform admin screen with scoped platform credentials by @realcodesiman in #534
- feat(tag-sync): two-way tag sync with Messenger labels and Zalo OA tags by @viethung0o0 in #537
- feat(cli): rename to chatbotx, add nested command groups, update MCP tool naming by @sung17 in #519
- feat(worker): add scheduled job to refresh zalo oauth tokens daily by @sung17 in #552
- feat: add menu gemini delete history by @nguyenvantruc92 in #556
- feat(upload): support workspace-less uploads for platform branding assets by @realcodesiman in #560
- feat: implement integration mailchimp by @nguyenvantruc92 in #555
- feat(database): add Cloudflare hostname fields to CustomDomain schema by @realcodesiman in #565
- feat(messenger): add create message template dialog and action by @viethung0o0 in #566
- feat(flows): add flow version history and restore by @realcodesiman in #572
- feat(contacts): add avatar to contact name cell in contacts table by @realcodesiman in #573
- feat: add project AI agents, skills, and commands by @viethung0o0 in #579
- feat(instagram): migrate to Instagram Business Login API by @sung17 in #559
- feat(tiktok): register tiktok channel in ui filters and inbox config by @sung17 in #581
- feat: implement integration drip by @nguyenvantruc92 in #577
- feat(tiktok): add tiktok to inbox select card by @sung17 in #592
- feat: implelemt integration mooseend by @nguyenvantruc92 in #591
- feat: implement integration klaviyo by @nguyenvantruc92 in #594
- feat(tenancy): first-class Tenant table for white-label isolation by @realcodesiman in #587
- feat: apply sharding for ai message by @nguyenvantruc92 in #593
- feat: implement integration activecampaign by @nguyenvantruc92 in #598
- feat: implement integration get-response email by @nguyenvantruc92 in #599
- feat(tenancy): white-label OAuth broker for per-tenant social login by @realcodesiman in #601
- feat(tenancy): route provider webhooks through the broker host by @realcodesiman in #602
- feat(whatsapp): connect via Facebook OAuth dialog through broker by @realcodesiman in #607
- feat(messenger): Facebook post comments — receive, reply, edit, delete, like/hide by @sung17 in #618
- feat(builder): show plan and usage quotas in sidebar (cloud-only) by @realcodesiman in #609
- feat(ai-openrouter): implement integration openrouter by @nguyenvantruc92 in #616
- feat(instagram): Instagram post comments by @sung17 in #624
- feat(auth): force password change for reseller-provisioned accounts by @realcodesiman in #627
- feat: Add Messenger action Set User Persistent Menu by @hoangle398 in #614
- feat(manage): add reseller portal sidebar to cloud-edition manage zone by @realcodesiman in #641
- feat(user-quota): stamp bootstrap trial row on cloud sign-up, per-tenant default plan by @realcodesiman in #645
- feat(quota): add selectedTrialPlanId to UserQuota by @realcodesiman in #654
- feat(messenger): add enable/disable composer flow actions by @hoangle398 in #643
- feat(instagram): enforce messaging window with HUMAN_AGENT tag fallback by @sung17 in #662
- feat(enterprise): add tenant help items management by @realcodesiman in #666
🐛 Bug Fixes
- fix: send mail by @viethung0o0 in #469
- fix: snapshot for analytics by @viethung0o0 in #474
- fix(whatsapp): detect OAuth revoked tokens in error mapper by @viethung0o0 in #477
- fix(whatsapp): use /ref- prefix for inbox referral links by @viethung0o0 in #478
- fix: detect hostname by @realcodesiman in #480
- fix: coerce min/max to number in generateCode step schema by @sung17 in #487
- fix: improve dark mode theme colors and UI consistency by @sung17 in #492
- fix: Add success/error states to Auto Assign Conversation Step by @sung17 in #483
- fix: get-data-from-json step — states support, safe JSON parse, and proper return types by @sung17 in #484
- fix(custom-fields): add customFieldValueKey option and memoize field transform by @sung17 in #486
- fix: use Web Crypto randomUUID in email-topic stats repo by @viethung0o0 in #522
- fix(database): resolve migration snapshot chain prevIds and mac tables snapshot by @realcodesiman in #523
- fix: wrong migration path for QRCode by @realcodesiman in #528
- fix(channels): centralize duplicate connection detection across all integrations by @sung17 in #530
- fix: add message shard bootstrap script by @viethung0o0 in #529
- fix(flows): replace useEffect with triggerValueChange for smtp from address sync by @sung17 in #532
- fix: temp remove pdf-parse-new by @realcodesiman in #536
- fix(messenger): add pages_utility_messaging scope to OAuth by @viethung0o0 in #539
- fix: tag upserts respect partial unique index by @viethung0o0 in #541
- fix: specify partial-index predicate on tag upserts by @viethung0o0 in #542
- refactor: streamline tag and channel label sync handlers by @viethung0o0 in #543
- refactor(worker): use consolidated inbox label handler by @viethung0o0 in #544
- fix(builder): use Promise.allSettled when creating messages by @realcodesiman in #545
- fix(worker): import pdf-parse-new parser entry directly by @viethung0o0 in #535
- fix(redis): degrade gracefully on cache errors and memoize connections by @realcodesiman in #548
- fix(flows): correct flow upload path param and pass workspaceId by @realcodesiman in #549
- fix(worker): use igId column for instagram integration lookup by @sung17 in #551
- fix(flows): correct email template variable and add tiktok integration field by @sung17 in #554
- fix(messenger): improve outgoing message handling and channel send behavior by @viethung0o0 in #557
- fix(filesystem): expose uploadFileFromUrl from main entry point by @sung17 in #558
- fix(auth,mail): fix email link hostnames and enable subject template substitution by @realcodesiman in #564
- fix: clone messenger template by @viethung0o0 in #567
- fix: refresh template list after creating by @viethung0o0 in #569
- fix(conversations): refresh inbox activity sorting by @viethung0o0 in #561
- fix: update import and and lib hash by @nguyenvantruc92 in #570
- fix(events): add events worker by @viethung0o0 in #571
- fix(tiktok): store and use conversation_id as recipient for outgoing messages by @sung17 in #574
- fix: keep messages loading reliably when database has issues by @viethung0o0 in #576
- fix(tiktok): throw ChannelError when sourceConversationId is missing by @sung17 in #575
- fix(broadcast): reliably send broadcasts to all recipients by @viethung0o0 in #590
- fix: ai-file error with provider deepseek by @nguyenvantruc92 in #604
- fix(ai-mcp-server): use inline http transport and show tool descriptions by @nguyenvantruc92 in #608
- fix(builder): keep header helpers server-only by @viethung0o0 in #611
- fix(ai-function): handle output message and trigger flow by @nguyenvantruc92 in #612
- fix(ai-flow): ai flow message duplicate by @nguyenvantruc92 in #615
- fix(database): refactor conversation uniqueness and expand message schema by @sung17 in #620
- fix(database): refactor conversation uniqueness and expand message schema by @sung17 in #622
- fix(message): ensure Message and Attachment queries work correctly with sharding by @viethung0o0 in #613
- fix(builder): point pricing links to canonical /portal/pricing path by @realcodesiman in #625
- fix(database): backfill and maintain InboxContactStat totalContacts by @viethung0o0 in #629
- fix: improve new message display in inbox by @viethung0o0 in #630
- fix: support secure public links by @viethung0o0 in #631
- fix(worker): auto-discover worker roster in docker entrypoint by @realcodesiman in #632
- fix(docker): emit seed runner as CommonJS to fix dynamic require crash by @realcodesiman in #636
- fix(docker): harden builder image build and seed/entrypoint runtime by @realcodesiman in #637
- fix(ai): handle ai message response with image url by @nguyenvantruc92 in #639
- fix(auth): use tenant policy links by @realcodesiman in #646
- fix(coexists): using user quota instead of workspace usage by @viethung0o0 in #651
- fix(webchat): prevent duplicate messages after send by @sung17 in #657
- fix: stop messages repeating in flows by @viethung0o0 in #658
- fix(auth): re-home white-label verification redirects onto branded host by @realcodesiman in #659
- fix: stop messages from repeating in flows by @viethung0o0 in #660
- fix(tenancy): resolve integration webhooks via broker host for white-label by @realcodesiman in #671
- fix(integrations): harden channel schemas, add null guards, and register TikTok webhook by @sung17 in #672
⚡ Improvements
- refactor: update logo for workspace by @viethung0o0 in #499
- refactor(flow-config): replace base64+JSON button payload with compact colon format by @sung17 in #595
- refactor(integrations): replace Node.js crypto with Web Crypto API in webhook handlers by @sung17 in #628
- refactor(quota): make UserQuota the single source of truth, drop TenantQuotaUsage by @realcodesiman in #649
🔧 Internal / Chore
- chore(database): remove duplicate magic/ref-link stat migrations by @viethung0o0 in #580
- chore(broadcast,sequence): drop unused tracking columns by @viethung0o0 in #583
- chore(broadcast,sequence): apply partition tables for broadcast and sequence by @viethung0o0 in #585
- chore(redis): imcrement redis timeout by @viethung0o0 in #605
- chore(database): move message sharding migration into drizzle chain by @viethung0o0 in #621
- chore: update files by @viethung0o0 in #623
- docs: add contributing guide by @realcodesiman in #634
- chore(deps): enable dependabot npm updates for pnpm workspace by @realcodesiman in #644
- docs(readme): refresh links, providers, and repo layout by @realcodesiman in #647
- chore: change chatbotx-hero in readme by @realcodesiman in #650
New Contributors
- @phongmaker made their first contribution in #502
- @TrinhDuyHai made their first contribution in #597
Full Changelog: v0.2.5...v1.0.0