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_grantfailures 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
POSToperation weight instead of the worst-casexPublishCostMicrousd()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
refreshJwtand 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_jwtassertion from the storedclient_idinstead of the request host, fixinginvalid_clientfailures behind a reverse proxy that flipped healthy accounts to needs-attention (#158) - posts: derive
mentions.*.handles.*validation rules from thePlatformenum so Laravel'sexcludeUnvalidatedArrayKeysno 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
Selectfor 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/commonmarkto 2.9.0 to resolve newly-published DoS and unsafe-link-bypass advisories (transitive vialaravel/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
:shortcodetypeahead (#73) - compose:
Shift+Entersoft 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/mcpto 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=submitto 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
windowis 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
windowis 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/amd64andlinux/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-uploadsscheduled 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 ↗fix cloud Stripe redirect
Full Changelog: https://github.com/coollabsio/shoutrrr/compare/v1.3.0-rc.2...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
:shortcodetypeahead (#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
:shortcodetypeahead (#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
/mcpendpoint (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_COUNTto 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