Releases: QuackbackIO/quackback
Releases · QuackbackIO/quackback
v0.9.9
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
NotificationChannelRoutercomponent. 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
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, andrespondedfilters. 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
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
v0.9.5
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
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/widgetto 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
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
truncateContentfunctions across widget and help center, replacing them with a sharedcontentPreview()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
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
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 withinArrayinstead of raw SQLANY() - 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-scrolldoesn'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
feedbackSignalCorrectionstable
v0.9.0
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/categoriesresource for discovery. (#128) - Help center API -- Full REST API at
/api/v1/help-centerfor 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.