Skip to content

Releases

v0.20.0

Choose a tag to compare

@github-actions github-actions released this 11 Nov 22:16
b1bbefe

Added

  • LinkedIn Company Pages: the new LinkedIn Company Page tile signs in with the organization permissions and lets you pick your profile and/or the Pages where you are a Super admin or Content admin; each becomes its own channel publishing text, image, video and article posts as the Page. The regular LinkedIn profile connection is unchanged and works without the Community Management API product. Channels expose metadata.subKind: "organization" in GET /api/v1/channels. See DEPLOY.
  • TikTok photo posts: 1–35 images (WebP/JPEG, ≤ 20 MB each) through TikTok's Photo Post API, in the composer and API, as Direct Post (creator privacy, comments and commercial disclosure with confirmation) or to the TikTok inbox. Photos are pulled from TIKTOK_PULL_URL_PREFIX; a URL outside the verified prefix is rejected before sending. Progress is tracked until TikTok reports the final state and the public post id when available. See DEPLOY.
  • Threads: mixed carousels with 2–20 images/videos, available in the composer and API. Container readiness and publication progress survive worker restarts; an uncertain publish is checked without another publish attempt.
  • Telegram publishing: a connected bot can publish scheduled text, photo, video and 2–10 item albums to a channel or group. Set Publish to (@username or chat id) in the channel settings or with PATCH /api/v1/channels/{id} (publish_target); PostStack checks that the bot is an administrator with permission to post before saving. Captions follow Telegram limits (4096 text, 1024 media), media is fetched by Telegram from its URL (photo ≤ 5 MB, video ≤ 20 MB), rate limits honor retry_after, and a post links to its t.me message for public channels. See Telegram connections.
  • Stories: an Instagram Story video over 60 s (Story format or auto-Story in media mode) is split into consecutive 60 s clips and published as separate Stories in order; a retry never repeats a published clip. The composer shows the number of Stories before publishing, POST /api/v1/posts/{postId}/publish returns storySegments, and the post in Queue shows the split and the auto-Story card-fallback reason. See Stories.

Changed

  • POST /api/v1/posts/{postId}/publish returns storySegmentsPending: true while a Story video from a URL is still being ingested; GET /api/v1/posts/{postId} then reports delivery.storySegments (Instagram) once its length is known.
  • TikTok photo captions allow 4000 characters in the composer (video stays 2200), the carousel label shows the real media limit of the selected channels (TikTok photos 35), and the two TikTok media-URL errors are distinct: outside TIKTOK_PULL_URL_PREFIX vs TikTok's url_ownership_unverified (verify the prefix in the TikTok portal for the app mode in use).
  • Channel connection: an OAuth session that timed out (state cookie gone after 10 min, e.g. a slow provider login) now shows "The connection session expired — please try again" instead of the generic invalid-state message.
  • Auto-Story media mode accepts Facebook Story video up to 120 s (was 90 s), as measured on a live Page.

Fixed

  • Threads: a newly connected channel's ~1 h token is exchanged for a 60-day token (refreshed before expiry), so publishing no longer fails an hour after connecting. A container request that Threads rejects now shows the real error (expired token marks the channel Needs reauth) and can be retried after reconnecting; only a timeout or network failure still asks for a manual check. Channel health checks and the hourly sweep detect an expired Threads token.
  • Publishing distinguishes provider permission, quota and X credit errors from expired tokens, and respects Retry-After and X rate-limit reset headers while preserving uncertain-publication recovery.

v0.19.1

Choose a tag to compare

@github-actions github-actions released this 10 Nov 17:28
d200c06

Added

  • Docs: Stories explains why Facebook can add a shortened preview of every new reel to the Page's Story (a Page setting in Meta Business Suite that the API cannot read or change) and how to turn it off. The Auto-Story panel of a Facebook channel links to that Page's reel composer and to the guide.

Changed

  • Story cards: the button text follows the post language (post, then its content, then English), e.g. "Zobacz całą rolkę" for Polish posts. The composer has a language select for posts.

v0.19.0

Choose a tag to compare

@github-actions github-actions released this 10 Nov 13:48
193ce31

Fixed

  • Story cards rendered boxes instead of text on Docker installs: the web and worker images now include fonts with full Latin (incl. Polish) coverage, and the image build fails if no such font is available.

Added

  • Auto-Story mode (PRO): choose what the automatic Story after a post contains — card (the generated card; for a video post it now uses a frame from the video as its picture) or media (the post's own photo or video re-published as a Story; for a carousel the first item). Set the default per channel and override it per post in the composer or via the API (autoStoryMode, channel default_auto_story_mode). Media that exceeds Story limits (for example video longer than 60 s on Instagram or 90 s on Facebook) falls back to the card and the reason is recorded. Existing channels keep the card.

v0.18.3

Choose a tag to compare

@github-actions github-actions released this 10 Nov 10:31
7251b54

Fixed

  • Stories: posts with the Story format on Facebook (photo and video) and Instagram (both login types) are now published as Stories. Previously Facebook sent them as regular videos and Instagram rejected them. The automatic Story after a feed post is unchanged.
  • LinkedIn: the Article format now publishes a link post with title, optional description and an optional thumbnail (Posts and Images API). Posts and the API accept an articleUrl; a previously scheduled article without one fails with a clear reason.
  • Scheduling: a post could stay "scheduled" without being published when the app server clock was slightly ahead of the database clock. Due-time checks now use one consistent clock.

v0.18.2

Choose a tag to compare

@github-actions github-actions released this 09 Nov 20:43
91f50b4

Added

  • Insights: the Reach summary card now shows the total for the selected 7 or 30 days. The value is Instagram's own unique-accounts count for the whole period (not a sum of daily values, which would count repeat viewers more than once), collected by the existing worker within the same rate limits.

  • Settings → Integrations: OAuth client credentials for YouTube, TikTok, LinkedIn, X and Threads can now be entered in the dashboard (or via GET/PUT /api/v1/settings/publishing-oauth, operator scopes instance_config:read/instance_config:write) instead of only in .env. Secrets are stored encrypted and never returned; a dashboard value takes precedence over the environment variable, and clearing it falls back to .env. Changes apply without a restart.

Fixed

  • Channels: platform counters and the platform filter show "X" instead of the internal name "twitter".
  • X: reading or deleting a post that no longer exists on X (GET/DELETE /api/v1/posts/{postId}/platform) now reports it as gone instead of failing with 502. X answers such requests with HTTP 200 and a "resource not found" problem rather than 404.

v0.18.1

Choose a tag to compare

@github-actions github-actions released this 09 Nov 15:43
29016db

Changed

  • Removing a channel (dashboard or DELETE /api/v1/channels/{channelId}) now disconnects it everywhere: stored credentials are cleared, Insights collection stops and background syncs no longer bring it back. Its history is kept; the API no longer hard-deletes the channel or returns 409 for channels with sequence enrollments. Reconnecting the account restores it.

v0.18.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 13:20
28551c9

Added

  • Insights (PRO): opt-in account statistics for Instagram channels, starting with daily Reach. One Insights screen per channel with 7/30-day ranges, an accessible chart and data table, clear access/collection statuses and a refresh button. Data is collected by the existing worker within shared rate limits and stored locally (400 days). REST API: /api/v1/channels/{channelId}/insights (status, account report, collection on/off, refresh). See docs/INSIGHTS.md.

Fixed

  • Inbox "Older" no longer repeats the first page when the database session uses a non-UTC time zone.

v0.17.8

Choose a tag to compare

@github-actions github-actions released this 08 Nov 09:57
823542a

Fixed

  • Inbox restores every loaded page after a refresh of an "Older" view, and browser Back closes a thread opened after a refresh.

Added

  • API: read and delete a published X post from its PostStack post (/api/v1/posts/{postId}/platform).

v0.17.7

Choose a tag to compare

@github-actions github-actions released this 07 Nov 17:19
e184130

Fixed

  • AI provider dialogs restore focus to their opening button when closed. Overlong API keys show the 500-character limit beside the field while preserving the form.

Added

  • AI providers can be connected, tested and reordered in Settings, with automatic replacement, Main and Answering now indicators, and a shared JSON/API list. Existing AI settings migrate automatically.
  • Compose Instagram and Facebook carousels with 2–10 media items from URLs, uploads or the media library. Reorder and remove slides, preview thumbnails, and check channel support before scheduling. The media API also lists ready files and accepts binary uploads.

v0.17.6

Choose a tag to compare

@github-actions github-actions released this 05 Nov 23:12
00ab6a8

Fixed

  • Invalid brand colours show an inline error while keeping the editor open and preserving entered values.
  • Draft edits containing NUL show a validation message without replacing the Inbox thread or changing the saved draft.
  • Long approval replies wrap inside their cards on mobile and desktop.
  • Contact email addresses remain readable after htmx navigation behind Cloudflare.

Added

  • Facebook video carousels are available when channel ads permissions are confirmed. Channels show availability and explain missing access; Facebook OAuth can optionally request pages_manage_ads with META_REQUEST_ADS_SCOPE=true.