Unclaimed Board. Built from quackbackio/quackback by a visitor, not published: hidden from search. A maintainer can claim it, or remove it.noindex
Claim Board

Changelog

QuackbackIO/quackback
FeedbackfRoadmaprChangelogFAQsqIssuesi
Sign in
August 1, 2026
v0.13.2

v0.13.2

This release adds Slack notifications for support conversations and visitor messages, fixes inbound chat email replies with Resend's metadata-only webhooks, keeps images in posts that contain emoji, self-hosts all branding fonts (no more Google Fonts `<link>`), and makes OIDC sign-in work with providers that don't support `select_account`. It also makes sentiment analysis tolerant of models that wrap JSON in code fences.

**Slack notifications for support chat.** Slack targets can now notify when a visitor starts a support conversation (`conversation.created`) and when a visitor sends a message (`message.created`), each with a deep-link into the admin inbox. Agent replies never notify, and both events are opt-in per target in Settings → Integrations → Slack. ([#335](https://github.com/QuackbackIO/quackback/pull/335))

**Inbound chat email replies deliver with Resend.** Resend's `email.received` webhook is metadata-only, so replies arrived without a body and were dropped. The body is now fetched from the Received Emails API after routing and dedupe (with an HTML→text fallback), and a transient fetch failure retries via Resend redelivery. ([#325](https://github.com/QuackbackIO/quackback/pull/325), fixes [#320](https://github.com/QuackbackIO/quackback/issues/320))

**Images kept in posts that contain emoji.** A post written with the `:` emoji picker made the whole document non-reserializable, so API output fell back to stored markdown and lost embedded images. Emoji nodes now serialize to their Unicode character (or `:name:` for custom emoji), and images survive. ([#338](https://github.com/QuackbackIO/quackback/pull/338))

**Self-hosted branding fonts.** Every font in the branding picker and theme presets is now bundled via @fontsource instead of loaded through a Google Fonts `<link>`, which edge optimizers (e.g. Cloudflare Fonts) rewrote into inline `@font-face` and broke SSR hydration. Saved "Geist" configs automatically map to the bundled "Geist Sans" family. ([#321](https://github.com/QuackbackIO/quackback/pull/321))

**OIDC sign-in works with more identity providers.** Generic OAuth/OIDC sign-in now requests `prompt=login` instead of the OIDC-optional `select_account`, which many IdPs ignore or reject. Re-authentication is still forced, so an admin typing a specific email isn't silently signed in as an existing IdP session. ([#347](https://github.com/QuackbackIO/quackback/pull/347))

**Sentiment analysis tolerates fenced JSON.** Models that wrap their JSON response in markdown code fences no longer break sentiment parsing. ([#315](https://github.com/QuackbackIO/quackback/pull/315), closes [#296](https://github.com/QuackbackIO/quackback/issues/296))

June 29, 2026
v0.13.1

v0.13.1

This release fixes dark-mode theme flashing and its cache keying, repairs slug generation for non-Latin and symbol-only board and help-center names, makes inbound chat email replies deliver reliably, restores images in API/MCP/webhook content, and splits the CSAT webhook so integrations stop double-counting ratings. It also adds a presentation-only published-date override for changelog entries.

**Changelog published-date override.** Set or clear a presentation-only published date on a live changelog entry, separate from when it actually went live. The portal list, detail, feed, and sitemap all use the chosen date, and it never sends notifications. ([#288](https://github.com/QuackbackIO/quackback/pull/288))

**No more white flash in dark mode.** The server now commits the resolved theme straight onto the rendered page, so dark-mode visitors no longer see a white flash on load. The `system` setting is resolved server-side too on browsers that report the OS preference, and the response is cache-keyed correctly so a shared cache can't serve a mismatched theme. ([#297](https://github.com/QuackbackIO/quackback/pull/297), [#298](https://github.com/QuackbackIO/quackback/pull/298))

**Images preserved in API, MCP, and webhook content.** Rich-text posts, changelog entries, and help-center articles dropped embedded images from the markdown returned by the REST API and MCP and emitted in webhook and notification payloads. Markdown is now rendered from the source rich text so images survive as `![alt](src)`, and existing entries self-heal without a backfill. ([#317](https://github.com/QuackbackIO/quackback/pull/317), fixes [#292](https://github.com/QuackbackIO/quackback/issues/292))

**Valid slugs for non-Latin and symbol-only names.** Board and help-center names in scripts like Chinese, Japanese, or Korean (or emoji- and punctuation-only names) no longer produce an empty slug that broke board selection and help-center routing. Names are transliterated to a readable slug, with a safe fallback when nothing remains, and existing broken slugs are healed. ([#295](https://github.com/QuackbackIO/quackback/pull/295), closes [#285](https://github.com/QuackbackIO/quackback/issues/285))

**Inbound chat email replies deliver again.** Agent reply-to addresses exceeded the 64-character local-part limit some providers enforce, so inbound replies were rejected and never reached the visitor. The address now stays within the limit. ([#294](https://github.com/QuackbackIO/quackback/pull/294), fixes [#293](https://github.com/QuackbackIO/quackback/issues/293))

**CSAT webhook no longer double-counts.** A satisfaction survey now emits `conversation.csat_submitted` exactly once when the rating is banked, and an optional follow-up comment rides its own `conversation.csat_comment_added` event, so integrations stop double-counting a rating when a visitor adds a comment. ([#299](https://github.com/QuackbackIO/quackback/pull/299))

**Reliable changelog publish notifications.** Publish notifications now fire exactly once per entry and recover automatically if the delivery job is dropped, so subscribers are never missed or notified twice.

June 27, 2026
v0.13.0

v0.13.0

This release unifies sign-in into a single dialog for both portal users and team admins, and reworks SSO into a multi-provider model: you can register any number of OIDC identity providers, each with its own verified domains, email routing, and per-domain enforcement. It also ships a redesigned provider editor, a settings-permission fix, and a security update.

**One sign-in surface for everyone.** Portal users and team admins now sign in through the same dialog, with a recovery-code break-glass path for SSO-only workspaces. ([#284](https://github.com/QuackbackIO/quackback/pull/284))

**Multiple OIDC identity providers.** Register any number of OIDC providers (Okta, Microsoft Entra, Google Workspace, Auth0, Keycloak, or any OIDC issuer). Each provider carries its own verified domains: emails at a verified domain are routed to that provider, and a domain can be enforced so its users sign in with SSO only. Roles map from the provider's group or role claims, and a claim-attested role provisions regardless of email domain. ([#284](https://github.com/QuackbackIO/quackback/pull/284))

**Redesigned SSO provider editor.** One default-role control, progressive group/claim mapping with autocomplete, full ID-token inspection in the connection test, manual-endpoint support for IdPs without a discovery document, and a per-provider toggle to show or hide the sign-in button. ([#287](https://github.com/QuackbackIO/quackback/pull/287))

**Inline two-factor.** Two-factor enrollment and challenge now happen inside the sign-in dialog instead of separate pages. ([#284](https://github.com/QuackbackIO/quackback/pull/284))

**Settings are admin-only.** The settings cog is hidden from non-admin team members, and a non-admin who reaches an admin-only page sees a calm permission notice instead of a raw error. ([71b6c8f6](https://github.com/QuackbackIO/quackback/commit/71b6c8f6))

June 19, 2026
v0.12.4

v0.12.4

This patch lets portal users at a verified domain sign in with SSO, and quiets health-check noise in self-hosted logs.

**Portal SSO sign-in.** Portal users at a verified domain can now sign in with SSO instead of being offered it and then rejected at the callback. ([#264](https://github.com/QuackbackIO/quackback/pull/264))

June 15, 2026
v0.12.3

v0.12.3

This release adds Simplified and Traditional Chinese, an ntfy integration, and structured logging for self-hosters, plus fixes to private-portal sign-in and outbound automation delivery.

**Simplified and Traditional Chinese.** The portal and widget are now available in zh-CN and zh-TW, served automatically based on browser language. ([#244](https://github.com/QuackbackIO/quackback/pull/244))

**ntfy notifications.** Send notifications to your own devices through the new ntfy integration. ([#242](https://github.com/QuackbackIO/quackback/pull/242))

**Language-aware page rendering.** Pages now declare their language and text direction during server rendering, so right-to-left locales display correctly from the first paint. ([#246](https://github.com/QuackbackIO/quackback/pull/246))

**Structured server logs.** Self-hosted deployments now emit structured JSON logs for easier searching and monitoring. ([#245](https://github.com/QuackbackIO/quackback/pull/245))

**Private portal sign-in.** Signing in to a private portal now lands you in cleanly: no flash of the logged-out buttons, no crash on the sign-in screen, and no getting stranded on the access wall after authenticating. ([#249](https://github.com/QuackbackIO/quackback/pull/249), [#250](https://github.com/QuackbackIO/quackback/pull/250), [#252](https://github.com/QuackbackIO/quackback/pull/252))

**Automation delivery.** Events now reach n8n, Make, Zapier, and Monday; a channel-resolution mismatch had been silently dropping every event. ([#241](https://github.com/QuackbackIO/quackback/pull/241))

June 15, 2026
v0.12.2

v0.12.2

A small follow-up to v0.12.1 with one fix that landed just after it was tagged.

**Custom OIDC setup shows the correct callback URL.** The "Configure Custom OIDC" modal listed `/api/auth/callback/<id>`, but better-auth's genericOAuth callback is `/api/auth/oauth2/callback/<id>`, so registering the shown value at the IdP failed with a callback mismatch. The modal now shows the correct path; built-in social providers (Google, GitHub) are unchanged. ([#238](https://github.com/QuackbackIO/quackback/pull/238), closes [#233](https://github.com/QuackbackIO/quackback/issues/233))

June 15, 2026
v0.12.1

v0.12.1

This patch fixes sign-in on 0.12.0 (the admin dashboard was unreachable behind a React Intl error), restores OAuth-only portal sign-in, and hardens auth, SSO, and file uploads.

**Admin sign-in works again on 0.12.0.** Signing in at `/admin/login` dead-ended on a blank "[React Intl] Could not find required `intl` object" page, leaving the dashboard unreachable; the form now renders. ([#234](https://github.com/QuackbackIO/quackback/pull/234))

**Portal sign-in with only OAuth/OIDC enabled.** With password and magic-link off and just an OAuth provider (a custom OIDC provider or Discord), the portal showed a dead-end email field; it now shows only the provider button. ([#235](https://github.com/QuackbackIO/quackback/pull/235), closes [#231](https://github.com/QuackbackIO/quackback/issues/231), [#186](https://github.com/QuackbackIO/quackback/issues/186))

**Settings toggles persist after saving.** Some toggles reverted on the next view because the query cache wasn't invalidated after a save. ([#230](https://github.com/QuackbackIO/quackback/pull/230))

**Admin avatar loads with the page.** The sidebar avatar now server-renders and is fetched during the initial load instead of after hydration. ([#236](https://github.com/QuackbackIO/quackback/pull/236))

**Invitation links are revocable and last 30 days.** ([#228](https://github.com/QuackbackIO/quackback/pull/228))

June 9, 2026
v0.12.0

v0.12.0

This release makes AI configuration explicit (a breaking change if you use AI), promotes Analytics out of Labs, and fixes Shortcut status sync.

OPENAI_API_KEY=sk-...

# Any OpenAI-compatible endpoint, declared explicitly. Examples:
#   Direct OpenAI:         https://api.openai.com/v1
#   OpenRouter:            https://openrouter.ai/api/v1
#   Cloudflare AI Gateway: https://gateway.ai.cloudflare.com/v1/<account>/<gateway>/openai
OPENAI_BASE_URL=https://api.openai.com/v1

# Model ids your endpoint accepts (direct OpenAI examples shown)
AI_CHAT_MODEL=gpt-4o-mini                  # summaries, sentiment, triage, duplicate checks
AI_EMBEDDING_MODEL=text-embedding-3-small  # duplicate detection, semantic search

**Analytics is now generally available.** The dashboard is out of Labs and on for every workspace, with period-over-period trends on each metric, a clearer activity chart, and full mobile and tablet support. ([#198](https://github.com/QuackbackIO/quackback/pull/198))

**Integration credentials from the environment.** OAuth app credentials for integrations can be supplied via `INTEGRATION_<PROVIDER>_*` environment variables by setting `PLATFORM_CREDENTIALS_SOURCE=env`. The default (database, managed in the admin UI) is unchanged. ([#209](https://github.com/QuackbackIO/quackback/pull/209))

**Shortcut status sync now works.** Moving a linked story to a new workflow state updates the feedback post's status; previously the webhook arrived but the status never changed. ([#204](https://github.com/QuackbackIO/quackback/pull/204))

**Webhook signing secret shown in settings.** Shortcut and Azure DevOps now display the signing secret needed to finish manual webhook setup, next to the webhook URL. ([#204](https://github.com/QuackbackIO/quackback/pull/204))

**Complete translations.** Portal sign-in screens are now translated, and every locale was backfilled to full parity with English. ([#202](https://github.com/QuackbackIO/quackback/pull/202), [#203](https://github.com/QuackbackIO/quackback/pull/203))

June 4, 2026
v0.11.0

v0.11.0

This release adds a major new opt-in feature, Conversations, alongside a wave of improvements to access, moderation, and the everyday admin experience.

**Conversations (new, experimental).** You can now switch on real-time chat and a shared support inbox. Visitors message your team right from the widget and see when you're typing and when you've read their message, while your team handles every thread in one place, with assignment, priorities, labels, internal notes, and search. You can reply by email and keep it in the same thread, turn a conversation into a feedback post, and ask visitors how the chat went. It's off by default, so nothing changes until you turn it on.

**Granular board access.** Every board now controls who can view, vote, comment, and submit, independently. Open each to anyone, to signed-in users, to specific customer segments, or to your team only. So you can let everyone read a board but require sign-in to vote, or reserve submissions for a beta group. New Public and Private presets make setup quick, and your existing boards carry over exactly as they were.

**Private portals.** Make your feedback portal private with a single switch, then choose who gets in: your team, people on a trusted email domain, anyone you invite, a customer segment, or visitors who signed in through your widget. Private portals show a clean sign-in wall and stay out of search engines. Public portals are unaffected.

**Moderation.** Optionally hold posts and comments for review before they go public, with a queue to approve or reject. Set it per board or across your whole workspace. Off by default.

**Nicer to use, everywhere.** Brazilian Portuguese for the portal and widget, new ways to group customers into segments, a friendlier widget home screen with a peek at your latest changelog, a polish pass across the whole admin panel, and reactions that now show who reacted.

**For self-hosters.** A proper production Docker setup, an image that runs natively on both Intel and ARM machines, smoother running across multiple instances, and a batch of reliability and security fixes.

---

**Conversations (new, experimental, off by default).** A real-time chat channel in the widget plus a shared agent inbox. Visitors message your team and see typing indicators and read receipts; agents triage from one place with assignment, priority, status, labels, internal notes with @-mentions, message reactions, saved-for-later, and search. Turn it on from the Labs settings.

**Email replies for conversations.** Agents can reply by email and the visitor's response threads back into the same conversation. Requires configuring an inbound email address.

**Convert a conversation into feedback.** Turn a support chat into a feedback post, or upvote a similar existing post on the visitor's behalf, in one step.

**Customer satisfaction (CSAT).** Visitors can rate a closed chat, rolled up in a new Support section of Analytics.

**Granular board access.** A per-board permission matrix controlling view, vote, comment, and submit independently, each open to anyone, signed-in users, specific segments, or team only, with Public and Private presets. ([#191](https://github.com/QuackbackIO/quackback/pull/191))

**Private portals.** Require sign-in to view the portal, with access granted by team membership, trusted email domains, email invites, customer segments, or widget sign-in. Private portals are excluded from search engines and feeds.

**Post and comment moderation.** Optionally hold submissions for review before they publish, configurable per board or workspace-wide and separately for anonymous and signed-in authors, with an approve and reject queue.

**Brazilian Portuguese.** The portal and widget are now available in pt-BR, served automatically based on browser language. Contributed by @arthurbarret0. ([#194](https://github.com/QuackbackIO/quackback/pull/194))

**More customer segments.** Group people by country, language, last-active recency, and signup source.

**Widget home screen.** A new landing tab that greets visitors, points them to the right section, and previews your latest changelog entry, with help articles and messaging combined under one Help surface.

**Reactions show who reacted.** Hover a reaction on a comment or chat message to see who is behind it.

**Reworked authentication settings.** Sign-in providers are managed from one place with a single toggle each, custom identity providers offer a preset picker with issuer auto-detection, and guardrails stop you from locking yourself out.

**Richer audit log.** Each event now records the request ID, actor type, and sign-in method, all included in the CSV export.

**Multi-architecture Docker image.** Official images now run natively on both Intel and ARM. ([#195](https://github.com/QuackbackIO/quackback/pull/195))

**Widget hydration error behind font-proxying CDNs.** Self-hosting the Inter font stops CDNs that rewrite font links from breaking the widget. ([#133](https://github.com/QuackbackIO/quackback/issues/133))

**Clearer sign-in rate-limit message.** Hitting the sign-in limit now returns a proper "too many attempts" message with a retry hint instead of a misleading "invalid email or password" error.

May 19, 2026
v0.10.5

v0.10.5

**Emoji rendering in comments.** Emojis inserted via the picker now render correctly in saved comments instead of disappearing.

**Enter selects from the emoji picker.** Pressing Enter while the emoji picker is open picks the highlighted item instead of inserting a newline.

May 19, 2026
v0.10.4

v0.10.4

**Faster managed-cloud onboarding.** New `workspace.onboardingComplete` flag in the config-file schema lets the control plane mark the workspace as set-up at provision time, so CP-provisioned tenants skip the OSS `/onboarding` wizard and land straight at `/admin`.

**Magic-link auto-redirect.** `/verify-magic-link` now auto-triggers the verify endpoint on mount with a short delay (preserves the email-prefetch defense), and hides the manual Continue button for the first 5 seconds so the happy path lands without a competing CTA.

**SSR window crash on magic-link verify.** The verify URL is now constructed inside `useEffect`, so SSR doesn't crash on a missing `window`.

**Comment content in portal view.** `contentJson` is now passed through when mapping comments for portal rendering, so rich-text comments render correctly on the public side.

May 18, 2026
v0.10.3

v0.10.3

**Mentions avatars.** Mention chips fall back to `user.image` when the principal avatar columns are empty, so suggestions render correctly for users without a dedicated avatar record.

May 16, 2026
v0.10.2

v0.10.2

May 14, 2026
v0.10.1

v0.10.1

May 14, 2026
v0.10.0

v0.10.0

**Single sign-on with custom OIDC.** Connect any OpenID Connect provider as its own sign-in card, separate from the social login grid. A built-in Test sign-in flow runs a live diagnostic handshake so you can verify the connection before rolling it out.

**Two-factor authentication.** Users can enrol in TOTP-based 2FA from their profile; admins can require 2FA workspace-wide for password sign-in or reset another user's enrollment.

**Recovery codes.** Generate one-time break-glass codes to sign in when SSO or 2FA is unavailable.

**SSO enforcement.** Require SSO for verified email domains, so members on those domains can only sign in through your identity provider.

**Security audit log.** A new feed records security-sensitive actions (auth config changes, SSO secret updates, 2FA resets, domain enforcement, sign-ins) with an admin UI to review them.

**Sign-in defenses.** Sign-in attempts are now rate limited, and signing in from a new device sends a notification email.

**SSO provisioning controls.** Choose which role JIT-provisioned SSO users receive, and map roles from IdP claims via configurable attribute mapping.

**Declarative configuration file.** Quackback can read settings from \`/etc/quackback/config.yaml\` and keep them reconciled; managed fields are locked in the admin UI so the file stays the source of truth.

**Workspace lifecycle states.** Workspaces now have an explicit state (active / suspended / deleting) with an inline overlay and appropriate responses when not active.

**Reorganized admin settings.** API Keys, Webhooks, and MCP are now one tabbed API page; Members, Integrations, and Security are grouped under Administration; SSO has its own page with a status chip in the nav.

**Pinned comment restored on public posts.** A pinned comment no longer disappears from the public post detail view.

**Default post statuses on first migrate.** Fresh installs now seed the default post statuses.

**2FA redirect preserves callback URL.** The intended destination is kept through the 2FA challenge redirect.

May 1, 2026
v0.9.9

v0.9.9

**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).

**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.

April 29, 2026
v0.9.8

v0.9.8

**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.

**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.

April 27, 2026
v0.9.7

v0.9.7

**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)

**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)

April 20, 2026
v0.9.6

v0.9.6

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

April 18, 2026
v0.9.5

v0.9.5

April 17, 2026
v0.9.4

v0.9.4

April 16, 2026
v0.9.3

v0.9.3

April 15, 2026
v0.9.2

v0.9.2

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

April 10, 2026
v0.9.1

v0.9.1

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

April 8, 2026
v0.9.0

v0.9.0

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

April 2, 2026
v0.8.1

v0.8.1

**Portal navigation** — Removed the Help Center tab from the public portal. Help center will become its own dedicated portal in a future release. The tab was previously visible even when the feature flag was turned off.

April 2, 2026
v0.8.0

v0.8.0

**Widget placement CSS on re-init** -- Style tag is now properly cleaned up on `destroy`, preventing stale left/right positioning when reinitializing with a different placement.

**Image paste in admin** -- Fixed Zod validation crash when pasting images with undefined attrs (e.g. `caption: undefined` from ResizableImage extension).

**Slash commands in admin** -- Global `/` search hotkey was intercepting keystrokes in TipTap editors. Now skips `contentEditable` elements.

**Post modal feature parity** -- Edit post modal now has full editor features (images, slash menu, code blocks, tables) matching the create dialog. Saves also close the modal.

**Team members query crash** -- Switched from `useSuspenseQuery` to `useQuery` with fallback to prevent crashes during navigation.

April 2, 2026
v0.7.4

v0.7.4

April 1, 2026
v0.7.3

v0.7.3

April 1, 2026
v0.7.2

v0.7.2

**Widget** - Stabilized popular ideas search height and prevented accidental Enter submit

**Editor** - Image extension is always registered so existing image content renders correctly in all editor contexts

**Accessibility** - Suppressed missing DialogDescription warnings across all dialogs

**Upload routes** - Fixed branded type mismatch for session user IDs

**Docker** - Bumped Bun to 1.3.11 to fix arm64 install failure

**BullMQ** - Fixed handler argument being lost when queued (#113)

March 31, 2026
v0.7.1

v0.7.1

Docker build: set HUSKY=0 to skip prepare script

Analytics spacing and chart color fixes

March 26, 2026
v0.7.0

v0.7.0

March 26, 2026
v0.6.9

v0.6.9

Redesign widget home with portal-style expandable create card Merge search and create into single expandable input Integrate email capture directly into feedback form Unify similar posts design and animations across widget and portal Fix widget card overflow issues (horizontal, input, email/name row) Simplify widget internals: extract post row, remove prop drilling and dead code

March 26, 2026
v0.6.8

v0.6.8

Widget changelog tab with entry listing and detail views Configurable widget navigation (feedback/changelog/roadmap tabs) Inline email capture for anonymous widget users

March 26, 2026
v0.6.7

v0.6.7

Add `publishedAt` parameter to MCP changelog tools

March 25, 2026
v0.6.6

v0.6.6

**Markdown rendering for changelogs and posts** - Content created via the rich text editor, MCP, or API now stores markdown alongside TipTap JSON. The server auto-derives contentJson from markdown when only plain text is provided, ensuring consistent rendering everywhere

**Redesigned public changelog** - The changelog page now displays a full-article feed with a date sidebar, rendered rich content, and linked feature cards, similar to a blog layout

**Fix list item spacing in rendered content** - Ordered and unordered lists no longer have excessive whitespace between items. Fixed by unwrapping single-paragraph list items in the HTML renderer

**Remove unsigned cookie from widget identify endpoint** - Cleaned up the widget identify endpoint to use only the signed cookie for authentication

**Strip markdown in admin changelog previews** - Admin changelog list no longer shows raw markdown syntax in content previews

March 21, 2026
v0.6.5

v0.6.5

**Cascade delete linked integration issues** - When deleting a post that has linked issues in external platforms, the delete dialog now shows each linked issue with a checkbox to archive/close it. Supports Linear, GitHub, Jira, GitLab, ClickUp, Asana, Shortcut, Azure DevOps, Trello, Notion, and Monday. Integration icons and human-friendly issue identifiers (e.g. QUA-24, #142) are shown in the dialog

**Per-integration on-delete behavior config** - Each integration's settings page now has an "On post delete" option to control whether linked issues are archived/closed by default

**Fix dark theme flicker on admin pages** - Admin pages no longer flash white on load in dark mode. Theme is now read from a server-side cookie instead of client-side detection

**Remove static vote count from integration syncs** - Vote count was included in synced issue descriptions but never updated after creation, showing a misleading frozen value. Removed from all integration message builders (Linear, GitHub, Jira, GitLab, ClickUp, Asana, Shortcut, Azure DevOps, Zapier)

March 20, 2026
v0.6.4

v0.6.4

**Portal post edit view matches read-only view** - Empty paragraphs in the TipTap editor now collapse to match the static prose rendering, fixing the excessive vertical spacing visible in edit mode. Edit title input also matches the normal h1 sizing

**Fix MCP OAuth posts showing 'Unknown' author** - OAuth JWT was missing name and email claims, causing all MCP-created posts to show "Unknown" as the author. Users need to re-authenticate for the fix to take effect

March 20, 2026
v0.6.3

v0.6.3

March 20, 2026
v0.6.2

v0.6.2

**Fix widget vote/reaction highlights after SSO identify** - Vote and reaction highlights now persist correctly after SSO identify in the widget

**Fix vote and reaction highlights after page reload** - Highlights no longer reset when the page is reloaded

**Fix Canny importer issues** - Fixed soft-delete filtering and publishedAt preservation

March 15, 2026
v0.6.1

v0.6.1

**API extensions and Canny adapter** - New API-to-API import pipeline with a Canny adapter for migrating feedback, votes, comments, and users from Canny to Quackback.

**Fix OAuth token exchange 500 for MCP clients** - The token endpoint consumed the request body to inspect the `resource` parameter but only reconstructed it when `resource` was missing. MCP clients like Claude Code that include `resource` in the token exchange hit a 500 because Better Auth received an empty body. The request is now always reconstructed after reading.

**Fix consent page redirect** - Added `data.url` fallback for OAuth consent redirect URL resolution, fixing cases where the redirect field name varied.

March 14, 2026
v0.6.0

v0.6.0

**Anonymous voting** - Users can upvote posts without signing in. Controlled by a per-workspace feature flag (enabled by default). IP-based rate limiting prevents abuse by counting anonymous sessions per IP.

**Anonymous posting** - Users can submit feedback without an account. Controlled by a workspace feature flag (disabled by default). Anonymous sessions are created lazily via Better Auth's anonymous plugin.

**Anonymous commenting** - Users can comment on posts without signing in. Controlled by a workspace feature flag (disabled by default).

**Workspace permissions page** - New admin settings page under Settings > Permissions to toggle anonymous voting, posting, and commenting per workspace.

**Widget post detail view** - Full post detail with voting, comments, threaded replies, status badge, author name, and relative timestamps inside the embedded widget.

**Widget SDK event system** - Host apps can subscribe to widget events (vote, post:created, comment:created, identify) via Quackback('on', eventName, handler). Supports on/off commands and returns unsubscribe functions.

**Widget metadata** - Host apps can attach key-value metadata to widget sessions via Quackback('metadata', { key: value }). Metadata is stored on posts created through the widget.

**One-time token session transfer** - Widget sessions can be transferred to the portal via secure one-time tokens, so users clicking "View full discussion" arrive already authenticated.

**Anonymous posting feature flag was dead code** - The anonymousPosting check in createPublicPostFn was inside a branch that was never reached because anonymous users always have a principal record. Moved the check to run unconditionally.

**Anonymous voting had no server-side check** - toggleVoteFn had zero feature flag enforcement. Any user with an anonymous session could vote regardless of the setting.

**Widget user state not cleared on anonymous switch** - Switching from an identified session to anonymous via identify({ anonymous: true }) did not reset isIdentified, causing the widget to continue treating the user as signed in.

**SDK listeners not cleared on destroy** - Calling Quackback('destroy') did not clear event listeners, causing memory leaks on re-initialization.

March 11, 2026
v0.5.1

v0.5.1

**Vote removal for admins** - Admins can remove any vote (direct or proxy) from the voters modal on a post. Hover over a voter row to reveal the remove button.

**Proxy vote MCP tool** - AI agents can add votes on behalf of users via the new proxy_vote tool (22 to 23 MCP tools total).

**Proxy vote DELETE endpoint** - Remove proxy votes via the REST API at DELETE /api/v1/posts/:id/vote with OpenAPI docs.

March 10, 2026
v0.5.0

v0.5.0

**Slack integration** - Two new ways to send feedback from Slack. The "Send to Quackback" message shortcut lets team members forward any Slack message as feedback with one click. Channel monitoring auto-ingests messages from configured channels into the feedback pipeline.

**AI signals progressive disclosure** - AI-generated insights (duplicates, merge suggestions, similar posts) are surfaced contextually in the post modal via a signal summary bar and similar posts card instead of a separate banner.

**Bidirectional merge** - Merge suggestions now support swapping direction so you can choose which post to keep as canonical.

**Activity timeline** - Every post now has an activity tab showing status changes, merges, tag changes, owner assignments, proxy votes, and other events in reverse chronological order.

**Proxy voting** - Admins can vote on behalf of users with full attribution tracking. The voters modal shows who added each vote.

**Author selector** - Admins can choose the post author when creating posts, with a searchable member dropdown and inline user creation.

**AI usage logging** - All pipeline steps (extraction, quality gate, embedding, suggestion matching) now log token usage, latency, and retry counts to the ai_usage_log table. A separate pipeline_log table tracks ingestion events end-to-end.

**Public API expansion** - Five new REST endpoints for managing AI suggestions (list, accept, dismiss, restore) and viewing post activity logs. Existing post endpoints now return summary, merge, and lock fields.

**MCP server expansion** - Five new MCP tools: list_suggestions, accept_suggestion, dismiss_suggestion, restore_suggestion, and get_post_activity (17 to 22 tools total). Enriched search and detail tools with summary, merge, and lock fields.

**Slack signature verification** - Signatures are now verified before parsing the request body, preventing timing attacks.

**Comment cache invalidation** - Comment mutations now cross-invalidate admin inbox and portal caches.

**Type safety** - Replaced any casts with proper types across integrations, tests, and scripts.

March 4, 2026
v0.4.15

v0.4.15

March 4, 2026
v0.4.14

v0.4.14

March 4, 2026
v0.4.13

v0.4.13

**Redesigned merge duplicate flow** - Replaced side-by-side post card layout with stacked cards showing duplicate/canonical direction, a merged result preview card with combined vote and comment counts, and a confirmation dialog before merging. Added post-merge resolved state with inline undo and view actions.

**Unified team settings table** - Replaced two-section layout (members list + pending invitations card) with a single TanStack Table showing both members and invitations inline. Invitations display an "Invited" badge, sent date, and color-coded expiry text. Added global search filtering across all rows.

**Fixed stale error banner on team page** - Invitation resend/cancel actions now clear the error state before starting, preventing stale error banners from persisting after successful retries.

**Fixed merge direction race condition** - Merge success handler now derives canonical/duplicate posts from the submitted mutation variables instead of closure state, preventing incorrect post IDs if the swap toggle changes during in-flight requests.

**Fixed Outlook Safe Links consuming magic link tokens** - Outlook's link prefetch was consuming one-time invitation tokens before users clicked. Tokens now require a POST request to be consumed, with a GET landing page that submits via JavaScript.

March 3, 2026
v0.4.12

v0.4.12

**Link-based password reset** - Replaced OTP-based forgot-password flow with email link-based reset using 24-hour token expiry. Users now receive a reset link instead of a 6-digit code, with a dedicated reset password page at /auth/reset-password.

**Profile password management** - Added password change/set form to user profile settings. Users with an existing password can change it; OAuth/OTP-only users can set one for the first time.

**Voter subscription controls** - Admins can now view and change notification subscription levels for individual voters directly from the voters modal, with colored badges and inline dropdown editing.

**Author link in admin posts** - The author field in the post metadata sidebar now links to the admin users page with the author pre-selected for quick navigation.

March 2, 2026
v0.4.11

v0.4.11

**Fix crash navigating from portal to admin** - Fixed "Cannot read properties of undefined (reading 'items')" error when navigating from the public feedback portal to the admin dashboard. The inbox posts query now tolerates undefined responses during route transitions.

March 2, 2026
v0.4.10

v0.4.10

March 2, 2026
v0.4.9

v0.4.9

March 2, 2026
v0.4.8

v0.4.8

March 2, 2026
v0.4.7

v0.4.7

March 2, 2026
v0.4.6

v0.4.6

**Fixed changelog API route** - Route now goes through the service layer instead of bypassing it

**Fixed silent error swallowing** - Comment permission checks now surface errors correctly

**Fixed missing soft-delete filter** - Board queries now properly exclude deleted boards

**Fixed suggestion card layout** - Improved footer layout with consistent board icons

March 2, 2026
v0.4.5

v0.4.5

**Fixed I-beam cursor on editor content** - ProseMirror editor now correctly shows text cursor instead of pointer

March 1, 2026
v0.4.4

v0.4.4

March 1, 2026
v0.4.3

v0.4.3

March 1, 2026
v0.4.2

v0.4.2

March 1, 2026
v0.4.1

v0.4.1

March 1, 2026
v0.4.0

v0.4.0

February 27, 2026
v0.3.11

v0.3.11

February 27, 2026
v0.3.10

v0.3.10

February 24, 2026
v0.3.9

v0.3.9

**OAuth email scope (part 2)** - Add `email` to `clientRegistrationDefaultScopes` so dynamically registered clients (e.g. ChatGPT) are allowed to request it. The v0.3.8 fix only added it to the discovery metadata but not to the client registration defaults (#64)

February 24, 2026
v0.3.8

v0.3.8

**OAuth email scope** - Add missing `email` scope to `/.well-known/oauth-protected-resource` metadata, fixing `invalid_scope` errors when connecting from ChatGPT and other OIDC-aware MCP clients (#63)

February 23, 2026
v0.3.7

v0.3.7

**Date filtering for MCP search** - `dateFrom` and `dateTo` params on the MCP `search` tool enable date-range queries like "what feedback did we get in June 2024?" (#61)

**Date filtering for public API** - `GET /api/v1/posts?dateFrom=2024-06-01&dateTo=2024-06-30` now supported, matching MCP parity (#61)

**Principal date index** - composite `(role, created_at)` index on the principal table for efficient date-filtered portal user listings (#61)

**Cursor pagination** - fix page 2+ failing on post search by converting TypeID to UUID and Date to ISO string before SQL tuple comparisons (#61)

**Date serialization in SQL** - defensively call `.toISOString()` on all Date objects interpolated into Drizzle `sql` template literals in post queries and user listings (#61)

February 23, 2026
v0.3.6

v0.3.6

**SEO meta tags** - all portal pages (feedback, posts, changelog, roadmap) now render title, description, Open Graph, and Twitter Card meta tags with canonical URLs (#60)

**Dynamic sitemap and robots.txt** - `/sitemap.xml` includes all public posts, changelog entries, and static pages with `lastmod` timestamps; auto-paginates via sitemap index when exceeding the 50,000 URL protocol limit; `/robots.txt` blocks admin, auth, and API paths (#60)

**ESLint import conventions** - new rules enforce `@quackback/ids` imports and consistent `type` import style across the codebase (#60)

**OpenAPI release workflow** - GitHub Actions workflow generates and attaches `openapi.json` as a release asset on publish (#60)

**Private boards excluded from sitemap** - posts on private or deleted boards are no longer exposed in `sitemap.xml` (#60)

February 18, 2026
v0.3.5

v0.3.5

**Startup banner** - logs build version, git commit, environment, runtime, and base URL when the server starts (#57, #58)

**Soft-deleted records visible in public queries** - soft-deleted posts and comments were still appearing in public board views, search results, and portal pages. All public queries now exclude deleted records (#56)

**Startup banner timing** - the startup banner now logs at server initialization instead of waiting for the first incoming request (#58)

February 18, 2026
v0.3.4

v0.3.4

**MCP delete/restore tools** - new `delete_post` and `restore_post` tools for the MCP server, letting AI agents soft-delete and restore posts programmatically (#53)

**Widget mixed content error** - the feedback widget iframe, RSS feed, and API docs were generating `http://` URLs behind Cloudflare TLS termination, causing browsers to block the widget on HTTPS sites. All three routes now use the canonical `BASE_URL` from config (#55)

February 17, 2026
v0.3.3

v0.3.3

**Admin post delete/restore** - admins can now soft-delete posts from the post modal with a confirmation dialog, and restore them within a 30-day window. A new "Deleted posts" filter in the inbox sidebar shows recently deleted posts (#52)

**Deleted posts visible on public portal** - soft-deleted posts were still showing on portal listings, post detail pages, roadmap views, user profiles, and board counts. All public-facing queries now properly exclude deleted posts (#48, fixes #45)

**Responded/Unresponded filter crash** - the admin inbox Responded/Unresponded filter crashed with "column posts.post_id does not exist" due to Drizzle's relational query builder rewriting column references in SQL subqueries to the wrong table alias (#54, fixes #46)

**"Response" filter renamed to "Team response"** - clearer labeling in the inbox sidebar and active filter chips (#54)

February 17, 2026
v0.3.2

v0.3.2

**Settings page URLs in reverse proxy deployments** - the previous fix (#43) used `window.location.origin` on the client, which breaks reverse proxy setups where `BASE_URL` differs from the browser origin. Now threads `BASE_URL` through the router context via the bootstrap server function so MCP and widget settings pages always show the correct configured URL (#44)

February 17, 2026
v0.3.1

v0.3.1

**Portal auth toggle lock** - the Email OTP toggle was incorrectly locked when the stored config was missing an explicit `password` key. Root cause was `parseJsonConfig` using a shallow merge that dropped nested defaults - now uses deep merge so all default oauth keys are preserved (#42)

**Settings page URLs on client-side navigation** - MCP and widget settings pages showed relative URLs (e.g. `/api/mcp`) instead of full URLs when navigating via client-side links. Switched to the shared `getBaseUrl()` utility that correctly resolves the origin on both server and client (#43)

**Avatar S3 key validation** - validate avatar S3 keys before use and sanitize OAuth consent redirect URLs (#41)

February 16, 2026
v0.3.0

v0.3.0

**MCP settings page URLs** - the endpoint URL now renders with the full domain instead of just `/api/mcp`. Falls back to the browser origin when `BASE_URL` is unavailable during SSR.

February 16, 2026
v0.2.2

v0.2.2

**Regenerate tenant provisioning SQL** - the init-sql file was stale, only bundling 2 of 7 migrations. New tenant databases were being created with dropped columns (official_response, etc). Now includes all migrations through 0006.

February 16, 2026
v0.2.1

v0.2.1

February 16, 2026
v0.2.0

v0.2.0

February 13, 2026
v0.1.6

v0.1.6

New option for self-hosters who can't reach S3 directly from the browser.

**S3 proxy mode** - Added `S3_PROXY` environment variable that streams S3 file bytes through the server instead of issuing a 302 redirect to a presigned URL. Enable this when the browser can't reach the S3 endpoint directly - common with ngrok tunnels, HTTPS apps pointing at HTTP MinIO, or Docker networking where the S3 host is internal-only.

February 13, 2026
v0.1.5

v0.1.5

Patch release - fixes S3 image serving for private buckets and test configuration.

**S3 image serving** - Images now default to the presigned URL proxy (/api/storage) instead of constructing direct endpoint URLs. This fixes broken images on private bucket providers like Railway Buckets where the raw S3 endpoint is not publicly accessible. Users who want direct CDN/endpoint URLs can still set S3_PUBLIC_URL explicitly.

**Test configuration** - Excluded Playwright e2e specs and build artifacts from vitest test discovery, fixing false failures when running tests from subdirectories

February 13, 2026
v0.1.4

v0.1.4

Patch release - defense-in-depth for config validation in Docker environments.

**Config schema resilience** - `envInt` and `envBoolean` Zod schemas now preprocess empty strings to `undefined` via `z.preprocess()`, ensuring validation never fails on empty Docker/compose env vars regardless of how values arrive at the schema layer

February 13, 2026
v0.1.3

v0.1.3

Patch release - email setup is now fully optional.

**Config validation** - empty env var strings (common in Docker/compose) no longer cause config validation failures for optional fields like EMAIL_SMTP_PORT

February 13, 2026
v0.1.2

v0.1.2

Feature release with new auth, feedback improvements, and quality-of-life fixes.

**Password authentication** - email + password is now the default sign-in method for both portal users and team members

**Comment status changes** - status transitions are recorded inline as comment events, giving full context in the conversation thread

**Comments lock** - admins can lock comments on a post to prevent further portal user replies

**Shared error & 404 pages** - consistent error handling with a root error boundary

**Portal filtering** - public portal now supports filtering by status and tags

**Scheduled changelog publishing** - changelogs can be scheduled for future publish via the `changelog.published` event

February 13, 2026
v0.1.1

v0.1.1

Patch release fixing a deployment-breaking bug introduced in v0.1.0.

February 12, 2026
v0.1.0

v0.1.0

First public release of Quackback - the open-source alternative to Canny, UserVoice, and Productboard.

git clone https://github.com/QuackbackIO/quackback.git && cd quackback
bun run setup && bun run dev