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