Skip to content

Releases: QuackbackIO/quackback

v0.9.9

01 May 09:29

Choose a tag to compare

Features

  • Per-board Discord channels. Discord notifications now support per-channel routing with board filters, matching Slack. Add multiple channels, scope each to a specific board, and pick which events fire (post created, status changed, comment created).

Bug fixes

  • Add Channel dialog state reset. The Add Channel dialog now clears form state when closed via Cancel or X, so reopening starts fresh instead of carrying over leftover input.

Internal

  • Shared routing-table UI between Slack and Discord extracted into a single NotificationChannelRouter component. One-time migration cleans up legacy duplicate event-mapping rows for chat integrations.

Tests

  • New Playwright e2e coverage for the Discord routing flow and Slack routing parity.

Full changelog: v0.9.8...v0.9.9

v0.9.8

29 Apr 08:14

Choose a tag to compare

Features

  • Filter chips on the public feedback portal. A new chip-based filter UI replaces the legacy Filter button. Status, Tag, Vote count, Created date, and Team-response filters can each be added, swapped, or removed inline; chips are translated across all 6 locales. Boards joined the chip system on this release, so the mobile board sheet has been retired in favour of the unified filter UI.
  • Roadmap toolbar parity. The public roadmap page now shares the feedback page's toolbar pattern: searchable Sort combobox, Search popover, and a Filter button on a single row across desktop and mobile. The roadmap selector is a horizontal scrolling tab strip with snap-to-column behavior, and Kanban columns scroll horizontally with chevron + fade affordances and an internal column scroll capped to viewport height.
  • More filter dimensions on the public portal. Public post queries now respect minVotes, dateFrom, and responded filters. Complete and closed posts are hidden by default unless a Status chip overrides it.

Performance

  • Faster cold start. Nitro now lazy-loads SSR chunks and the bootstrap path uses an auth fast-path. Bundles dedup shared deps, the Docker image switched to an Alpine base, the database is pre-warmed at boot, and migrations are bundled into the runtime.

Bug fixes

  • Calendar-invalid date filters are rejected. `dateFrom` strings that look syntactically valid but aren't real dates (e.g. Feb 30) now fail validation instead of returning empty results.
  • EXISTS subquery on public post listings. Matches the admin path's `${posts.id}` interpolation so the duplicate-suggestion-aware filter works on the portal too.

Internal

  • Promoted `toggleItem`, `CircleIcon`, `MenuButton`, `VOTE_THRESHOLDS`, `DATE_PRESETS`, and `RespondedFilter` to `components/shared` / shared types so admin and portal filter UIs reuse the same primitives.
  • /simplify pass: memoization, hoisted icon maps, and pruned dead code across the new portal toolbar/filters surfaces.
  • Filter message IDs migrated to chip-based keys; widget board placeholder + portal "Upvotes" label wrapped in `FormattedMessage`.

Tests

  • New Playwright e2e coverage for the chip filter flow and active-by-default hint.
  • Unit tests for the Board filter category, single-board collapse, and the new public post filter dimensions.

Full changelog: v0.9.7...v0.9.8

v0.9.7

27 Apr 11:04

Choose a tag to compare

Performance

This release reduces server-side render times under concurrent load and shrinks the JavaScript footprint of every page. Both improvements are most visible on busy boards and admin pages with many simultaneous viewers.

  • Hot data on the server-render path (workspace settings, OAuth provider config, user role lookups) is now cached more aggressively so most page renders only do a single fast lookup instead of multiple database queries.
  • Per-route bundles were merged into per-section groups so the browser fetches a handful of larger chunks instead of dozens of tiny ones.
  • Sensitive credentials remain off the cache layer — only metadata about which integrations are configured is cached, not the secrets themselves.
  • Removed a duplicate database query that was firing on every authenticated page load.

Features

  • Edit your own comments. Comment authors and team members can now inline-edit comments after posting. Edited comments show an (edited) marker. (#149)
  • Set help-center article author via API and MCP. Articles created or updated through the API/MCP can now specify an author principal. Internal: this came alongside an API-layer cleanup that standardises how endpoints handle authentication and ID validation. (#147)

Bug fixes

  • S3 uploads on self-hosted Docker Compose. When S3_PROXY=true, presigned uploads are now proxied through the server instead of returning a URL the browser cannot reach. Fixes deployments where MinIO is only reachable on the internal Docker network. (#150)
  • Widget changelog scroll. Restored vertical scroll on the changelog detail view inside the embeddable widget.
  • Cmd+Enter in the post editor. Cmd+Enter inside the comment textarea now submits the comment instead of also saving the post; Cmd+Enter on the post itself only saves when there are pending changes. (#144)

Internal

  • Enforced the client/server import boundary so server-only modules (node:crypto, ioredis, bullmq) can no longer be pulled into the browser bundle through accidental imports.
  • Expanded Playwright e2e coverage with 25 new spec files (~400 tests) over previously untested areas. (#148)
  • Added unit tests covering the new caching surfaces.

Full changelog: v0.9.6...v0.9.7

v0.9.6

20 Apr 09:02

Choose a tag to compare

Bug fixes

  • Restored the max-width container on post detail pages, which was accidentally removed during the help center routing restructure in v0.9.5 (#146)

Tests

  • Added a Playwright regression test that asserts post detail content is constrained within its max-width container

v0.9.5

18 Apr 10:27

Choose a tag to compare

What's changed

  • Help center categories use icons - The emoji picker for help center categories has been replaced with a Heroicons picker for consistent iconography.
  • Fix article editor layout - The article body now scrolls independently while the header stays fixed.
  • Fix widget default board - The new post form in the widget now opens with the configured default board selected.
  • Smoother widget launcher animation - Launcher fade-in and content load feel more polished.
  • Clear default board in widget settings - The default board field now has a clear button to unset the value.
  • Fix settings not refreshing - Settings changes now take effect immediately after saving.

v0.9.4

17 Apr 13:39

Choose a tag to compare

What's changed

  • Help center shows categories with nested articles - Parent categories whose articles lived under sub-categories were hidden from the public help center. They now appear with a total count that includes the whole subtree.
  • Admin help center shows subtree article counts - Parent categories display "direct / total" so editors can see where articles actually live.
  • @quackback/widget on npm - npm install @quackback/widget to embed Quackback in your app. TypeScript types and a React adapter (useQuackbackInit, useQuackback, useQuackbackEvent) included.
  • Widget security hardening - Stricter instanceUrl validation and hardened window.open calls.
  • Fix widget theme colors - Configured colors now apply consistently.
  • Fix dark mode flash on navigation - Dark mode no longer flickers during client-side route changes.

v0.9.3

16 Apr 08:21

Choose a tag to compare

What's changed

  • Fix URLs breaking post submit - TipTap link marks with null attrs (e.g. title: null) were rejected by Zod validation, preventing posts with auto-linked URLs from being submitted
  • Fix raw HTML/markdown in post previews - Post card descriptions now strip HTML tags and markdown formatting instead of showing raw syntax like <p>text</p> or [link](url)
  • Consolidate content preview utility - Removed duplicate truncateContent functions across widget and help center, replacing them with a shared contentPreview() that handles both stripping and truncation
  • Standardize widget typography - Consistent text sizing across all widget views: bumped help center category titles/descriptions, unified metadata labels, form buttons, badges, and action links
  • Fix help article scroll overflow - Article content in the widget now scrolls properly when it overflows the container
  • Fix help article portal link - "View on portal" from widget help articles now opens the correct Quackback URL instead of the host site

v0.9.2

15 Apr 23:51

Choose a tag to compare

What's new

  • Help center category hierarchy -- Organize articles into nested categories up to 3 levels deep with cascade soft-delete, 30-day restore window, and parent-chain validation (#132)
  • Help center inline in portal -- /hc/* now renders under the portal shell with a Help Center tab in the portal nav; standalone subdomain and custom-domain support removed in favor of a single unified portal
  • Full-page article editor -- Replaces the old dialog-based editor with an Intercom-style page at /admin/help-center/articles/$articleId: slim top bar with category pill and publish state, reader-width body, description subtitle, rich editor with images and embeds
  • Publish → View article flow -- Once an article is published, the Publish button swaps to a green "View article ↗" link that opens the portal URL in a new tab; Unpublish moves to an overflow menu
  • Admin finder redesign -- Sidebar category tree that auto-expands the ancestor chain of the selected category, hover-reveal row actions for + sub / edit / delete, breadcrumb row, sub-category chip row for lateral navigation, skeleton loader, deleted items view
  • Auto-rehost external images on article save -- LLM-authored image embeds now get fetched (SSRF-guarded, magic-byte verified) and rehosted to workspace S3 automatically
  • Settings nav regrouped -- General / Customization / Feedback / Help Center / End Users / Developers, dropping the "Portal" umbrella and pulling Widget alongside Branding under Customization
  • Portal + Permissions pages merged -- /admin/settings/portal was split across two pages by auth state (signed-in vs anonymous); now consolidated into /admin/settings/permissions grouped by action, with signed-in and anonymous toggles per action
  • Button pills everywhere -- New `shape` variant on the Button component defaulting to pill (opt out with `shape="default"`), making admin buttons consistently rounded without per-call class overrides

Bug fixes

  • Fix help center article canonical URL missing `/hc` prefix -- og:url and rel=canonical now correctly point at `{baseUrl}/hc/{category}/{article}` (#132)
  • Fix restoreCategory allowing a child to be restored under a still-deleted parent, which would leave the category orphaned from the active tree -- now throws PARENT_DELETED and admins must restore the ancestor chain top-down (#132)
  • Fix help center finder infinite scroll sentinel never observed on first category selection -- the IntersectionObserver was attached to a null ref when the sentinel was only conditionally mounted (#132)
  • Fix stale closure in HelpCenterCategoryTree toggle() that could read outdated ancestorIds under concurrent mode (#132)
  • Fix help center admin nav links font weight + header hierarchy for better readability

Housekeeping

  • Rename TypeID prefixes: `helpcenter_article` → `article`, `helpcenter_category` → `category`, `helpcenter_feedback` → `article_feedback`. No data migration required -- TypeIDs are stored as raw uuid columns and prefixes only apply at serialization time
  • Drop dead `kb_domain_verifications` table and `helpcenter_domain` type after custom help center domain support was removed earlier in the branch
  • Delete dead `packages/db/src/utils.ts` generateId helper, shadowed by `@quackback/ids` generateId(prefix)
  • Branding preview page rewritten to mirror the real feedback portal layout (collapsed "What's your idea?" header, boards sidebar, per-post cards, Powered by Quackback pill with duck logo)
  • Extract CategoryActions shape to collapse sprawling category callback props through HelpCenterList → FiltersPanel → Tree

v0.9.1

10 Apr 21:36

Choose a tag to compare

What's new

  • Tag editor -- Manage tags from Admin > Settings > Tags with name, description, and color. Tags render as colored badges throughout the app. (#130)
  • Status editor improvements -- Auto-save on every change (no more save/discard bar), hex color input with randomize button, edit dialog for existing statuses, roadmap accepts any number of statuses
  • Per-field save spinners -- Inline ArrowPathIcon spinner on the specific toggle being saved across widget, status, tag, and permissions settings

Bug fixes

  • Fix status/roadmap reorder failing with cannot cast type record to uuid[] -- use Drizzle query builder with inArray instead of raw SQL ANY()
  • Fix tag description clearing silently ignored (null converted to undefined)
  • Fix tag list not updating immediately after create/edit
  • Fix popover scroll inside dialogs -- popovers now auto-portal to dialog content instead of document.body, so react-remove-scroll doesn't block wheel events
  • Fix native scrollbar showing in tag add popover -- use Radix ScrollArea with styled scrollbar

Housekeeping

  • Unify help center embeddings to text-embedding-3-small (same model as feedback pipeline)
  • Large codebase cleanup: deduplicate OAuth/webhook components, consolidate AI utilities, extract shared Redis config, remove dead code
  • Migrate widget identify from HMAC to JWT-only with server-side token signing
  • Support custom user attributes in widget JWT claims
  • Remove unused feedbackSignalCorrections table

v0.9.0

08 Apr 22:35

Choose a tag to compare

What's new

  • Standalone help center (experimental) -- Build and publish a help center directly from Quackback. Create categories and articles with the rich text editor, then serve them on a standalone subdomain with search, SEO, and structured data. Enable via Settings > Advanced > Experimental. (#128)
  • Help tab in widget -- Browse help center categories and search articles without leaving the feedback widget. Drill into categories to see article lists, or search across everything. (#128)
  • Help center MCP tools -- Manage categories and articles programmatically via MCP, with a new quackback://help-center/categories resource for discovery. (#128)
  • Help center API -- Full REST API at /api/v1/help-center for categories and articles with CRUD, publish/unpublish, and article feedback endpoints. (#128)
  • Russian translations -- Full Russian locale for the portal and widget by @TAZAQ. (#126)
  • API-only imports -- Import system simplified to use the REST API exclusively, removing direct DB mode. (#127)

Fixes

  • Bubble menu clipping -- Fixed the editor bubble menu getting clipped inside dialog modals.