Repository navigation
Releases
Releases · jurczykpawel/poststack
v0.20.0
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"inGET /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 (
@usernameor chat id) in the channel settings or withPATCH /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 honorretry_after, and a post links to itst.memessage for public channels. See Telegram connections. - Stories: an Instagram Story video over 60 s (Story format or auto-Story in
mediamode) 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}/publishreturnsstorySegments, and the post in Queue shows the split and the auto-Story card-fallback reason. See Stories.
Changed
POST /api/v1/posts/{postId}/publishreturnsstorySegmentsPending: truewhile a Story video from a URL is still being ingested;GET /api/v1/posts/{postId}then reportsdelivery.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_PREFIXvs TikTok'surl_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
mediamode 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
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
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) ormedia(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, channeldefault_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
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
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 scopesinstance_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
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
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). Seedocs/INSIGHTS.md.
Fixed
- Inbox "Older" no longer repeats the first page when the database session uses a non-UTC time zone.
v0.17.8
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
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
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_adswithMETA_REQUEST_ADS_SCOPE=true.