Skip to content

What’s new in OpenPost.

New tools, small improvements, and fixes that make your day easier.

Release

v7.27.2

Fixed

  • Give generated Paraglide output a single writer: marketing no longer regenerates `apps/web/src/lib/paraglide`, web's Vite plugin passes the same options as `generate:i18n`, and `check-i18n` fails when the two drift apart. The web locale strategy keeps `preferredLanguage`, so first-time visitors still get `Accept-Language` detection.
  • Generate translation declarations without the upstream TypeScript emit that dominates `check -- frontend-marketing` on the full catalog. `generate:i18n` and the Vite plugin now share the fast declarations in `scripts/paraglide-declarations.mjs`; typed message inputs, locale options, and plural variants are unchanged.
  • Show the destination account photo on delivery cards, publication history rows, and workflow approval rows from the server-projected destination identity, with the platform badge preserved. Destinations whose account is unavailable retain their delivery details with a platform fallback.
  • Preserve the recorder's observed system-audio status when a screen recording contains microphone audio. An encoded audio track no longer implies that system sound was shared.
  • Message retries retain one operation identity, outbound echoes converge with queued sends, and uncertain provider outcomes remain inspectable.

24 more entries in the full changelog.

Added

  • Mobile Inbox with separate Chats and Comments, existing-chat replies, account filters, search, archive recovery, saved drafts, public thread context, and safe retry receipts.
  • Native Posts, Inbox, Analytics, Media and More navigation, with Calendar and Queue retained under Posts.
  • Foreground Inbox updates shared by web and mobile, incremental Bluesky chat logs, signed Meta message intake, leased Mastodon streams, and lazy network message history.
  • Separate X OAuth2 authorization for legacy direct messages, preserving OAuth1 publishing, with signed event receipts and explicit operator budget controls for paid X Activity subscriptions.

Security

  • Update DOMPurify and the documentation framework to patched releases covering the latest upstream security advisories.

Changed

  • Add FeedHive to the "best social media tools for solo founders" guide with its verified plan limits, agent access, and pricing source.
  • Simplify the Ideate dialog with attachment previews, clearer topic-search controls, and grouped generation actions.
Read the full release notes

Release

v7.26.0

Added

  • Export Analytics from the web app as CSV, Excel with charts, or JSON. Choose the timezone, group rows by post, day, week, month, platform, or account, filter platforms and metrics, and pick which table to download. Unmeasured provider metrics stay empty instead of becoming zero. The same export is available at `GET /analytics/export`.
  • Select individual connected accounts using their avatar, platform, and handle. Every exported table respects the selection; missing measurements stay empty, and grouped reports exclude averages and reporting-period values that cannot be summed by publication date.
  • Notify the people who can approve when a workflow parks a draft for approval, and notify them and the author when that wait expires. Both transitions were silent before: a draft could sit in the approval queue, and later disappear from it, without anyone being told. The notification links straight to the waiting run, which now opens on that run. The audience is the roles that satisfy the approve level — administrators and clients — derived from the access matrix rather than restated, so a client, who can decide an approval without being able to administer the workspace, is told about the wait that is theirs to resolve. The author is skipped when others can decide, and told when nobody else can.
  • Remind the approvers three days before a wait expires. An expiry notice alone arrives thirty days after anyone last thought about the draft, which is too late to act on; the reminder is the only notice that arrives while the reader can still do something about it.
  • Resolve the approval notices once the wait is decided. Approving or cancelling left every other approver holding an item that said "waiting for your approval" with a button that answered with an error; the row now keeps its place in the history but stops claiming something untrue.

1 more entry in the full changelog.

Fixed

  • Remove the impressions summary from web and mobile Analytics, and stop the web page from scrolling into empty space below its content.
  • Emit approval notifications after the transaction that changes the run, not inside it. A failed notification write used to roll the park back: a recipient whose stored preferences would not decode, or a workspace lookup that found no row, left the run behind its lease, so the sweep re-enqueued it and the step replayed and failed again — a loop in which the run never parked. Notification failures are now logged and the run keeps its state.
  • Expire stale approvals per run instead of per batch. `expireApprovals` returned on the first error, so one run that could not be expired stopped every other wait in the batch from expiring, once a minute.
  • Restore the revision to the expiry compare-and-set. The guard had been narrowed to the state alone, which still yields one winner but no longer matches the contract that a writer only replaces the row it read.
  • Carry the workspace in the notification link. The run inspector resolves a run against the workspace the viewer is in, so an approver arriving from another workspace landed on an empty inspector.

23 more entries in the full changelog.

Changed

  • Collapse the two approval notification topics into one `workflow_approval` topic with three states. The preferences page offered two switches for one mechanism, and neither described what actually happened.
  • Composer destination checks keep the previous readiness answer usable while a refresh runs. Readiness warnings and publish actions no longer disappear and reappear during ordinary typing, and submitting still resolves accuracy first.
  • Required destination pickers for multiple accounts now load together instead of one account at a time, and one account's option request can no longer discard another account's result.
  • Capability resolution no longer cancels the in-flight request immediately while typing, so completed provider work can populate the capability cache.
  • Capability resolution sends per-account segment overrides only for accounts that actually customize text, media, alt text, a poll, or an AI attachment requirement.

5 more entries in the full changelog.

Read the full release notes

Release

v7.23.0

Added

  • Connect Instagram Business and Creator accounts directly without a Facebook Page, or choose the existing Facebook Login connection. Instance administrators can configure both methods independently. The connection dialog explains their requirements and availability.
  • Connect dev/null accounts with an SSH private key and publish commits, replies, and image posts from OpenPost. Publishing signs each commit with the key on your GitHub account, exactly like the official dev/null commit script. New dev/null accounts need approval before posts go public, and dev/null allows 10 commits a minute.
  • Render account and workspace identity in the mobile app, including avatars and labels on drafts, the composer, analytics, and media previews.
  • Show per-destination publishing readiness in the mobile composer before publishing.
  • Publish the enforced media upload limits from the server and validate mobile attachments against them, with the limits guide generated from the same constants.

Changed

  • Give every account picker one shared row and one select-all header: account checkboxes are now named for the account (readiness issues stay linked as descriptions instead of changing the name), and partial destination selections show an indeterminate state. Selection contracts are unchanged.
  • Load mobile media previews as thumbnails and show a placeholder when a preview cannot be loaded.
  • Derive marketing tool limits and provider capability claims from the same catalogues the product enforces.

Fixed

  • Ellipsize long account names and handles on delivered Instagram and Pixelfed text cards instead of clipping them mid-word with no ellipsis, matching the preview. Existing cards re-render on the next save.
  • Fixed a startup crash when publish-now jobs were pending at restart. Authorization recovery now compares timestamps with the original receipt at database precision, preserving retry dispatch times and interrupted provider operations. Jobs with invalid authorization are failed individually instead of blocking startup. No manual database edits are needed for valid pending jobs. (#455)
  • Restore the desktop sidebar's compact spacing: the planner calendar, drafts, and footer navigation sit at their original 8px inset instead of the doubled paddings introduced with the sidebar planning change.
  • Open a workflow step's inspector on the first node click instead of sometimes requiring a second click.
  • Recover LinkedIn Organization Page lookups when the provider rejects optional profile projections.

20 more entries in the full changelog.

Maintenance

  • Prepare the Android package at 0.2.63 (65) for the mobile identity, readiness, and media-preview changes in this release.
  • Consolidate shared web and native controls on one owner per concern, including the badge tone API, form field, section heading, overflow menu, empty state, inline notice, account row and select-all, async action button, clipboard helper, byte-size formatter, monogram rule, color picker and telemetry consent in `@openpost/ui`, and the editor media and audio primitives in `@openpost/editor-shared`.
  • Route shared server behavior through one owner, including the Discord webhook sender, bounded avatar fetch, credentialed-redirect policy, settings-map coercion, server-side text counter, provider feature table, and text-card option values.
  • Gate the hand-written SDK, CLI, and n8n surfaces against the served spec, and guard platform text limits and counting rules across TypeScript and Go.
  • Restore README asset and screenshot refreshes, stabilize native gallery capture, and update the pinned Alpine image and GitHub Actions group.
Read the full release notes

Release

v7.22.9

Fixed

  • Opening or editing generated mobile drafts no longer crashes when a destination segment has empty settings.
  • Removed the duplicate Ideate shortcut from the mobile draft header. Ideate remains available beside quick capture.
  • The bottom Ideate button opens the AI workspace even before you enter an idea, preserving the shortcut removed from the header.
  • Drafts remain available in the desktop sidebar across Posts, Inbox, Analytics, Media, and other workspace pages. The list fills the available space and scrolls through all drafts.
  • Changing pages or languages with sidebar drafts no longer causes background composer-import errors.

Changed

  • The sidebar calendar is visible by default, with workspace navigation below the drafts. Turn off Sidebar calendar in Preferences to use the compact layout. Existing saved choices are preserved.
Read the full release notes

Looking for the details?

Find every fix and update note in the full changelog.

Open on GitHub