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.
Features
- 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)
Bug fixes
- Inbound chat email replies deliver with Resend. Resend's
email.receivedwebhook 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, fixes #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) - 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-faceand broke SSR hydration. Saved "Geist" configs automatically map to the bundled "Geist Sans" family. (#321) - OIDC sign-in works with more identity providers. Generic OAuth/OIDC sign-in now requests
prompt=logininstead of the OIDC-optionalselect_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) - Sentiment analysis tolerates fenced JSON. Models that wrap their JSON response in markdown code fences no longer break sentiment parsing. (#315, closes #296)
Full Changelog: v0.13.1...v0.13.2