<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>OpenPost changelog</title>
  <id>https://openpost.social/changelog</id>
  <link href="https://openpost.social/changelog" />
  <link href="https://openpost.social/changelog.xml" rel="self" type="application/atom+xml" />
  <updated>2026-08-23T00:00:00Z</updated>
  <entry>
    <title>OpenPost v4.1.0</title>
    <id>https://openpost.social/changelog#v4.1.0</id>
    <link href="https://openpost.social/changelog#v4.1.0" />
    <updated>2026-08-23T00:00:00Z</updated>
    <content type="text">Added: Add public About, Contact, and Developers pages, linked product and operator structured data, an Atom changelog feed, direct agent interface guidance, and explicit search and model-training permission for public marketing content. Changed: Add server, support, terms, license, and usage metadata to the generated OpenAPI contract.</content>
  </entry>
  <entry>
    <title>OpenPost v4.0.1</title>
    <id>https://openpost.social/changelog#v4.0.1</id>
    <link href="https://openpost.social/changelog#v4.0.1" />
    <updated>2026-08-23T00:00:00Z</updated>
    <content type="text">Fixed: PostgreSQL upgrades now remove the retired Video Editor tables in foreign-key order instead of failing during startup.</content>
  </entry>
  <entry>
    <title>OpenPost v4.0.0</title>
    <id>https://openpost.social/changelog#v4.0.0</id>
    <link href="https://openpost.social/changelog#v4.0.0" />
    <updated>2026-08-22T00:00:00Z</updated>
    <content type="text">Changed: Rate stretch now scales keyframe timing and ripples linked downstream clips on each synchronized track. Crossfades now span both sides of the cut and render both clips in preview and export using validated hidden source handles. Made the standalone Expo app the only Android app. GitHub releases now publish its signed `openpost-app-android.apk`; the old web wrapper and its server chooser are gone. Reorganized Settings into clear Personal, Workspace, Organization, and Instance groups with compact desktop tabs and one mobile selector. Rewrote settings labels and help text so controls describe their scope and effect consistently. 5 more changed entries in the full changelog. Fixed: Directly trimming a transitioned clip edge now previews the break, removes the transition with a toast, and restores it with the same undo step. Timeline selections no longer retain clips removed by an edit or undo state change. Ripple trims now preview and apply the same inserted or removed time across unlocked sync-locked tracks while preserving split media source ranges. Video Editor drag, undo, save, and export flows now snapshot reactive timeline state without browser cloning failures. Improved the Android app&apos;s large-text layout, screen-reader labels, workspace selection, draft menu, attachment retries, destination removal errors, post rescheduling, and delete failure handling. 4 more fixed entries in the full changelog. Removed: The entire cloud-synced OpenPost Video Editor: frontend editor (~23k lines), `/video-editor/*` sync API, `videoproject` package, `VideoProject*`/`VideoReturnToken` models, bundled editor model packs and audio assets, and the `@openpost/video-project` package. Migration 107 drops `video_projects`, `video_project_assets`, `video_project_revisions`, `video_return_tokens`, and `media_attachments.video_project_id`. Composer return-token handoff. &quot;Edit video&quot; now links to `/video-editor` via plain URL parameters. Removed the unused settings search, duplicate media-retention information, and the duplicate Organization deletion control from Workspace settings. Added: Video Editor effects can now be dragged onto one visual clip or a compatible multi-selection, with live drop previews and one undo step. The Video Editor timeline now supports drag-marquee selection across tracks, with additive selection modifiers and a visible selection box. OpenPost Video Editor now supports ripple trim, rate stretch from either edge, linked-selection controls and shortcuts, multi-clip link and unlink actions, group moves and deletes, visible transition spans, and explicit transition removal. Video Editor move, trim, slip, and slide tools now keep synchronized audio and video companions aligned across every affected track. Timeline edits now preserve valid transition handles and keyframes instead of leaving broken cuts or moving keys into blend-owned frames. 7 more added entries in the full changelog.</content>
  </entry>
  <entry>
    <title>OpenPost v3.14.0</title>
    <id>https://openpost.social/changelog#v3.14.0</id>
    <link href="https://openpost.social/changelog#v3.14.0" />
    <updated>2026-08-20T00:00:00Z</updated>
    <content type="text">Added: Added `changes/*.md` fragment workflow that merges per-issue changelog entries into `CHANGELOG.md` under `[Unreleased]` before each release, grouped by heading; fragments are deleted after merge so the manual changelog stays conflict-free across parallel tickets. Added `devenv` `doctor` script that proxies to `bun run doctor` for a single local health gate. Changed: Made the product clear at a glance in README and marketing with refreshed hero, product screenshots, and copy that shows the Publication and Rendition workspace without hiding provider truth. Documented the single backend runtime location for `OPENPOST_PADDLE_*` (`backend/.env` for devenv, container environment for Docker) and clarified that bare `PADDLE_*` is never read; Cloud mode now warns at startup with the exact ignored names without printing values. Refreshed product screenshots as trustworthy, exact renders of the current app and documented the fragment workflow with granular check guidance (`check:frontend:types`, `check:contracts`, `test:file`, `test:backend:pkg`) and an `.rgignore` to keep searches fast. Staged provider, security, and scheduling flows with progressive disclosure: available providers stay primary while setup-required providers move behind a collapsed section, failed provider errors stay dominant with a retry beside the message, authenticator setup is staged one primary action at a time, quick schedule paths are primary while calendar and randomization are behind disclosure, and Workspace Preferences and Security panels collapse media lifecycle, danger zone, and identity sections. Fixed: Instance admin plan overrides now work end to end. Assigning an override previously failed with a 500 because the generated subscription row carried an empty `workspace_id` that violated the Postgres foreign key; the model now stores a NULL workspace, and the override grants plan entitlements exactly like a paid Paddle subscription across billing status, entitlement checks, setup state, and public profiles. Removing an override from the plan dialog previously returned 422 because the empty `plan_id` was rejected by request validation; empty `plan_id` now reaches the removal path as documented. Resolved configured Mastodon adapter by canonical `instance_url` before dynamic registration so OAuth callbacks find the correct provider key. Loaded `SSL_CERT_FILE` into the Go root pool on macOS so local E2E Mastodon CA is trusted without `InsecureSkipVerify`. Ignored aborted fetch errors after component teardown and pagehide so stale composer requests do not pollute console telemetry. 7 more fixed entries in the full changelog.</content>
  </entry>
  <entry>
    <title>OpenPost v3.13.0</title>
    <id>https://openpost.social/changelog#v3.13.0</id>
    <link href="https://openpost.social/changelog#v3.13.0" />
    <updated>2026-08-17T00:00:00Z</updated>
    <content type="text">Added: Instance administrators can assign or remove plan overrides for users without requiring Paddle checkout, through a new admin endpoint and plan selection dialog. Fixed: Extended button and card touch targets with an invisible bottom area to improve mobile tap usability. Removed unnecessary wrapper padding around the Workspace setup guide in the composer. Fixed whitespace rendering in feedback dialog radio items.</content>
  </entry>
  <entry>
    <title>OpenPost v3.12.0</title>
    <id>https://openpost.social/changelog#v3.12.0</id>
    <link href="https://openpost.social/changelog#v3.12.0" />
    <updated>2026-08-16T00:00:00Z</updated>
    <content type="text">Changed: Retired the Post authoring model end to end. Post HTTP routes, MCP post and draft tools, the legacy `publish_post` Job kind, and the `posts` service are removed; the publisher, composer, scheduler, calendar, Engagement, Messaging, and notification paths operate only on Publication and Rendition identifiers. Historical migration files still upgrade older databases, and immutable `legacy_post` / `legacy_post_variant` aliases resolve old links to canonical Publications. The Post compatibility tables (`posts`, `post_destinations`, `post_media`, `post_variants`, `thread_drafts`, `post_media_deliveries`) are dropped after the legacy backfill completes and no Post rows or pending `publish_post` Jobs remain. Added repository-owned Oxlint checks that reject unsafe type widening, unverified runtime boundaries, reflective access, module mocking, and other patterns that weaken type and dependency contracts. Split engagement and messaging refresh, persistence, provider seams, recurring Jobs, and retries into independent capability outcomes, and removed the transitional communications runtime. Contracted REST, MCP, CLI, browser, and direct application Workspace authorization onto one read, edit, or administer decision, removed middleware-owned and membership-only policy helpers, and kept durable Jobs explicitly scoped without user impersonation. Extracted Messaging into an independent application module with internal Workspace authorization, capability-specific provider access, stored conversation reads and mutations, durable sends, typed outcomes, provider-write fencing, and its own recurring collection chain over transitional sync-state storage. 66 more changed entries in the full changelog. Fixed: Trimmed the SMTP username so a trailing space in `OPENPOST_SMTP_USERNAME` cannot send a malformed AUTH identity and fail notification email delivery with an SMTP authentication error. Logged the terminal failure message when a background Job fails and recorded its retryability in error telemetry, so transient delivery failures are diagnosable without inspecting the database. Kept homepage animation cleanup inside the browser lifecycle so marketing prerender no longer calls browser-only animation APIs. Kept unlimited Publication scheduling operational when quota storage is unavailable, while preserving canonical usage accounting whenever counters exist and keeping limited plans fail-closed. Stopped routine autosaves from replaying the Saved animation and from replacing an unchanged Image Editor document, which refreshed page previews after edits. 5 more fixed entries in the full changelog.</content>
  </entry>
  <entry>
    <title>OpenPost v3.11.0</title>
    <id>https://openpost.social/changelog#v3.11.0</id>
    <link href="https://openpost.social/changelog#v3.11.0" />
    <updated>2026-08-12T00:00:00Z</updated>
    <content type="text">Added: Added one canonical hosted-plan catalogue and an expiring signed purchase choice that keeps exact pricing and trial terms through password signup, email verification, refresh, and identity-provider signup without defaulting invalid selections to Founder. Added an explicit first-Workspace confirmation that shows the selected plan and trial terms, atomically binds the named Workspace to one checkout attempt, and resumes that attempt after refresh without creating duplicates. Fixed: Kept thread remove controls above their textareas, tightened publication-history and meme-picker overlays to their content, highlighted the active sidebar draft, removed the redundant AI alt-text review note, and retried one safe transient Memegen catalog read. Restored release gating after the hosted purchase-flow merge by accepting formatter-safe provider-catalog sources and checking marketing links and trial copy against the canonical purchase terms.</content>
  </entry>
  <entry>
    <title>OpenPost v3.10.1</title>
    <id>https://openpost.social/changelog#v3.10.1</id>
    <link href="https://openpost.social/changelog#v3.10.1" />
    <updated>2026-08-12T00:00:00Z</updated>
    <content type="text">Fixed: Qualified PostgreSQL provider-delivery upserts so the durable write fence reaches the provider instead of failing before every publication request. Changed: Pruned completed and currently out-of-scope audit-remediation entries so the backlog contains only active or explicitly deferred work.</content>
  </entry>
  <entry>
    <title>OpenPost v3.10.0</title>
    <id>https://openpost.social/changelog#v3.10.0</id>
    <link href="https://openpost.social/changelog#v3.10.0" />
    <updated>2026-08-12T00:00:00Z</updated>
    <content type="text">Changed: Added a repository map, an agent workflow router, and a read-only doctor for local workflow artifacts and configured GitHub triage labels. Fixed: Updated the marketing browser contract to verify the fictional workflow disclosure after removal of the unproved customer-logo rail. Made the changed-file pre-push formatter load the Svelte parser explicitly so marketing component changes are checked instead of blocking every push. Removed unproved customer-logo usage claims, labeled generated personas and workflows as fictional examples, and added a dated register that validates proof-claim owners, evidence, review dates, and expiry. Kept failed conversation read-state writes visible and retryable instead of clearing unread state locally, and made Android releases fail closed rather than publishing an unsigned APK under the installable asset name. Bound hosted checkout completion to its opaque billing attempt, persisted a validated same-origin return path with the selected plan and period, and made that path one-time so unrelated subscriptions, refreshes, and replay cannot redirect a user. 8 more fixed entries in the full changelog.</content>
  </entry>
  <entry>
    <title>OpenPost v3.9.6</title>
    <id>https://openpost.social/changelog#v3.9.6</id>
    <link href="https://openpost.social/changelog#v3.9.6" />
    <updated>2026-08-12T00:00:00Z</updated>
    <content type="text">Fixed: Escaped LinkedIn&apos;s reserved commentary characters at the provider boundary so ordinary post text with parentheses or other markup symbols is published in full instead of rendering only the prefix.</content>
  </entry>
</feed>
