Documentation menu

Changelog

Shoutrrr releases, pulled from GitHub.

v1.5.0

v1.5.0 ↗

A minor release that adds cross-platform sync pipelines, so a source account can automatically repost new content to multiple destination accounts across platforms. Also fixes exact scheduled date/time display in post live status, corrects the Instagram DM scope identifier, and stops over-rotating Bluesky single-use refresh tokens.

✨ Additions

  • sync: cross-platform sync pipelines that fan out a source account's posts to multiple destination accounts across platforms, with native repost detection to avoid duplicate reposts (#180)

🐛 Fixes

  • posts: show the exact scheduled date and time in a post's live status instead of a relative approximation (#177)
  • accounts: correct the Instagram DM scope identifier so DM connections request the right permission (#178)
  • publishing: stop over-rotating Bluesky single-use refresh tokens, preventing crash-window invalid_grant failures that flipped healthy accounts to needs-attention (#175)

🔧 Maintenance

  • deps: update all Composer and bun dependencies to their latest versions, including Laravel 13.32, Passport 13.8, Socialite 5.31, phpseclib 4, Pest 5, TypeScript 7, and Vitest 5 (86308ed)
  • deps: bump the github-actions group with 3 updates (#174)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.4.4...v1.5.0

v1.4.4

v1.4.4 ↗

A patch release that makes desktop MCP OAuth clients easier to connect, fixes calendar date handling and post creation, validates X video aspect ratios before publishing, restores API key creation under FrankenPHP/Octane, and prevents transient token-refresh failures from disabling accounts.

✨ Additions

  • mcp: allow configurable OAuth redirect domains and custom URI schemes such as cursor://, so desktop MCP clients can complete dynamic client registration (#161)

🐛 Fixes

  • publishing: treat 429, 5xx, and timeout responses during token refresh as retryable, preventing refresh sweeps and publish jobs from marking healthy accounts as needing attention; increase the per-account refresh lock from 60 to 120 seconds (#173)
  • api: generate Passport RSA keys directly instead of invoking a console command that is unavailable under FrankenPHP/Octane, restoring automatic key generation during API key creation and cleaning up partial writes (#172)
  • calendar: open the composer when clicking any non-past day, including days that already have posts, while keeping post, overflow, and drag interactions from creating unwanted drafts (#171)
  • publishing: validate X's 1:3 to 3:1 video aspect-ratio limit in composer and server prechecks, classify failed video processing as a terminal validation error, and surface X's processing error (#170)
  • posts: compare calendar cells using scheduling-timezone date keys, fixing off-by-one today/past highlighting in month and agenda views and making relative dates timezone-aware (#169)

🔧 Maintenance

  • mcp: log the first redirect URI submitted during OAuth client registration to help diagnose callback configuration (e0b896c)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.4.3...v1.4.4

v1.4.3

v1.4.3 ↗

A small patch release that corrects the monthly X post quota so it reflects typical per-post pricing.

🐛 Fixes

  • billing: derive the monthly X post limit from the pricing map's standard POST operation weight instead of the worst-case xPublishCostMicrousd() cost, so the quota reflects typical post pricing (e.g. ~333 posts for the default budget instead of 25). The monthly budget cap still guards against expensive posts (URLs, high-cost ops), so spend is unaffected — only the enforced/displayed post count changes (#160)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.4.2...v1.4.3

v1.4.2

v1.4.2 ↗

A patch release that hardens Bluesky publishing and the post queue, and adds Discord mentions plus KLIPY attribution to the composer.

✨ Additions

  • posts: add a dedicated Discord mention picker with a plain-text ⇄ mention toggle and User/Role/Channel selection, composing native <@id>/<@&id>/<#id> markup and rendering resolved labels in previews and published posts. Also renders LinkedIn company annotations (@[Name](urn:li:organization:ID)) as linked names (#156)
  • compose: add KLIPY's required attribution to the GIF picker — a fixed "Search KLIPY" placeholder and a "Powered by KLIPY" link below results (#157)

🐛 Fixes

  • publishing: serialize Bluesky app-password token refresh behind a per-account cache lock (re-reading the session inside the lock) so concurrent publish/engagement/DM/repost jobs no longer race on the single-use refreshJwt and trip Bluesky's rate limit; bound Bluesky HTTP calls with timeouts and fall back to the persisted session on lock timeout (#158)
  • publishing: derive whether a Bluesky OAuth refresh needs a private_key_jwt assertion from the stored client_id instead of the request host, fixing invalid_client failures behind a reverse proxy that flipped healthy accounts to needs-attention (#158)
  • posts: derive mentions.*.handles.* validation rules from the Platform enum so Laravel's excludeUnvalidatedArrayKeys no longer silently strips Discord mention markup before it reaches the draft (#156)
  • queue: surface a rolling runway of the next 10 open slots (scanning up to 90 days) instead of a fixed 14-day window, so sparser schedules don't run out of visible queue slots; switch the queue slot picker to the shadcn Select for visual consistency (#153, fixes #143)
  • gifs: scope the media mixing-rule guard to the target thread segment via mediaForSegment, so media in one segment no longer blocks attaching a GIF or clip to another (#151)

🔒 Security

  • deps: bump league/commonmark to 2.9.0 to resolve newly-published DoS and unsafe-link-bypass advisories (transitive via laravel/framework) (#157)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.4.1...v1.4.2

v1.4.1

v1.4.1 ↗

A patch release that clears two v1.4.0 regressions: the queue worker failed to start — leaving every post stuck at "publishing" — and shipped images reported a stale version number.

🐛 Fixes

  • docker: spawn the queue worker from a script instead of an inline supervisord command, so it actually starts — posts no longer stick at "publishing" on v1.4.0 (a6d8d36)
  • release: derive the app version from the published git tag so a shipped image can no longer drift from its release (#149)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.4.0...v1.4.1

v1.4.0

v1.4.0 ↗

A big composer- and messaging-focused release: a unified DM inbox across four platforms with media attachments, a GIF/sticker/clip browser, per-thread media in the composer, an auto-repost/boost pipeline, LinkedIn Page support, and a fresh icon set and gradient design pass — plus a round of publishing, pagination, and OAuth fixes.

✨ Features

Messaging

  • messages: unified DM inbox for X, Bluesky, Instagram & Facebook (#131)
  • messaging: send media attachments in direct messages (#136)

Composer & posts

  • gifs: GIF/sticker/clip browser (#133)
  • compose: attach media to individual thread posts (#138)
  • compose: toggle to select/deselect all accounts (#142)
  • posts: "copy as draft" action for posts (#139)
  • calendar: multi-account glyph stack on posts (#128)

Platforms & publishing

  • linkedin: LinkedIn Page support (#117)
  • repost: auto-repost/boost pipeline for X, LinkedIn & Bluesky (#124)
  • x: premium account detection & video length limits (#83)

UI & design

  • ui: Cloudflare Kumo-style gradient on primary surfaces (#148)
  • icons: migrate from lucide-react to hugeicons (#144)
  • toast: color toasts by intent with semantic tokens (#134)

⚡ Performance

  • inertia: lazily resolve shared props and poll only changed keys (#135)

🐛 Fixes

  • publish: recover orphaned queue redeliveries instead of failing (#147)
  • compose: calibrate GD decode limit and surface upload errors (#146)
  • posts: fix cursor pagination crash on page 2 of the posts feed (#145)
  • image-editor: compress composed exports to avoid upload 422s (#129)
  • healthcheck: use a curl-based healthcheck against the app's route (#132)
  • mentions: persist handle edits on saved mentions (#130)
  • security: allow Cursor MCP OAuth callbacks in CSP form-action (#120)
  • inertia: fix OAuth authorization navigation (#121)
  • vite: support LAN HMR and HTTPS tunnels (4ce113c)

🔧 Maintenance

  • ci: speed up the test workflow (#118)
  • deps: bump docker/login-action (#137) and actions/checkout (#125)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.3.1...v1.4.0

🎉 New Contributors

  • @eugenepyvovarov made their first contribution in #83
  • @mkantem made their first contribution in #121
  • @kitlord made their first contribution in #132

v1.3.1

v1.3.1 ↗

A focused follow-up to v1.3.0: an analytics summary redesign, a per-request/external-lookup caching pass, and a handful of publishing and composer fixes across Meta, Threads, and the post editor.

✨ Features

  • analytics: summary stat tiles and redesigned follower chart (#116)

⚡ Performance

  • perf: cache expensive per-request and external lookups (#111)

🐛 Fixes

  • meta: handle duplicate OAuth callbacks (471bd8e)
  • threads: fail deletes rejected by the Graph API (ce2766c)
  • posts: proxy media through a same-origin endpoint for editors (#113)
  • feedback: prevent screenshot capture failure on cross-origin images (#112)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.3.0...v1.3.1

v1.3.0

v1.3.0 ↗

The largest release yet: full Meta platform support (Facebook, Instagram, Threads), Discord webhooks, a public HTTP API, an engagement inbox with reply triage, workspace subscriptions with usage metering and X cost budgets, and a Radix → Base UI rewrite — plus a long tail of publishing, security, and Postgres-compatibility fixes.

✨ Features

Platforms & publishing

  • meta: Facebook, Instagram & Threads publishing, metrics and engagement (#75)
  • discord: integration via channel webhooks (#84)
  • publishing: Reels and Stories publishing with a per-account format picker (#106)
  • compose: Facebook, Instagram & Threads compose previews (#108)
  • publishing: Instagram/Threads image conversion and fixes (#101)
  • x: opt-in quote tweets from a pasted status link (#71)
  • compose: accept more video formats via in-browser conversion (#88)

Composer & engagement

  • compose: emoji browser — Frimousse picker + inline :shortcode typeahead (#73)
  • compose: Shift+Enter soft newline + platform-accurate blank-line preview (#72)
  • compose: show both mention modes and keep cleared handles blank (#105)
  • compose: properly refresh recent post + show media in the post list (#103)
  • engagement: emoji picker and mentions in the quick reply box (#93)
  • engagement: keyboard triage and dummy inbox seeder (df3940c)
  • engagement: persist reply conversation roots (52c7cb6)
  • mentions: resolve LinkedIn org URNs for mention tagging (#98)

Billing, usage & metrics

  • billing: workspace subscriptions and publish gates (f77690b)
  • usage: usage metering base (#63)
  • usage: track X API cost budgets (65fb01b)
  • usage: per-workspace X budgets and reworked instance usage page (#110)
  • usage: instance usage reporting (8c75f01)
  • billing: promotion codes and tax ID collection (2c2bbf7)
  • metrics: age-banded polling with unchanged-streak backoff (#95)
  • engagement: fix X replies not loading + scale reply-fetch (#91)
  • analytics: seed demo metrics and toggle chart series (7b823fc)

Instance & workspace administration

  • instance: enable/disable platforms in instance settings (#78)
  • workspace: enable/disable connected accounts per workspace (#79)
  • engagement: gate LinkedIn reply fetching behind a capability scope (#102)
  • settings: move workspace and instance nav into the sidebar (cb90806)
  • settings: per-platform polling controls (8f618c0)
  • sidebar: billing-aware footer + hoisted workspace settings + update indicator (#89)
  • feedback: in-app feedback widget with Discord delivery (#109)

Platform, API & infrastructure

  • api: public HTTP API (#74)
  • ui: migrate UI from Radix to Base UI (#81)
  • mcp: add laravel/mcp to enhance server capabilities (04a55f7)
  • storage: configurable file storage + public images disk (ce4f0de, bbb4843)
  • ci: build and publish multi-platform (amd64/arm64) images (947e307)
  • auth: self-provision Passport encryption keys (#87)
  • session: extend default session lifetime to seven days (aba1128)
  • observability: opt-in Sentry error & performance monitoring (a92dc55)

🐛 Fixes

  • publishing: close precheck and connector gaps across every platform (#100)
  • linkedin: escape little-text-format reserved chars (#99)
  • db: make the schema and queries PostgreSQL-compatible (#85)
  • security: allow form redirects to any HTTPS service, incl. Stripe billing (2b08da3, 8bd2a3a)
  • engagement: stop like/unlike and reply actions from silently failing (#92)
  • engagement: only treat pasted images as images (#94)
  • engagement: fix author name truncation in reply views (#97)
  • compose: resolve 422 on edited-video upload + allow media host in CSP (#70)
  • bluesky: enforce one-GIF/no-mix rule before posting (#69)
  • workspace: prevent workspace logo distortion in the selector (3cd75d7)
  • ui: show selected label not raw value in Base UI selects (a154981)
  • ui: add type=submit to inert form buttons after the Base UI migration (a2996a9)
  • auth: repair email verification link and resend button (2173b31)
  • accounts: repair Discord reconnect button (dc63d27)
  • sentry: skip initialization when window is undefined (#96)
  • x: align publish limits and usage reporting (0adf185)
  • workspaces: enforce billing and publishing invariants (c0755ee)
  • media: survive S3 listing errors in the prune-uploads job (11ba652)
  • docker: copy generated emoji data into the production image (d90b678)
  • ci: correct jq filter for manifest digest extraction (e074645)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.2.0...v1.3.0

🎉 New Contributors

  • @kwstasna made their first contribution in #108

v1.3.0-rc.8

Pre-release v1.3.0-rc.8 ↗

Features

  • Post list refresh & media — the recent-post list now refreshes properly and shows attached media inline (#103).
  • LinkedIn org mentions — mention tagging resolves LinkedIn organization URNs so org mentions render as real tags (#98).
  • Age-banded metrics polling — metrics polling is age-banded with an unchanged-streak backoff to cut redundant fetches (#95).
  • LinkedIn reply capability gate — LinkedIn reply fetching is gated behind an opt-in Community Management capability scope (#102).
  • Instagram/Threads image conversion — image conversion and related publishing fixes for Instagram and Threads (#101).

Fixes

  • Closed publish-precheck and connector gaps across every platform (#100).
  • Escaped LinkedIn Little Text Format reserved characters so post bodies are no longer silently truncated (#99).
  • Fixed author-name truncation in reply views (#97).
  • Skipped Sentry initialization when window is undefined (#96).

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.3.0-rc.7...v1.3.0-rc.8

v1.3.0-rc.7

Pre-release v1.3.0-rc.7 ↗

Features

  • Quick reply upgrades — the engagement inbox reply box now has an emoji picker and @-mention support.
  • Keyboard triage — the engagement inbox supports keyboard-driven triage for faster review.
  • Sidebar settings — workspace and instance settings now live directly in the sidebar, with the settings nav flattened into direct destinations.
  • Analytics chart series — analytics charts let you toggle individual series on and off.
  • Public images disk & compose polling — added a public images storage disk and status polling while a post is composing/publishing.

Fixes

  • Like/unlike and reply actions no longer fail silently when they hit an error.
  • Pasted content is only treated as an image when it actually is one.
  • Metrics and reply fetches are now skipped for disabled accounts.

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.3.0-rc.6...v1.3.0-rc.7

v1.3.0-rc.6

Pre-release v1.3.0-rc.6 ↗

Features

  • Multi-platform Docker images — production images are now built and published for both linux/amd64 and linux/arm64.
  • Configurable file storage — uploads can now be pointed at a configurable storage disk (e.g. an S3-compatible bucket).
  • X replies now load reliably — fixed X engagement replies failing to load, and scaled reply fetching with an adaptive polling cadence, per-account rate-limit handling, and batched conversation lookups paginated via next_token.
  • Billing-aware sidebar — new sidebar footer (plan chip on cloud, community card when self-hosted), hoisted workspace settings, and an update-available indicator on the version badge.
  • Longer sessions — the default session lifetime is now seven days.
  • Engagement poll interval in settings is now labeled as a minimum floor.
  • The media editor's apply button is relabeled when the media is left unedited.

Fixes

  • Repaired the Discord account reconnect button.
  • Bundled the generated emoji-picker data into the production image so the picker works when self-hosted.
  • The prune-uploads scheduled job now survives S3 listing errors instead of failing the run.

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.3.0-rc.5...v1.3.0-rc.6

v1.3.0-rc.5

Pre-release v1.3.0-rc.5 ↗

Features

  • Added Stripe promotion code support, tax ID collection, and automatic tax calculation for billing.

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.3.0-rc.4...v1.3.0-rc.5

v1.3.0-rc.4

Pre-release v1.3.0-rc.4 ↗

Fixes

  • Fixed form redirects to allow any HTTPS service.

v1.3.0-rc.3

Pre-release v1.3.0-rc.3 ↗

v1.3.0-rc.2

Pre-release v1.3.0-rc.2 ↗

A feature-packed release: two new platforms (Meta & Discord), a public HTTP API, workspace subscriptions & usage metering, opt-in Sentry monitoring, and a full UI framework migration.

🔁 Changes since v1.3.0-rc.1

  • feat: opt-in Sentry error & performance monitoring (backend + browser)
  • fix(auth): email-verification links no longer 403 when an email provider appends tracking params to the link
  • fix(auth): the "Resend verification email" button works again (regressed in the Base UI migration) and now confirms with a toast

✨ Features

New platforms

  • meta: Facebook, Instagram & Threads — publishing, metrics and engagement (#75)
  • discord: publish via channel webhooks (#84)

Platform & API

  • api: HTTP API for programmatic posting (#74)
  • billing: workspace subscriptions with publish gates and X usage limits (#58)
  • usage: per-workspace platform-API usage metering (#63)
  • settings: enable/disable platforms instance-wide (#78)
  • workspaces: enable/disable connected accounts per workspace (#79)
  • settings: per-platform polling controls and instance usage reporting (8f618c0, 8c75f01)

Observability

  • sentry: opt-in error & performance monitoring for the backend and browser — disabled unless a DSN is configured (a92dc55)

Composer & X

  • compose: emoji browser — Frimousse picker + inline :shortcode typeahead (#73)
  • compose: Shift+Enter soft newline with platform-accurate blank-line preview (#72)
  • compose: accept more video formats via in-browser conversion (#88)
  • x: opt-in quote tweets from a pasted status link (#71)

UI

  • ui: migrate from Radix to Base UI (#81)

🐛 Fixes

  • auth: keep email-verification links valid when an ESP appends click-tracking params to them (2173b31)
  • auth: fix the inert "Resend verification email" button and confirm the resend with a toast (2173b31)
  • db: make the schema and queries PostgreSQL-compatible (#85)
  • compose: resolve 422 on edited-video upload + allow media storage host in CSP (#70)
  • bluesky: block one-GIF/no-mix rule before posting (#69)
  • compose: restore clicks on the tab strip and wire up the "+N more" menu (8691c76)
  • sidebar: center collapsed icon rail (1d83e7f)
  • engagement: block replies from disabled accounts, avoid stamping failed reply fetches (08df0d3, 79f7970)

🔧 Self-hosting / Infra

  • passport: self-provision encryption keys (#87)
  • deps: bump the github-actions group (#77) and attest-build-provenance (#67)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.2.0...v1.3.0-rc.2

v1.3.0-rc.1

Pre-release v1.3.0-rc.1 ↗

A feature-packed release: two new platforms (Meta & Discord), a public HTTP API, workspace subscriptions & usage metering, and a full UI framework migration.

✨ Features

New platforms

  • meta: Facebook, Instagram & Threads — publishing, metrics and engagement (#75)
  • discord: publish via channel webhooks (#84)

Platform & API

  • api: HTTP API for programmatic posting (#74)
  • billing: workspace subscriptions with publish gates and X usage limits (#58)
  • usage: per-workspace platform-API usage metering (#63)
  • settings: enable/disable platforms instance-wide (#78)
  • workspaces: enable/disable connected accounts per workspace (#79)
  • settings: per-platform polling controls and instance usage reporting (8f618c0, 8c75f01)

Composer & X

  • compose: emoji browser — Frimousse picker + inline :shortcode typeahead (#73)
  • compose: Shift+Enter soft newline with platform-accurate blank-line preview (#72)
  • compose: accept more video formats via in-browser conversion (#88)
  • x: opt-in quote tweets from a pasted status link (#71)

UI

  • ui: migrate from Radix to Base UI (#81)

🐛 Fixes

  • db: make the schema and queries PostgreSQL-compatible (#85)
  • compose: resolve 422 on edited-video upload + allow media storage host in CSP (#70)
  • bluesky: block one-GIF/no-mix rule before posting (#69)
  • compose: restore clicks on the tab strip and wire up the "+N more" menu (8691c76)
  • sidebar: center collapsed icon rail (1d83e7f)
  • engagement: block replies from disabled accounts, avoid stamping failed reply fetches (08df0d3, 79f7970)

🔧 Self-hosting / Infra

  • passport: self-provision encryption keys (#87)
  • deps: bump the github-actions group (#77) and attest-build-provenance (#67)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.2.0...v1.3.0-rc.1

v1.2.0

v1.2.0 ↗

A release centered on Bluesky OAuth support, composer workflow improvements, and MCP endpoint hardening.

✨ Features

  • bluesky: OAuth integration with enhancements and alt text support (#64)
  • bluesky: OAuth account connections (#62)
  • bluesky: custom instance selection (31ab09f)
  • compose: show timezone settings in the time picker (6a473ec)
  • compose: block publishing to disconnected accounts (6c0464c)
  • compose: keyboard shortcut for submitting posts (#60)
  • mcp: friendly browser landing page for the /mcp endpoint (1d19e57)

🐛 Fixes

  • bluesky: serialize OAuth token refresh to avoid a rotation race (6b9b036)
  • bluesky: validate OAuth service discovery URLs (4f0edbb)
  • gif: fix GIF publishing on X and Bluesky (#65)
  • linkedin: publish all text segments (deaf09b)
  • composer: improved highlight regex and tests (#57)
  • mcp: never serve the landing page to SSE/GET protocol clients (9dedb3e)
  • accounts: normalize Bluesky handles with @ prefix (#59)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.1.0...v1.2.0

🎉 New Contributors

  • @scanash00 made their first contribution in #64
  • @laborin made their first contribution in #65

v1.1.0

v1.1.0 ↗

A release focused on self-hosting hardening, security patches, and composer/settings improvements.

✨ Features

  • compose: link URLs in post previews (c8f94b1)
  • compose: improved mention picker (#47)
  • settings: profile and workspace photo uploads (437b6b6)

🐛 Fixes

  • notifications: correct unread notification position (#56)
  • cmd+k: fix global search filtering (#48)
  • cache: prevent stale Inertia page state (bfedb37)

🚀 Self-hosting / Deployment

  • pass env file through compose files for missing configurations (#55)
  • trust reverse-proxy headers via TRUSTED_PROXIES (#53)
  • handle TLS mixed-content issues behind proxies (#54)
  • default QUEUE_WORKER_COUNT to 1 so supervisord starts (#52)

🔒 Security / CI

  • update Guzzle to patch security advisories (0b57b8f)
  • add supply-chain security scanning to CI (682a707)

Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.0.0...v1.1.0

🎉 New Contributors

  • @raulpopadineti made their first contribution in #47
  • @CyrisXD made their first contribution in #52

v1.0.0

v1.0.0 ↗

init 🌮 release