Release notes / MediaVerse
Free Plugin Plugin

MediaVerse

WordPress media library treats every photo and video like an attachment, and at 10k uploads it crawls. WPMediaVerse runs on dedicated database tables with feeds, lightboxes, direct messages, and OpenAI Vision moderation included.

27 releases
v2.6.2 latest
October 13, 2026 shipped

v2.6.2 Latest

October 13, 2026
New 3 Improve 25 Fix 21 Security 8 Dev 6 Compat 2

New

  • Deleting a comment also deletes its replies, as on social networks.
  • Read notifications older than 90 days are removed daily.
  • Photo and video chat messages have a Message options button, so Reply, React and Unsend work on touch screens.

Improve

  • Chat attachments live only in their conversation: they are no longer listed in My Media, the media list or the WordPress Media Library, and existing ones move to protected storage.
  • Chat files uploaded but never sent are deleted after a day.
  • A gallery shows as one tile with a badge on Explore, the Media Grid block, the feeds and the BuddyPress profile and group tabs, and stays listed when its first item is private or deleted.
  • The gallery badge and lightbox count every item the viewer may see, so owners and followers reach all of theirs.
  • Under a filter or search, a gallery is fronted by its first matching item and the lightbox steps through the matching items only.
  • Each item in a gallery lightbox shows its own reactions and comments.
  • The List layout shows each item's title, date, counts and uploader beside the thumbnail on Explore, profiles, the BuddyPress Media tabs and the Media Grid block.
  • Clicking an image in a chat opens it full size, videos show a frame and audio files get a player.
  • Delete for everyone and Unsend for everyone ask first, and Escape closes an open message menu.
  • Reading a conversation clears its message notifications.
  • The notifications bell closes on an outside click or Escape and shows times such as 2 hours ago.
  • A chat thread opens at the newest message and stays there while photos and videos load.
  • The comment delete prompt says how many replies go with it, and album prompts say items instead of photos.
  • Following, favouriting or reacting again notifies the owner only once.
  • A notification about an item its reader can no longer see shows no title or link.
  • Member search matches display names and public profile names, never login names.
  • Explore search returns the same results on the first page and on Load More.
  • Categories has its own item in the MediaVerse menu, and the Albums screen no longer shows media categories and tags.
  • On a BuddyNext site, BuddyNext sends only the member emails it owns; MediaVerse still sends the rest.
  • Database updates run one at a time and continue where they stopped.
  • Screen readers hear the right name for the People search field and the chat message buttons, and comment buttons are 44px on touch screens.
  • A document page names its privacy with the same words as the drive.
  • Storage screens call local storage "This server", as the setting does.
  • The Integrations screen no longer claims features for Learnomy, WP Career Board and Listora that MediaVerse does not provide.
  • An incomplete licensing package shows an admin notice that automatic updates are off, instead of failing silently.

Fix

  • BuddyPress activity posts show their photo again when direct delivery is on.
  • An MP4 file branded as M4V, as iPhones save them, uploads like any MP4.
  • Changing an item's privacy through the API updates its BuddyPress activity post.
  • A BuddyPress post made from several uploads follows its most private item, and deleting one photo keeps the post.
  • Comments deleted or edited in MediaVerse are removed from the BuddyPress activity post with their replies and notifications, including comments made before 2.6.2, and replies sit under their comment.
  • The BuddyPress lightbox steps through every photo of a post made from the Upload page.
  • The BuddyPress lightbox shows Edit only to the owner and no Report on your own media.
  • Load More on a BuddyPress group's Media tab shows only that group's media.
  • Deleting or erasing a member removes their media files, and account deletion never stops part way.
  • Cancelling an account deletion request lifts only the suspension it set, and asking twice changes nothing.
  • The album edit window pre-selects the album's photos again, and album cards show exact counts to their owner.
  • Uploads with the same title at the same time no longer fail.
  • A blocked member can no longer reopen a conversation, sees why a message was refused and does not see the other member online.
  • A new conversation shows the member's name and picture in the list without a reload.
  • Pinned shows only on pinned conversations, the typing indicator clears when the message arrives, and an empty conversation stays out of the other member's inbox.
  • The Messages page and the media profile no longer show a blog post's title as their heading, and Messages answers normally on a site with no blog posts.
  • The lightbox arrows keep their look on themes that style buttons, and the moderation badge in the admin lines up.
  • A deleted chat message no longer offers reactions or Reply.
  • Explore says "in" rather than "tagged" when a category has no results.
  • The wp mvs diagnose_cpt_ids warning no longer points at a fix that shipped in 2.4.0.
  • The licence and update screen loads its styles and scripts on hosts where the plugin path does not match the web root, and every bundled copy of the update SDK is the same.

Security

  • Chat attachments open only for the people in the conversation.
  • A shared item opens only for what its owner chose to share.
  • Album and collection feeds, archives, sitemaps and site search list only public ones.
  • Bulk delete checks the same capabilities as a single delete.
  • Signed link lifetimes are capped at the site's setting.
  • A slug lookup and the activity feed apply the same visibility checks as the item page.
  • A message reply can only reference a message in its own conversation.
  • A member's data export lists only the blocks and reports they made.

Dev

  • GET /mvs/v1/media accepts group (a BuddyPress group's media, following the group's visibility).
  • GET /mvs/v1/albums omits item ids unless with_items=1 is passed (filter mvs_album_list_include_items).
  • New filters mvs_comment_delete_replies, mvs_unsent_chat_file_hours and mvs_privacy_level_value.
  • New MediaRepository::gallery_hidden_clause(), gallery_tile_counts(), group_scope_clause(), search_clause() and document_scope_ids(); gallery_exclude_subquery() is deprecated.
  • Database update: BuddyPress activity privacy is refreshed, and indexes are added to mvs_media_meta and mvs_messages. This may take a moment on large sites.
  • Templates updated (2.6.2): explore.php, media-single.php, messages.php, partials/chat-message.php, partials/dashboard-content.php, partials/shared-ui-frame.php.

Compat

  • Requires PHP 8.1 or newer (was 7.4).
  • Aligned with MediaVerse Pro 2.6.2. Install both updates together.

v2.6.1

October 7, 2026
New 11 Improve 22 Fix 12 Security 6 Dev 6 Compat 1

New

  • Explore offers a Trending sort and a filter for photos, videos or audio, ranked the same way as the app.
  • Lists load the next pages as you scroll; after three pages a Load More button keeps the site footer in reach.
  • The upload modal suggests matching tags as you type.
  • Member emails for a new follower and for a comment on their media, each switched on in Settings > General > Emails.
  • Media files are served straight by the web server under unguessable names when the server allows it, so pages no longer load WordPress for every image.
  • Uploads show how much of each file has been sent, and several videos or audio files can be uploaded together.
  • MP4 videos start playing sooner: the index is moved to the front on upload, and wp mvs faststart does the same for existing files.
  • Video captions show on every web player.
  • Followers is a privacy level members can choose: only people who follow them see the item.
  • Optional hand-off of protected downloads to the web server (nginx X-Accel-Redirect or Apache X-Sendfile), off until a check proves the server supports it.
  • An empty My Media library offers an Upload media button.

Improve

  • On a BuddyNext site, BuddyNext sends the member emails for MediaVerse activity, so a member gets one email per event.
  • A photo has the same alt text in the grid, the lightbox and newly loaded cards, using its AI description when there is one.
  • Album type is a choice of Standard album or Playlist instead of a free-text field.
  • WordPress's password and private options no longer show for albums and collections; who can see an album is set in Album Settings.
  • MediaVerse warns when MediaVerse Pro is older than 2.6.0.
  • Product links point to the new store pages.
  • When members cannot choose privacy, the upload modal, My Media and the upload page say who will see their uploads, and the setting's help text matches.
  • The lightbox Save button shows Saved while the item is in the member's Favorites.
  • The upload page shows the picked file and its thumbnail instead of the drop prompt.
  • My Media shows a member's media sooner on phones: a one-line profile row and no duplicate drag-and-drop box beside the upload button.
  • On a BuddyNext site, BuddyNext's profile editor is the one place to edit a profile.
  • Album privacy prompts name the photos they affect, and changing an album to a stricter privacy asks first.
  • The free licence is activated in the background, stops trying after a day when the store cannot be reached, and tells the owner why with a Retry button.
  • Members-only media can be reused from the member's own browser cache instead of being fetched again on every page.
  • Keyboard use, visible focus and screen-reader labels are improved across the upload block, My Media, the lightbox and Explore search.
  • The front-end accent colour follows the site's theme colour.
  • Explore and grid rows line up at every width, and Settings no longer scrolls sideways on tablets.
  • The admin Overview and the Moderation menu badge show one Needs review number that includes member reports.
  • Delete Demo Data has its own box that says what it removes, and setup wording names the community plugin the site runs.
  • A video that cannot play says so and offers the file instead of stalling silently.
  • Report in the lightbox opens the report form in place.
  • In My Media the active tab is always marked, and the browser Back and Forward buttons switch sections.

Fix

  • Editing a media item whose ID matches an album or collection now saves.
  • The plugin package no longer ships unused block files and the styles of the removed Lock Overlay.
  • The Settings saved confirmation shows at the top of the tab, and on phones it scrolls into view.
  • The plugin no longer contacts the licence server on every admin request.
  • Replacing a file removes the old version completely and keeps private items off public cloud storage.
  • Followers-only stories reach followers.
  • The Messages page is no longer treated as the blog home.
  • A refused upload keeps its message in the upload window, and visitors who try to react are offered a way to log in.
  • A custom storage driver stays selected when the Storage tab is saved.
  • The Integrations screen no longer promises Jetonomy attachments.
  • The bulk Set privacy bars offer the same levels as every other picker, and an unknown level is refused.
  • Confirmation dialogs in wp-admin show the action's own button label instead of a red Confirm for actions that delete nothing.

Security

  • Private albums and collections no longer appear to visitors or other members on the Albums and Collections pages or through WordPress's built-in REST routes.
  • The tag cloud and the public tag list show only tags used on public items.
  • Duplicate-upload checks compare only with the member's own uploads, and the notice no longer shows another item's ID.
  • Changing who can see an item gives its files new names whenever anyone loses access, so links shared earlier stop working.
  • The Media Grid block lists approved items only and never shows a file address for an item the viewer may not open.
  • A crafted MP4 upload can no longer make the server do unbounded work.

Dev

  • New PrivacyService::query_listable_spaces() for album and collection lists, TemplateHelpers::alt_text(), and an alt field on media REST responses.
  • The wp/v2 routes for mvs-albums, mvs-collections and mvs_tag are removed; use the mvs/v1 routes.
  • Templates updated to 2.6.1: explore.php, cpt-archive.php, partials/shared-ui-frame.php and partials/dashboard-content.php.
  • New filters mvs_storage_driver_choices and mvs_serve_offload, and action mvs_media_files_rotated.
  • GET /mvs/v1/media lists self and followers as scope values; wp mvs migrate-storage documents --include-non-public.
  • New standard docs/standards/preset-licence-activation.md describes the shared licence activation model.

Compat

  • Aligned with MediaVerse Pro 2.6.1. Install both updates together.

v2.6.0

September 30, 2026
New 10 Improve 14 Fix 23 Security 3 Dev 6 Compat 1

New

  • Save keeps an item; everything a member saves, and everything they favorited before, is in their private Favorites collection.
  • The lightbox shows previous and next whenever there is a neighbour, supports swipe on touch, shows the item title, and shows cover art behind audio.
  • Member emails for photo battle invites, shared documents and reviewed reports, each switched on in Settings > General > Emails.
  • Members turn activity emails off with one profile switch or the unsubscribe link, and the account deletion confirmation is always sent.
  • An optional storage limit per member, unlimited by default, with a per-member override on the user's profile.
  • A "Who can upload media" role picker on Settings > General, and upload controls hide for members who cannot upload.
  • A Mobile App settings tab for app sign-in, branding, terms and the abuse contact.
  • The member who reported something is notified when a moderator reviews it.
  • A Messages switch in Settings > Messages turns private messaging off everywhere, including integrations built on MediaVerse, and keeps existing conversations.
  • Albums have a settings box in wp-admin for who can see the album, its type and its cover, and collections have a matching privacy choice.

Improve

  • Settings show only while their switch is on, and developer settings leave the screen, about 130 controls down to about 55.
  • One Layout choice replaces the separate layout settings, and Grid Columns shows only for the grid layout.
  • Every list has one sort control, empty lists hide search and sort, and Explore tags sit on one scrolling row.
  • Upload details appear after a file is picked, the + button uploads in one tap, and untitled uploads get a readable title from the file name.
  • Logs moved under Tools, Integrations is a card on Overview, Reports is a Moderation tab, and the AI Flagged tab hides when it is not in use.
  • Old profile editor and document links open the member's My Media pages, and BuddyPress sites edit names on the community profile.
  • Albums and Collections each say what they hold, and settings use plain words throughout.
  • Large sites load faster with new indexes, batched reads and paginated lists.
  • "Who can send messages: Nobody" now says what it does: no new messages, while existing conversations stay readable.
  • On a private community, new uploads start as Members Only, and a site that becomes private later gets a one-time notice offering the switch.
  • Album and collection editors open in the classic editor, so their settings show without opening a hidden panel, and the unused Featured Image box is gone.
  • Admin empty states share one layout, and their icons show at the intended size.
  • The account deletion message and email say Log in, matching the rest of the plugin, and permission messages for settings and collections say edit.
  • Admin, app and member messages say log in for the site's own login.

Fix

  • Private items now look exactly like missing ones on pages, in the API and in album counts.
  • Saving a settings tab no longer resets values that were not on the screen.
  • Message times carry an explicit UTC value so every client shows the same clock.
  • The + button no longer covers the last controls on a page.
  • Search finds exact titles, and merging tags removes the old tag.
  • Usage history, space links and device tokens are stored in UTC on hosts whose database or site clock is not UTC, and trending and view retention compare in UTC.
  • Starting a conversation with yourself is refused instead of opening one of your other conversations.
  • Reporting a message that was unsent no longer logs a warning, and your own messages still cannot be reported.
  • Profile settings offer only the messaging choices the site allows, hide messaging and online status while Messages is off, and hide the activity-email switch when no email type is on.
  • The chat panel's "MediaVerse pages only" choice now includes the Explore Documents page.
  • Followers Only items are visible to the owner's followers, on the item page and in the owner's profile listing.
  • The media player block hides its Download link when downloads are off or the owner turned them off for that item, and counts the download.
  • MediaVerse blocks placed on an ordinary page now record views and downloads.
  • A leftover thumbnail address on a host the file is no longer served from is ignored, so migrated sites stop pointing grids at the old host.
  • Merging tags asks for confirmation in the styled dialog, and confirmed admin forms now submit.
  • Followers Only items appear for the owner's followers in lists, Explore and activity, not only on the item page.
  • A block hides media both ways in every list, and people who blocked you are no longer suggested.
  • A blocked member can still remove their own reaction, comment and favorite, and cannot edit a comment on the other member's item.
  • Removing a favorite no longer adds one when the item was not favorited.
  • A pinned album cover is kept when the album is saved from wp-admin.
  • The Moderation AI Flagged table scrolls inside its panel on phones instead of moving the page.
  • A block also hides the other member's items in albums, collections and notifications, and the notification badge counts the same rows the list shows.
  • Tags, Log Viewer and Reports empty states are centred on phones and say what to do next, and each tag row opens its Edit and Delete actions on a phone.

Security

  • Block style fields no longer accept CSS that could inject into the page.
  • Draft media is no longer returned to signed-out visitors through the API.
  • A stored media address that browsers and WordPress read as two different hosts is never trusted as storage.

Dev

  • Per-media access rules and the Lock Overlay block were removed; MediaVerse is not a membership plugin.
  • Removed settings keep their saved values and filters, so no site changes behaviour on update.
  • New filters mvs_show_favorite_button, mvs_default_media_title, mvs_email_subject, mvs_email_body, mvs_community_profile, mvs_profile_edit_redirect, mvs_show_demo_import and mvs_messaging_enabled, and new action mvs_report_resolved.
  • Uninstall keeps member data unless the owner opts in, and a full removal also deletes media tags, categories and licence options.
  • MediaRepository::downloads_allowed() is the one check for whether an item can be downloaded.
  • Admin buttons use --mvs-admin-touch-min (34px), and --mvs-touch-min is no longer redefined in wp-admin.

Compat

  • Aligned with MediaVerse Pro 2.6.0. Install both updates together.

v2.5.1

September 20, 2026
New 2 Improve 17 Fix 26 Security 7 Dev 4

New

  • The share as a story option appears on every upload screen, not only the Upload page.
  • Searching your own drive now matches document tags, so a file tagged in the admin can be found by that tag.

Improve

  • Strip EXIF Data removes only the location. Camera, lens, exposure and the copyright and credit fields stay on the photo.
  • Thumbnail Quality changes the image size grids actually serve. Medium is roughly a third of the bytes of Large, which remains the default.
  • Default Layout now applies to albums and collections, which its description has always named.
  • Page width and grid gap read design tokens, so one line in a child theme adjusts every MediaVerse surface together.
  • The confirmation dialog follows the site palette instead of a fixed one, in light and dark mode.
  • The AVIF setting states whether this server can encode AVIF instead of warning that it might not.
  • Setup wizard offers the documented 12 items per page rather than silently saving 24.
  • Camera metadata is no longer copied into the database on every upload, where nothing ever read it.
  • Album, collection, edit and upload dialogs are named for screen readers, keep keyboard focus inside while open and return it on close.
  • The upload drop zones open the file picker with Enter or Space.
  • Toasts are announced to screen readers, including a repeated message, and the dismiss button is a full-size touch target at the edge of the toast.
  • The chat header shows when someone was last active in the site's language.
  • The floating upload button steps aside while a dialog is open.
  • Set Cover stays a small label on touch screens with a full-size tap area, and dialog Save buttons use the primary style.
  • The bulk album action is labelled Add to album and applies the album's privacy and playlist rules, the same as adding one item.
  • Profile stats, dropdowns and the bulk privacy menu fit their space at phone width, and admin tab rows fit phone screens.
  • A grid of 12 items costs 12 database queries instead of 35. The per-item author, gallery-count and post-type reads are gone.

Fix

  • Playback events are recorded on single media pages. The player analytics tab was empty for anyone not using the block.
  • The monthly AI budget cap works. Saving the AI settings once was enough to disable it silently, and spending then showed as zero.
  • Turning on only AI moderation no longer also buys a description and a tag for every upload.
  • Replacing a photo's file strips its location, as a first upload always did.
  • Allow Downloads hides the download button on a document card too, and the description says which surfaces it covers.
  • Buttons, selects and inputs inherit the theme font instead of falling back to the browser default.
  • An uploader's avatar and name sit on one line in the grid, and a long name truncates instead of wrapping under it.
  • Privacy menus show their full label. The longest option was cut off mid-sentence.
  • The media count lines up with the followers and following buttons on a profile.
  • The share as a story checkbox renders as a checkbox rather than stretching across the row.
  • A toast appears above the chat panel instead of behind it.
  • Turning off Allow Users to Set Privacy also stops members changing privacy after upload, through editing, bulk actions, albums and the REST API.
  • Deleted documents are removed from disk, not only from the library.
  • Moving media to cloud storage no longer rewrites document links to files that were never uploaded.
  • Bulk delete in the media library leaves documents to the Documents screen instead of sending their files to the cloud provider.
  • Deleting an album no longer leaves its media pointing at it.
  • Messaging errors show as error toasts instead of success.
  • Delete confirmations on BuddyPress media tabs show their message.
  • A cloud upload that finishes after the member deleted the media no longer recreates the item as a broken, empty entry.
  • Bulk action controls and the dashboard tabs stay clickable where they stick under a theme's fixed header.
  • The album picker on a profile or Explore lists only albums you can add to. It offered everyone's albums, and choosing another member's failed.
  • Bulk Delete on Explore deletes the selected items. It reported a failure and deleted nothing.
  • Tag suggestions appear while typing, in the dashboard edit box and on a media page.
  • Download counts record every download. A download was dropped when the same visitor had only viewed the item in the last half hour.
  • Share counts count one share per visitor per half hour, as views and downloads already did.
  • A partial media request that asks for more than the file holds is answered with the file's real length.

Security

  • Making a public file private now deletes it from cloud storage. Its old CDN address kept working before.
  • A member can no longer change the privacy of another member's media by adding it to their own album.
  • Gallery data for a private or members-only item is no longer returned to people who cannot open the item. Anyone could read its title, description, owner, filename, tags and stats.
  • Block spacing and type settings are checked against the units CSS allows, so a contributor cannot put a script into a page through them.
  • An album you can open no longer shows you the items inside it that you cannot. A public album holding a private photo listed that photo's details to anyone.
  • A private community stays private however the address is typed. The gate that requires a login on a private community matched the address case-sensitively, so a request with different capitalisation was served without one.
  • Album and collection blocks and shortcodes show only the items the visitor may open. A public album or collection holding a private photo listed that photo to anyone, and a members-only collection rendered its contents to signed-out visitors.

Dev

  • Removed the usage counter setting. It never recorded anything, and the report it described could not be produced.
  • The page width token --mvs-content-width is documented in the developer guide.
  • New installs no longer create the unused comment_count column on the media index. Existing installs keep it; nothing reads it.
  • Every REST route, capability and render surface is now declared in audit/ and checked by a test, so a route that loses its permission check fails the build.

v2.5.0

September 14, 2026
New 3 Improve 7 Fix 12 Security 8 Dev 1 Compat 1

New

  • Documents preview inside the lightbox instead of only offering a download.
  • A collection can be public or members only, and the visibility gate now denies people it should.
  • The Documents profile tab carries a count badge.

Improve

  • The original grid draws true justified rows, so a row fills the width instead of stretching two tiles.
  • Layout names say what they draw. The free grid is Justified rows, not Masonry.
  • List layout renders as a list, and one setting decides both it and the grid.
  • Permissions are presented as role cards, so nothing scrolls off the right edge and nothing is hidden.
  • Every library panel opens the same way, toolbar first and then the create action.
  • User facing strings say MediaVerse rather than WPMediaVerse.
  • Rows that outlived their media are cleaned up on update, with no button to press.

Fix

  • Documents leave the All Media type filter and the media grid, and have their own menu.
  • Smart collections counted media the viewer cannot see, and profile counts advertised media they could not open.
  • The count above a listing now counts the rows the listing shows.
  • Paginated listings stop repeating and dropping rows.
  • Replacing a file no longer skips the upload quota.
  • A view is counted once with proper deduplication, instead of on every page load.
  • One sort applies to every layout and survives Load More, and the Views sort actually sorts.
  • Profile Load More no longer pulls other members media into the profile.
  • Settings links such as ?section=display open the section they name.
  • A refused upload now tells the member why, on every uploader.
  • Direction labels say what the sort actually does.
  • The Explore Feed block's grid layout engages instead of silently doing nothing.

Security

  • Blocking someone now stops them viewing your media, your profile listing and its counts.
  • Strangers can no longer react inside private conversations, or on messages that do not exist.
  • Moderation is enforced in the shared visibility gate.
  • Explore no longer showed media from members you had blocked on its first page.
  • A favourited private item no longer leaks its title.
  • Only public media, or your own, can be added to a collection.
  • A private photo keeps its own privacy when an album happens to share its ID.
  • An upload with an unknown privacy level is no longer published.

Dev

  • The 2.5.0 functional cert records 69 passes, 0 failures and 0 holes.

Compat

  • Aligned with MediaVerse Pro 2.5.0. Install both updates together.

v2.4.1

September 2, 2026
Fix 9 Security 1 Dev 1

Fix

  • A bulk actions bar with a Delete button, and a Loading indicator, no longer stay on screen on themes that do not reset the HTML hidden attribute. Both appeared permanently on the media library and every dashboard section.
  • An Apply button meant only for browsers without JavaScript no longer shows alongside the filters that already apply themselves.
  • Buttons in the chat panel header, the chat filter tabs, the grid selection control and Load More now meet the minimum tap target on a phone.
  • The sort and filter controls on Explore and My Media no longer stretch to the full width of the page on themes that style select fields that way.
  • The profile picture link in the My Media sidebar now meets the minimum tap target on a phone. The picture stays the same size; only the area you can tap grew.
  • Clicking Compete in the My Media sidebar now opens the Compete page instead of leaving the content area blank. Any section that lives on its own page navigates properly, so a section added later cannot bring the problem back.
  • A favorited document now shows a file icon in My Media instead of an empty tile, using the icon for its file type.
  • The fullscreen button in the lightbox now works on the Activity page. It rendered and looked live but did nothing, while working everywhere else.
  • Clicking a photo in the activity feed whose media has since been removed now opens its page and says so, instead of doing nothing at all.

Security

  • Stored media could be downloaded by anyone with the address on servers that ignore .htaccess, which nginx does. Site Health now checks this by asking the server instead of trusting the deny file, and prints the exact rule to add when it finds a problem. Media set to Only me, Members or Friends was affected, and so was anything made private after being shared, because the older address kept working.

Dev

  • Journey coverage now asserts what these fixes changed: stored files are fetched directly and must not be readable, a privacy change is checked to actually revoke an address already in circulation, tap targets are measured against the plugin's own token rather than a restated number, and a new journey runs the frontend on a theme the project does not ship.

v2.4.0

August 31, 2026
New 4 Improve 11 Fix 23 Security 1 Dev 9 Compat 1

New

  • Every section of My Media has its own address, so Albums, Documents and the rest can be linked, bookmarked and returned to.
  • Editing your profile is a section of My Media rather than a card above it, which gives the library back the space the card used.
  • Site owners can open a document from the Documents screen and correct its title, slug, description, tags and privacy.
  • A Use Documents permission decides which roles get a document library, so a site can offer photos to everyone and documents to staff. Every role has it to begin with, including roles added by other plugins, so nothing changes until you take it away.

Improve

  • The My Media sections are a grouped vertical rail with counts, which stays readable as the number of sections grows.
  • Document rows in the admin now offer Edit and View on site alongside Trash and Delete permanently, so the screen is no longer only destructive.
  • Settings fields now show the value they will actually use before you save. Unsaved fields rendered blank, and a setting that is on by default rendered as off, so the first Save could switch it off without anyone choosing to.
  • Document drives stay fast as they grow. A drive listing now reads its index directly instead of scanning and filtering: on a 30,000-document library one page examined 234 rows where it previously examined 8,032.
  • Panels, cards and controls no longer all draw the same outline. A text field used to be as visually loud as the panel containing it, and nesting produced three identical edges in a row, so screens read as boxes inside boxes. Containers now recede and only the things you can interact with keep a distinct edge.
  • Buttons, form fields, rows, the My Media tab strip and the sign-in link shown to logged-out visitors all meet a minimum tap target, so they are reachable on a phone.
  • Text, status badges and the active tag now meet a contrast floor the plugin sets itself instead of inheriting whatever the theme happened to supply.
  • The brand colour is now darkened before it is used as text, so dashboard rail links and the active tab label stay readable on a light background. Fills and borders keep the colour you configured, through the separate --mvs-primary-text token.
  • The privacy chip on a document now says when it is shared, so a file marked Private no longer reads as private-only while other people can open it.
  • Explore Documents colours its type chips the way My Drive does, so a PDF looks like a PDF wherever it is listed.
  • Sharing a document with an entire role has been removed. It did the same thing as setting the document's privacy to members only, in a word that did not say so, and it left the privacy badge unchanged. Share with a person, or set the privacy. Roles already shared with keep their access until the owner removes them.

Fix

  • Hovering a tag on Explore no longer makes the tag row jump. The hovered tag collapsed and the row reflowed, so the tags appeared to overlap and shake.
  • Tags that only documents carry are no longer offered on Explore Media, where they could never return anything. Filtering by a tag with no matching media now says so instead of claiming the site is empty.
  • The Instagram feed layout shows one card per upload again. A gallery of four photos was rendering as four separate posts and counted four times.
  • Add Media on an album and Save on a collection now follow the plugin's colours, so they stay readable in dark mode instead of falling back to the browser's own button styling.
  • View, reaction and comment counts on a thumbnail use real icons instead of emoji, so they take the theme's colour and no longer read out as picture characters to screen readers.
  • Empty states across Explore, the dashboard and the Pro feed layouts use real icons instead of emoji.
  • Log in to comment in the lightbox is aligned with everything else in the panel instead of sitting flush against the edge at the wrong size.
  • Type chips on a document drive stay readable in dark mode. The PDF chip in particular sat well under the contrast floor.
  • Deleting one photo from an update that carried several no longer removes the whole update from the feed or leaves a broken tile behind. The remaining photos and the member's own text stay exactly as they were.
  • Members whose profile picture comes from BuddyPress are no longer asked to upload one they already have.
  • Columns in the document list line up between rows. Each row previously sized its own columns, so the date and owner started at a different point on every line.
  • The upload dropzone uses a real icon instead of an emoji, so it takes the theme's colour and the size the plugin asks for rather than whatever the browser draws.
  • The comment box in the lightbox now has a name screen readers announce, instead of being read out as an unlabelled text field.
  • The Documents count beside your name counted every document on the site, including trashed ones, instead of the ones you own.
  • The Documents panel was gated on a variable that was never set, which opened the gate anyway and logged a PHP warning on every dashboard load.
  • Sections declared by an add-on linked to a page that did not exist, because section addresses were built from a fixed list rather than from the sections themselves.
  • My Media navigation items rendered as underlined links on some themes because the plugin's own styling overrode the rail it had just been given.
  • Muting a conversation for a set time kept the conversation out of your unread count after the mute had expired. The count now returns as soon as the timer runs out rather than waiting for the next message to arrive.
  • The My Media tab strip could not be reached on screens between 769 and 860 pixels wide, which covers most tablets in portrait.
  • At exactly 768 pixels the dashboard applied its phone layout and its tablet layout at the same time, so parts of the screen disagreed about which one they were on.
  • A section that lives on its own page, such as Compete, answered its My Media address with a blank column instead of taking you to the page itself. Old links and bookmarks now arrive where they should.
  • Viewing a member's media profile wrote two PHP warnings to the site error log on every visit. The pages looked correct, so the only sign was a growing log.
  • Every settings control, upload field and collection search box now has a real label, so screen readers announce them and clicking the label focuses the field.

Security

  • You can no longer give somebody more access to a document than you hold yourself. Sharing was authorised on drive access alone, so on a shared space a member with comment access could hand out edit access.

Dev

  • The video-poster path no longer shells out to FFmpeg, and neither plugin ships an exec-family call any more. A cover comes from the file's own embedded artwork or from a frame the browser captures at upload, so a security scanner has nothing to flag.
  • New filters mvs_document_row_actions and mvs_document_admin_panels let an add-on contribute row actions and panels to the document admin screens.
  • New filter mvs_user_can_use_documents decides per user whether the document library is available, so a membership plugin can put documents behind a paid tier without changing anyone's role.
  • drive_documents() accepts a status, count_documents() accepts an author and status, and DashboardSections::slugs() reports the declared section vocabulary.
  • Media moving to and from the trash now fires mvs_media_trashed and mvs_media_restored, so an integration can react without polling.
  • New filter mvs_has_custom_avatar reports whether a member has set their own avatar, independent of where the file is stored.
  • Documents and media can now be given different drive-access answers through mvs_document_drive_access and mvs_media_drive_access.
  • DashboardSections::flush() clears the resolved-section cache, so a section declared late in a request is no longer ignored.
  • The plugin's border tokens now have one job each: --mvs-border-light for structure, --mvs-border for controls, --mvs-border-strong for emphasis. A theme overriding these gets predictable results instead of changing every outline at once.

Compat

  • Aligned with MediaVerse Pro 2.4.0. Install both updates together.

v2.3.2

August 7, 2026
Fix 3 Dev 1 Compat 1

Fix

  • Media loads again for logged-in members when the host community requires login. The privacy gate was blocking the signed media route that every image and video loads through, and browsers cannot attach a login session to those requests, so all media returned 401 for members and guests alike.
  • Logged-out visitors are now redirected to the login page from every media page while the community is private. The pages previously rendered normally with working media links in the HTML.
  • Message reaction updates no longer resend every conversation message for hours on hosts whose database server is not set to UTC. New messages are now stamped with the same clock the polling reads.

Dev

  • New filters mvs_rest_gate_exempt_route_prefixes, mvs_community_gated_page and mvs_community_login_url let a host community or integration tune which routes and pages the privacy gate covers and where blocked visitors are sent.

Compat

  • Aligned with MediaVerse Pro 2.3.2. Install both updates together.

v2.3.1

August 5, 2026
New 3 Improve 5 Fix 12

New

  • The profile and group Media tabs now have title, caption, tags and privacy fields on upload, matching every other upload screen.
  • The lightbox now has an Edit button on your own media, so a title or caption can be added after uploading.
  • Album contents can now be read over the REST API. Asking for an album's items previously returned "not found", so apps and custom clients could not list an album.

Improve

  • Migrating media to or from cloud storage now repoints every stored variant URL, so nothing is left pointing at the previous location.
  • Grids of videos no longer download part of every video file just to draw a thumbnail.
  • Opening a photo full size now loads the 1024px version instead of the untouched original, so the first view is much faster. Sites that want the original back can switch Lightbox Image Size in Display settings.
  • Media grid rendering tightened.
  • Reaction buttons on a single media page now report their pressed state to screen readers, matching the lightbox.

Fix

  • Migrating media with WP-CLI now moves thumbnails and WebP/AVIF files too, not just the original. Previously every derived image was left behind and broke once the media pointed at the CDN. Sites migrated from the admin screen were never affected.
  • Backfilling cloud thumbnails now also uploads the full-size WebP and AVIF files, which repairs single media pages left broken by an earlier migration.
  • Uploading several files at once from the Upload page or the member dashboard now posts one activity item with all the images, instead of a separate feed entry per file. The upload modal already worked this way.
  • A multi-file upload from the member dashboard now keeps its description, so the grouped activity item is no longer posted without its caption.
  • The "Upload 0 file(s)" bar no longer appears on the member dashboard when no files are selected.
  • Video covers no longer render blank. Grids were forcing the browser to paint the frame at 0.1 seconds, which covered up the generated poster, so any video opening on a fade-in, title card or white intro showed an empty tile. Posters and the bundled fallback cover are now what you see.
  • Videos uploaded from the Upload page or the member dashboard now get a cover captured in the browser, so a site without ffmpeg installed no longer ends up with cover-less videos.
  • WebP and AVIF images no longer return 403 on sites that serve media from a CDN. Variant URLs now resolve through the same storage driver as the JPEG instead of a stale local path.
  • Admin media details links to a variant file now point at the file's real location, so they open instead of failing on CDN-backed sites.
  • A media item can no longer be saved without a title. The Save button stays disabled while the field is empty, and the API refuses a blank title instead of storing one.
  • The album and media-player blocks now explain themselves when they point at something missing, instead of rendering an empty space. Editors see the reason; visitors see nothing.
  • The storage panel no longer counts private media as being in the cloud. The three tiles now add up to the library total.

v2.3.0

August 2, 2026
New 3 Improve 4 Fix 11 Security 1 Dev 4 Compat 1

New

  • Archived conversations tab in chat. Archiving hides a conversation without deleting it, and it returns on its own when the other member writes to you again.
  • Members can sign in to a native app with their existing WordPress password; the site issues an Application Password behind the scenes.
  • App Sign-In setting on the General tab, so a site owner can turn that password exchange off without writing code. On by default.

Improve

  • Images uploaded from a phone are rotated to match their EXIF Orientation, on upload and on Replace file, so portrait shots stop appearing sideways.
  • Message-request counts are read from actual pending requests, so the badge no longer shows 0 while requests are waiting.
  • Chat messages are grouped by day with Today and Yesterday headings.
  • Plugin pages on block themes now render the site header, navigation and footer. Previously they appeared with no site chrome at all, which made a single media page feel disconnected from the site.

Fix

  • Media added to a private album now inherits the album's privacy instead of staying publicly visible.
  • Paginated Explore and member pages returned HTTP 404 while displaying the correct content, which kept them out of search results and stopped caches storing them.
  • Plugin pages no longer write a PHP deprecation notice to the debug log on every load under a block theme.
  • Tall portraits are no longer clipped in the lightbox.
  • The activity feed no longer distorts single images by cropping them to a fixed height.
  • Double-clicking Post no longer publishes the same comment twice.
  • Album counts ignore media that is in the trash.
  • Opening a conversation no longer sends the other member a "sent you a message" notification when no message was sent.
  • Demo data can be removed and re-imported. The importer previously refused to run once demo data had been deleted, and reported that refusal as a success.
  • The "Also share as a story" toggle no longer appears when MediaVerse Pro is inactive to handle it.
  • The album dropzone is visible on sites without BuddyPress, and album assets load correctly under client-side navigation.

Security

  • POST /auth/app-password is classified in the REST write gate.

Dev

  • New filters: mvs_apply_exif_orientation, mvs_album_inherit_privacy, mvs_comment_duplicate_window, mvs_dm_unarchive_on_activity. New action: mvs_media_privacy_clamped_by_album.
  • Removed 7 generated -rtl.css stylesheets and the rtlcss build step. Nothing loaded them, and serving them would double-flip right-to-left layouts, which already render correctly without them.
  • The moderation queue route is GET /moderation. The REST reference previously documented /moderation/queue, which returns 404.
  • Documentation now covers every REST route, hook, setting, shortcode, block and WP-CLI command. Four watermark hooks that never existed in the code were removed from the reference.

Compat

  • Paired with MediaVerse Pro 2.3.0. Install both updates together.

v2.2.1

July 24, 2026
Fix 8 Compat 1

Fix

  • Fatal error on activity feeds containing media imported from BuddyBoss. The feed crashed instead of rendering when an activity stored its attachment ids as a list.
  • Chat messages sometimes did not arrive until the member reloaded or switched threads. A message sent in the same second as the live-update cursor was skipped, and the chat never asked for it again.
  • Chat reactions on an already-delivered message sometimes never appeared for the other member until they reloaded the page. A reaction added in the same second as the live-update cursor was skipped, which lost roughly one reaction in five.
  • Deleting a conversation and messaging the same member again no longer leaves the other member with two chat threads. Delete now clears your copy of the history and the pair keeps a single conversation.
  • The conversation list shows a Photo, Video, or Audio placeholder when the newest message is a media attachment with no text, instead of a blank line.
  • Media action buttons on BuddyPress profile tabs and the My Media dashboard (Upload Media, Create Album, Edit Media, collections) are readable in dark mode with visible hover states.
  • Opening an album and clicking Share no longer shows a link icon next to the share icon.
  • The chat composer's attachment chip stayed light grey in dark mode.

Compat

  • Aligned with MediaVerse Pro 2.2.1. Install both updates together.

v2.2.0

July 23, 2026
New 1 Improve 3 Fix 4 Dev 1 Compat 1

New

  • Private-community gate: when the host community is private, the whole REST surface - Free and Pro namespaces - requires login, so nothing leaks to logged-out visitors. Developers: mvs_rest_require_auth, mvs_rest_can_access, mvs_rest_gated_route_prefixes.

Improve

  • Reactions added to an already-delivered message now appear for the other member in real time, without a page reload.
  • DM attachments accept media files only - image, video, and audio. Site owners can extend the list with the mvs_dm_allowed_file_types filter.
  • Chat shows an upload chip with a progress spinner for video and audio attachments, and Send waits until the upload finishes so a message can never go out without its file.

Fix

  • Follower and following counts on member profiles update immediately after Follow or Unfollow, on every layout.
  • The lightbox Favorite heart fills and turns red when favorited - the state toggled but the color was stuck.
  • The Settings saved notice can be dismissed, fades out on its own, and no longer follows you across settings sections.
  • Fatal error on BuddyBoss and older BuddyPress where bp_get_group_url() does not exist.

Dev

  • Messaging service accepts an optional backdated created_at on conversations and messages, so a migration can replay a source DM history with its original dates. Live behavior is unchanged when the argument is absent.

Compat

  • Aligned with MediaVerse Pro 2.2.0. Install both updates together.

v2.1.0

July 20, 2026
New 5 Improve 6 Fix 3 Dev 1 Compat 1

New

  • Members can delete their own account, with a confirmation step and a grace window they can cancel.
  • Report tools are on by default, and Free now has a moderation reports queue for site owners.
  • Site owners can suspend a member, and every member has a reachable blocked-members list.
  • GDPR personal-data export and erasure cover every member-bearing table through one privacy map.
  • A configurable Large image size, plus a WP-CLI command to regenerate thumbnails after changing it.

Improve

  • Every REST write between members passes through one block-and-suspension gate, so a blocked or suspended member cannot act on another.
  • Erasing a member keeps shared records - the reports filed about them, and conversations others are still in - and anonymises them instead of destroying the evidence or the thread.
  • The app config endpoint exposes the site's terms, privacy, and safety surface for the mobile app.
  • REST timestamps are normalised to UTC ISO-8601 across the API, and reactions now report their timestamp.
  • Direct messaging reaches app parity, with accessibility and SEO fixes on the messaging surface.
  • Automatic image compression is now off by default, so uploaded photos keep their original quality unless you turn it on; removing hidden GPS and camera data still happens automatically, with no quality loss.

Fix

  • A page whose template another plugin resolved to null no longer triggers a fatal error on the front end.
  • The direct-message typing indicator now works on sites without a persistent object cache.
  • Dark mode no longer renders body text near-black on dark surfaces, and media surfaces pair foreground with background.

Dev

  • Added mvs_conversation_participants.typing_until and a rank_scan index on mvs_media_index (Migrator v22).

Compat

  • Lockstep with MediaVerse Pro 2.1.0. Install and test both together.

v2.0.0

July 9, 2026
New 5 Improve 8 Fix 7 Dev 3 Compat 1

New

  • Admin-global watermark stamped into every uploaded image at upload time, with a single stamp owner and no replace-file bypass.
  • Create a new album directly from the upload modal.
  • Explore feed scope filters for "followers" and "self" across all layouts.
  • Viewer-aware URLs for the full original file via the new get_url_for_viewer() method.
  • Filterable avatar and profile-link seams for BuddyNext integration.

Improve

  • The whole frontend is now translation-ready: every Interactivity store, the shared-ui store, classic scripts, and the messaging module ship translatable strings, with a standard i18n delivery pipeline.
  • Album and collection privacy is enforced at the database level, so visitor pagination counts stay correct and private items never leak.
  • Protected media shows a login gate in the media slot instead of a 404, and keeps the correct 403 status.
  • Private collection single views and their REST responses are now gated; they previously leaked title and structure.
  • Moderation auto-action defaults to Flag instead of Delete.
  • Direct-message reactions can be removed and are correctly attributed.
  • App pages use the theme's no-sidebar page template for a cleaner full-width layout.
  • The admin sidebar label "Moderation" is now "Media Moderation" to avoid ambiguity.

Fix

  • Album and collection privacy-stub rows no longer appear as broken tiles on Explore, the media grid, or the media feed, and their index row is purged on delete.
  • Favorite, Save, Share, and Download buttons work in the media lightbox inside the BuddyPress activity stream.
  • Batch uploads to an album show a "View all photos" link in the activity entry.
  • BuddyPress notifications are cleaned up when media is deleted, and commenting on activity media no longer sends a duplicate notification.
  • GPS location data is stripped from photos without a lossy re-encode, preserving image quality and the colour profile.
  • Moderation actions no longer corrupt unrelated posts.
  • Watermark stamping fails closed instead of passing an unstamped image through on error.

Dev

  • New filter mvs_suppress_bp_comment_notification controls the BuddyPress comment-notification bridge.
  • MediaRepositoryInterface now declares get_url_for_viewer().
  • Removed the dead watermark preview and serve system and retired the admin access-rules UI; access-rule enforcement stays in the backend.

Compat

  • Lockstep with MediaVerse Pro 2.0.0. Install and test both together.

v1.9.0

July 5, 2026
New 11 Improve 4 Fix 7 Dev 2

New

  • Interests and personalized onboarding: members choose interests, get suggested people to follow, and see an interest-aware feed.
  • Per-conversation message search in direct messages.
  • Direct messages run through the same content moderation as posts and comments, so blocked words can't be planted in a DM.
  • Followers and following open in a modal from the profile counts, and member profiles gain an overflow menu with Report.
  • Manage blocked members from Edit Profile.
  • "Also share as a story" option in the upload flow.
  • Access-rules admin screen for gating media, with watermark display wired to the configured logo.
  • Native-app readiness across the mvs/v1 API: /app/config, interest endpoints, and viewer-aware fields.
  • Child themes can override MediaVerse templates; member partials, messages, and layout pages resolve theme-first.
  • AI moderation adds the Anthropic (Claude) provider, owner-configurable flag criteria, and custom flag terms beyond the built-in categories.
  • Masonry (original aspect ratio) is now the default Explore grid style, with an escape hatch back to the fixed grid.

Improve

  • Media links open the activity they were posted in by default. /media/{slug}/ redirects to that feed post, so media is not a separate public page; switch to dedicated media pages under Settings if you want a standalone page per item. Applies when BuddyNext is active.
  • Simplified upload modal: the type tabs are gone and the media type is auto-detected.
  • Non-public media now uses a viewer-aware thumbnail URL so previews respect visibility.
  • Gated images show the watermarked variant unblurred (the watermark is the protection); older imports self-heal through an automatic storage-path repair.

Fix

  • Media comments no longer leak onto unrelated posts or pages. They were stored against the post that shared the media's numeric ID, so a comment on an image could appear under a post with the same ID and inflate its comment count; existing comments are repaired automatically on update.
  • Competition pages (Compete, Battles, Challenges, Tournaments) now keep their MediaVerse styling when BuddyNext is active, instead of rendering unstyled.
  • Smart collections report their real item count in the list.
  • The media feed no longer returns empty when group covers are combined with trending or popular sorting.
  • AI moderation now runs when only auto-moderate is enabled (it was skipped before).
  • Theme-defense fixes for BuddyX and Reign (tab text, lightbox open) and Instagram action buttons hardened against theme button styles.
  • Cloud storage display and migration are more robust across admin operations.

Dev

  • Functional certification engine (wp mvs cert): boot smoke across every REST route plus dead-toggle oracles, gated at 100% coverage in CI.
  • Resolved all WP.org Plugin Check errors (30 to 0).

v1.8.0

June 23, 2026
New 7 Improve 6 Fix 24 Dev 8 Compat 1

New

  • Integrations page lists the Wbcom plugin family with product logos, store links, and a one-click companion installer.
  • REST POST /conversations accepts an as_request flag to open a conversation as a pending message request the recipient accepts or declines, so native apps can start message requests through mvs/v1 alone.
  • Members can block or unblock another member from their profile (Block toggle next to Follow and Message); blocking already hid that member's media from the feed and refused follows and direct messages, but there was previously no way to do it from the frontend.
  • AI moderation criteria: AI Flag Criteria checkboxes (nudity, violence, hate, self-harm, drugs, spam) let owners choose what the AI flags, plus a Custom Flag Terms field to add their own (e.g. weapons, gambling, political content). All categories enabled by default.
  • Claude (Anthropic) AI provider for image analysis, tagging, and moderation, alongside OpenAI, Google Vision, and AWS Rekognition.
  • "Delete permanently" auto-action for AI-flagged content removes the media and its files from local and cloud storage.
  • Masonry media grid: the Explore and media-grid feed shows every image at its native aspect ratio, packed with no cropping or gaps. Set Thumbnail Style to Square in Settings to keep uniform cropped tiles.

Improve

  • The Explore lightbox now opens in place instead of stacking over the previous screen.
  • Explore and the dashboard share one REST client with document-level event delegation, so Load More and other actions keep working after client-side navigation.
  • Dark mode now follows the active BuddyX/Reign theme toggle (data-bx-mode) and uses shared elevation tokens.
  • The AI settings tab shows only the selected provider's credentials (pick a provider, see its key and model); the per-call cost is plugin-managed instead of a manual field.
  • The masonry (original aspect ratio) grid is now the default Thumbnail Style; sites that prefer the uniform square crop can restore it in Settings > Display or with the mvs_default_thumbnail_style filter.
  • Grid tiles now serve the larger thumbnail so they stay sharp on HiDPI/retina screens; the smaller size visibly upscaled inside the bigger masonry tiles. Byte-conscious sites can drop back with the mvs_grid_thumb_size_key filter.

Fix

  • Selecting Watermark Type "Image" now applies the configured logo; the chosen attachment is passed to the watermark renderer instead of being dropped.
  • Restricted (gated) images now display the watermarked preview to visitors without access, instead of the plain blurred thumbnail that was shown before. Watermarking applies to images only, never video or audio.
  • Like, comment, bookmark, share, and other action buttons on the Instagram feed layout now run their action instead of opening the media lightbox.
  • The dashboard, create-modal, and chat tabs plus the lightbox reaction bar and action buttons keep their flat, readable styling (with visible labels) under themes that restyle plain buttons (BuddyX, Reign), instead of turning into filled colored buttons or invisible white-on-white text.
  • Direct-message attachments are scoped to their conversation so only participants can view them.
  • A new message is delivered again after both members had deleted the conversation.
  • The BuddyPress component-link cleanup no longer removes live navigation owned by another community plugin; it is off by default and never deletes a link that resolves to a real page.
  • Lightbox Share now works on non-HTTPS sites by falling back to a temporary-textarea copy.
  • The new-chat search no longer autofocuses on load, which was causing a page scroll-jump.
  • Media replace reprocesses variants, custom post type archives render, and settings defaults apply correctly.
  • Paginated Explore and member profile pages (page 2 and beyond) now return HTTP 200 instead of a soft 404, so search engines keep them indexed and page caches serve them.
  • Secondary buttons such as View Entries and Browse no longer borrow the active theme's primary button color, so the label stays readable instead of low-contrast text on a colored fill.
  • Smart collections with more than one rule of the same type now work. Two rules of the same kind (e.g. media type Image plus Video, or two tags) are matched with OR instead of AND, so the collection returns items and shows a real cover instead of resolving to zero and showing the placeholder; rules of different kinds still combine with AND.
  • The demo-data importer reuses an existing same-named collection instead of stacking duplicate copies when it is run more than once.
  • "Followers only" online-status visibility now hides presence from non-followers; previously the option behaved like "Everyone".
  • Video and audio play analytics record from the main media page, not only the media-player block (the player wires the Pro events endpoint when Pro is active).
  • Video tiles show the video's first frame instead of a generic placeholder on My Media, the explore-feed block, and the Pinterest/Flickr/Dribbble/Instagram layout grids (including Load More), matching the Explore grid. All client-side thumbnail renderers now follow the same video-first contract as the server.
  • The story viewer plays video and audio stories instead of showing a broken image; it renders the correct element per media type.
  • Media uploaded before a cloud service was connected now displays correctly: each file is served from where it actually lives instead of a fabricated CDN URL that returned 404. Switching between cloud services also keeps existing media readable until it is migrated.
  • Migrating storage moves a media's thumbnails and other variants alongside the original, and only flips the media to the new service once the full set has transferred, so thumbnails keep working after a Migrate all instead of 404ing on the new service.
  • "Free up server space" never deletes a local file whose cloud copy cannot be verified, preventing permanent loss of thumbnails that were not uploaded.
  • Storage paths left inconsistent by earlier versions are repaired automatically in the background after update: media imported from another plugin (which pointed at the original file in place) is copied into the library so it displays, and thumbnails left on the server after an older cloud migration are moved to the cloud. The repair runs in small batches, only touches affected media, and can be disabled with the mvs_storage_repair_enabled filter or run manually with wp mvs repair-storage.
  • The standalone /messages/ page now loads the conversation list; it enqueues the shared REST client and defers to BuddyNext when active.
  • Removed a dead webhook event (media.updated) and dead activity types that could never fire.

Dev

  • New mvs_apply_watermark_preview filter to skip the watermark for specific uploaders or roles; the default watermark position is now bottom-right.
  • New filters mvs_ai_moderation_terms (add AI flag terms in code) and mvs_ai_cost_per_call (per-provider cost estimate); the messaging transport resolves MessagingService via the container.
  • New UploadService::sideload_external_file() is the canonical way to bring an outside file into the library as a relative path; new mvs_storage_repair_enabled filter and wp mvs repair-storage command gate and run the storage-path repair.
  • New mvs_default_thumbnail_style filter and SettingsHelper::get_thumbnail_style() resolve the grid thumbnail style (escape hatch for the square-to-original default change); the original mode now renders as a CSS-column masonry.
  • New filters mvs_strip_dead_bp_links, mvs_dead_bp_link_patterns, mvs_dm_denial_message, and mvs_dm_denial_reason; MessagingService::find_or_create_conversation() gains a force_request option; WatermarkService::get_config() now exposes image_id for the Pro renderer.
  • The frontend was refactored onto a shared window.mvsRest client plus a router store and region partials for client-side navigation.
  • New mvs_collections_enabled filter lets a collections backend render a "Save to collection" control next to the favorite heart; the lightbox exposes the actions.lightboxOpenCollections action and dispatches an mvs-collections-click event carrying the current media id.
  • Inline styles in blocks, BuddyPress activity renderers, and frontend templates were moved to tokenized stylesheet classes, so theme and child-theme CSS can target them.

Compat

  • Pairs with MediaVerse Pro 1.8.0. Install both updates together.

v1.7.0

June 15, 2026
Improve 3 Fix 3 Dev 2 Compat 1

Improve

  • Media grid render cut from about 170 database queries per page to about 6 by prefetching media meta and access rules before the grid loop.
  • Grid and feed thumbnails now honor the configured thumbnail size, and the default is now medium instead of large.
  • Public media served from the local driver now sends a stable URL with Cache-Control public headers so browsers and CDNs can cache it; private media stays no-store.

Fix

  • Updating a media item's categories no longer silently drops them on a persistent object cache miss; the editable media REST route now declares its real fields.
  • Posterless videos now show the bundled default poster in grids and REST responses instead of a blank tile.
  • Private media now records an activity row so it appears in the owner's own activity, still privacy gated for everyone else.

Dev

  • The mvs_notification_created action now passes the rendered message and link, keeping BuddyNext and other listeners in sync.
  • New filters mvs_stable_public_urls, mvs_public_media_max_age, mvs_public_local_file_url, mvs_public_local_thumbnail_url. New Site Health test for missing video posters. The mvs_thumbnail_size default changes from large to medium.

Compat

  • Pairs with MediaVerse Pro 1.7.0. Install both updates together.

v1.6.0

June 6, 2026
New 8 Improve 5 Fix 14 Security 1 Dev 1 Compat 1

New

  • Group-conversation messaging engine with participant roles. Pro 1.6.0 builds group DMs on top of it.
  • Per-user messaging controls. Members choose who can DM them and whether their online status is visible, from the dashboard profile editor.
  • AI describe results now double as image alt text, with an admin review surface to accept or re-run AI output per media item.
  • WP-CLI command wp mvs backfill_ai runs AI describe and tagging on media uploaded before AI was enabled.
  • Upload review step. Dashboard and block uploads stage files for a title/description/tags details screen before the upload starts.
  • Friends privacy option available in the frontend upload, edit, and album privacy selects.
  • Media poster name on grids links to the uploader's profile.
  • Async storage-cleanup cycle reclaims local and cloud files when media is deleted, with retry and logging for failed deletes.

Improve

  • Uploads are limited to image, video, and audio. PDF and document uploads are rejected, including via the replace endpoint, and the custom MIME types UI is removed.
  • Media filenames are hashed by default so uploaded file names no longer leak original names.
  • Message delete is idempotent, returns precise HTTP codes, and removes the message from the thread and conversation preview immediately.
  • Notifications dropdown header stays visible while scrolling, and admin data tables scroll horizontally on mobile.
  • Report UI is Pro-only. The free plugin hides report buttons behind the mvs_reports_enabled filter.

Fix

  • Members-only and private media no longer leak to logged-out or unauthorized viewers across 8 render surfaces and 2 REST routes, including BuddyPress album tabs and activity.
  • Smart collections with multiple rules resolved to 0 items because query parameters were bound out of order. Tag and category rules also survive the edit modal now instead of being corrupted to names.
  • Comment @mentions fire notifications, and duplicate reaction, DM, and mention notifications are gone.
  • Deleting media, albums, collections, or users cleans up every dependent row, including GDPR erasure paths.
  • Explore Load More renders all media types with thumbnails, and the Load More stack is registered globally for shortcode and block pages.
  • Single media pages no longer double-count video and audio views.
  • Permissions matrix covers all roles, survives updates, and can no longer lock out administrators.
  • Allowed File Types settings persist when a type is unchecked, webhook event selection cannot silently reset, and the webhook HMAC secret survives an empty save.
  • Activity composer no longer collides with the options row, and activity-form uploads surface errors and accept media tags.
  • Video poster metadata no longer writes the video URL as a thumbnail, and posters render at the large size.
  • Album creation slug collisions no longer drop privacy and album type.
  • Page creation on activation never edits site navigation menus.
  • Missing thumbnail files no longer break media grids. When a resized variant is absent on disk, the original image is served instead of an error.
  • Public media now displays correctly on page-cached hosts. Expired-but-authentic image URLs in cached HTML still serve public files; non-public media keeps the strict expiry window. Disable via the mvs_serve_expired_public_urls filter.

Security

  • PDF-upload bypass through the media replace endpoint is closed, and replace honors the same type allowlist as upload.

Dev

  • New filters mvs_collection_media_ids, mvs_reports_enabled, mvs_media_alt_text, mvs_hold_uploads_for_moderation, mvs_profile_privacy_levels, and mvs_serve_expired_public_urls; new actions mvs_album_deleted and mvs_collection_deleted; mvs_media_deleted now fires once from the delete cascade.

Compat

  • Aligned with MediaVerse Pro 1.6.0. Install both updates together.

v1.5.0

May 28, 2026
Improve 3 Fix 3 Dev 3 Compat 1

Improve

  • One unified read path for media URLs. Theme overrides and shortcode users can call the same Core MediaUrl helper that templates use, so custom integrations no longer have to know about signed URL plumbing.
  • Upload pipeline produces one consistent file layout for every media type. Image variants, video posters, audio cover art, and WebP and AVIF siblings all flow through the same writer so adding a new format in the future is one extension point, not five.
  • WebP and AVIF sibling generation collapsed to one shared publisher. Removes a duplicate-write footgun where the WebP and AVIF paths could disagree about the destination directory.

Fix

  • Non-public uploads no longer 403 their own thumbnails after upload. Members, Friends, Only Me, Group, and Custom-access media now serve correctly to the owner and to viewers granted access, on local storage and on every cloud driver.
  • Private uploads now leave zero public footprint. No BuddyPress activity entry is created for private media, the profile activity tab does not surface broken thumbnail cards, the profile media tab badge no longer counts private items for other viewers, and the explore grid stays clean. Other non-public privacy levels (Members, Friends, Group, Custom) keep their audience-discovery semantics.
  • Video poster thumbnails for items uploaded before 1.5.0 are healed on update. Database migration v15 re-derives the poster path meta from the on-disk file location for video and audio rows so cards, lightbox, and feed previews render the correct still frame.

Dev

  • New services MediaUrl, VariantSpec, StorageRouter, MediaVariantWriter, PosterService consolidate the upload and read pipeline. Existing methods kept as shims for at least two releases per the deprecation policy.
  • Database migration to version 15 backfills thumb_size_path meta for video and audio rows where pre-1.5.0 uploads recorded the wrong subdirectory. Idempotent. Includes a posters fallback probe for sites whose URL meta also diverged.
  • New filter mvs_broadcast_thumbnail_ttl controls the TTL for thumbnails embedded in long-lived surfaces like notification emails and RSS. Defaults to one hour. Filter target for sites that cache at the CDN for longer.

Compat

  • Paired with MediaVerse Pro 1.5.0. Install both updates together when running Pro.

v1.4.0

May 1, 2026
New 3 Improve 4 Fix 5 Dev 2 Compat 1

New

  • Cloudflare R2 and DigitalOcean Spaces are now selectable cloud storage drivers from Settings, Storage. The drivers ship in MediaVerse Pro; the Storage Driver setting lists them on every install.
  • Driver-agnostic media URLs. Each item now resolves its display URL from the currently active storage driver every time the page renders, so switching between cloud providers (or back to local) no longer breaks images across the site. Path information is the source of truth; URLs are computed at read time.
  • WP-CLI command wp mvs relocalize-private heals legacy non-public media whose URL meta still points at an old cloud bucket. Idempotent and safe to re-run.

Improve

  • Private and restricted media always stays on your server and is never uploaded to cloud storage. Only public media is eligible for the cloud, so private uploads cannot reach a public bucket.
  • Public media stored on the cloud is served directly from its CDN automatically, with no extra display setting to enable.
  • Explore, profile, and feed listings now build their database queries through one shared, centrally tested layer, so privacy and gallery-grouping rules behave identically across every view.
  • BuddyPress activity uploads now capture and send a real first-frame thumbnail for videos. Safari and Bing show the actual first frame instead of a blank player when a video has no embedded cover.

Fix

  • BuddyPress activity composer privacy dropdown now actually applies. Picking Members, Friends, or Only Me no longer leaves the activity visible to logged-out viewers on the sitewide stream.
  • Non-public uploads no longer 403 their own thumbnails. Members, Friends, Only Me, and Group uploads now serve correctly through the gated endpoint regardless of which storage driver is active.
  • Bulk album uploads from the BuddyPress profile and group tabs now produce one grouped activity entry per batch instead of one per file. Matches the existing dashboard album upload behavior.
  • Enabling a cloud storage service no longer breaks existing media. Each item displays from where its file actually lives instead of being repointed at the newly selected service.
  • Videos in the BuddyPress activity feed always show a poster image. Cover-less videos previously rendered a blank player in Safari and Bing.

Dev

  • Database migration to version 14 backfills driver-agnostic path meta for every existing media item. Idempotent; safe on partial reruns.
  • New filters mvs_serve_public_cloud_direct, mvs_public_cloud_thumbnail_url, and mvs_public_cloud_file_url to control or rewrite direct cloud URLs. New mvs_explore_query_args filter to adjust the Explore and profile feed query. Integration event hooks for gamification, activity, and notification consumers are documented in the developer guide.

Compat

  • Paired with MediaVerse Pro 1.4.0. Install both updates together when running Pro.

v1.3.0

May 17, 2026
New 16 Improve 3 Fix 8 Dev 2 Compat 1

New

  • Automatic image optimization on every upload. JPEGs, PNGs, and GIFs are re-encoded for smaller file size with hidden camera data stripped. Most uploads drop 10 to 30 percent without any visible quality change.
  • WebP image format support. Every uploaded image gets a second copy in WebP, around 25 to 35 percent smaller than JPEG. Modern browsers automatically use the smaller file; older browsers keep using the original.
  • AVIF image format support for even smaller files. AVIF is roughly 30 percent smaller than WebP again. Opt in from Settings, Storage tab. Default off because AVIF encoding takes longer than WebP.
  • Frontend serves WebP across every surface. Explore grid, BuddyPress activity feed, dashboard cards, single-media view, and the lightbox all swap in WebP automatically when the visitor's browser supports it.
  • Private images now also serve WebP and AVIF. Access-rule-protected media gets the same modern-format speed boost as public media.
  • Cloud storage migration tools. Move existing local media to S3 or BunnyCDN in batches, then clean up the local copies after verification. New WP-CLI command "wp mvs migrate-storage --from=local --to=bunnycdn" handles the bulk move with idempotent resume support.
  • Direct CDN URLs for public media. New setting on the Storage tab (default off): when enabled on a cloud-storage install, public images load directly from your CDN edge instead of being proxied through WordPress. Cuts WordPress out of the hot path for image requests.
  • WP-CLI commands to optimize existing media. Run "wp mvs optimize 123" on one item or "wp mvs optimize-bulk" across the whole library. Resume-safe if interrupted.
  • New Optimization column on the All Media admin listing. Shows percent saved per file at a glance. Row actions Optimize and Details added. The Details page shows everything stored about a file with inline buttons to re-optimize, repair thumbnails, or move to trash.
  • Filename strategy setting. New uploads can be saved with hashed filenames or sanitized original names. Hashed mode keeps the user-facing filename visible in downloads and the REST API; only the on-disk file uses the hash. Existing files are never renamed.
  • Faster search at scale. The Explore search now uses a FULLTEXT index for 3+ character queries, returning results across 100,000+ media items in milliseconds instead of seconds. Sites that cannot enable FULLTEXT continue working on the existing LIKE search.
  • Automatic view-event cleanup. View tracking events older than 90 days are pruned daily. Window is configurable per site (0 to disable, max 730 days). Keeps the database lean on long-running sites.
  • Default video poster for videos without an embedded cover image. Previously these showed a black frame. Now they render a clean placeholder.
  • Audio card design. Audio with embedded cover art shows the cover; audio without art shows a unique waveform image generated from the file id.
  • Compatibility with EWWW, Imagify, Smush, and ShortPixel image optimizers through a single extension point. If you already use one of these, leave it active; it runs alongside the built-in optimization.
  • Opt-in usage telemetry to help us prioritize features. Default off. No personal data, file names, or content ever leaves your site. Counters stay local.

Improve

  • Explore feed shows newest media first. Albums no longer pin to the top of page one because they are static containers. Album pages remain accessible by their permalinks.
  • Per-request media cache for activity feeds and dashboards. Each media item is loaded from the database once per page even when rendered many times. Drops query count on busy pages.
  • Production stability commitments documented for site owners. The plugin will deprecate features through proper notice periods of at least two major versions instead of removing them without warning.

Fix

  • Security: BuddyPress activity privacy now follows media privacy. Previously a non-public media uploaded to a BP activity would leak the activity card (composer text, timestamp, author) to the public stream. Activity visibility is now derived from the strictest of the media and album privacy settings.
  • Security: REST per-page hardening across all list endpoints. Callers can no longer request unbounded result sets to slow the site. Maximum is filterable for trusted environments.
  • Cloud storage uploads now generate thumbnails reliably. Some cloud-driver uploads previously failed to produce thumbnails silently.
  • Image optimization never makes a file larger. If the optimized version is bigger than the source, the original is kept.
  • Animated GIFs stay animated. The optimization pass now detects animated GIFs and skips them so they aren't flattened to their first frame.
  • Broken thumbnail icons no longer appear for videos and audio when no poster image is available. Videos fall back to their first frame; audio falls back to the music icon.
  • Most MP4 video uploads now generate proper poster images on managed WordPress hosts. Previously some uploads silently fell back to a low-quality thumbnail because of how managed hosting environments configure server binaries.
  • Cleared all PHP 8.4 and PHP 8.5 compatibility warnings. The plugin runs cleanly on the latest PHP versions.

Dev

  • New action hook mvs_media_privacy_changed fires when a media's privacy column is updated. Useful for activity adapters and audit logs.
  • New StorageDriverInterface::download($path, $local_dest) method on Local, S3, and BunnyCDN drivers. Third-party storage drivers must implement it.

Compat

  • Paired with MediaVerse Pro 1.3.0. Install both updates together when running Pro.

v1.2.0

New 23 Fix 16

New

  • Member Photos block + shortcode (`mvs/member-photos`, `[mvs_member_photos]`) - auto-detects whose photos to show: explicit `userId` → BP displayed user → post author → current user. Drop it into a BP profile, an author template, or a regular page and it just works.
  • PDF Viewer block + shortcode (`mvs/pdf-viewer`, `[mvs_pdf_viewer]`) - embeds PDFs uploaded to MediaVerse using the browser's native PDF viewer (`#view=FitH`); inspector exposes height (200-1400 px) and toolbar toggle. Five distinct empty states (no id / not found / not a PDF / no permission / asset missing) - never a blank rectangle.
  • More sort options on Media Grid - added "Most Popular", "Most Viewed", "Most Reactions", and "Random". Asc/Desc direction toggle exposed in the inspector (hidden when sort = Random). New `userId` attribute on `mvs/media-grid` and `user_id` attr on `[mvs_gallery]` filter to one author.
  • Search autocomplete on the Explore feed - type two or more characters and a top-8 title-match dropdown opens (debounced 250 ms). Full keyboard support: ArrowDown / ArrowUp / Enter / ESC. ARIA combobox + listbox semantics so screen readers announce matches as you type.
  • Lightbox Download button - toolbar button next to Share + Open. Counts each download in `mvs_media_stats.downloads`; rate-limited at 30/min/user via the central `RateLimiter`. New `POST /mvs/v1/media/{id}/download` REST endpoint.
  • Per-media Edit modal - click the Edit button on your own dashboard cards to change title, description, privacy, and allow-download per-media. Save → live update without reload. `PUT /mvs/v1/media/{id}` now accepts `allow_download` (boolean) and `prepare_item_for_response` emits it (defaults `true` when meta absent).
  • Member Photos card - redesigned hero card with avatar + display name + handle + bio + stats (photos / followers / following) + View Profile + Follow/Following toggle. Container-query responsive: switches to vertical stack at <520 px container width (so it fits a sidebar widget) and remains compact at 320 px.
  • "Update URL slug" opt-in checkbox - present in the per-media Edit modal AND on `/media/{slug}/` inline-edit form, sitting beside Privacy on the same row. Off by default - title edits leave the URL stable. Tick to regenerate the slug from the new title; if you're currently viewing the old URL, the page redirects to the new one automatically (no 404 on reload).
  • Open Graph + Twitter Card meta on every `/media/{slug}/` page - `og:title` / `og:type` / `og:url` / `og:site_name` / `og:description` / `og:image` / `og:image:alt` plus `twitter:card=summary_large_image` + `twitter:title/description/image`. Paste a media URL into Slack / Twitter / LinkedIn / Discord and it unfurls correctly.
  • Popular tag pills in the upload modal - top-8 most-used tags surface as click-to-add chips below the tags input. Clicking a pill appends to the comma-separated input and de-dupes silently.
  • Upload modal polish - preview tiles show filename + per-tile (×) remove button; audio files get an audio-fallback icon (no broken-image SVG).
  • Bulk Actions on All Media - multi-select header/footer checkboxes + a Bulk Actions toolbar. Action menu is context-aware to the active filter: in the Trash filter → Restore + Delete permanently; otherwise → Move to Trash. Capability + `wp_nonce_field('mvs_bulk_media')` gates on submit; success notice with count + action.
  • Chat panel visibility setting under Direct Messages - pick where the floating chat panel renders: Everywhere (default) / MediaVerse pages only / BuddyPress pages only / Disabled. New `mvs_should_render_chat_panel` filter wraps the resolved decision so themes / add-ons can fine-tune by URL pattern.
  • Global "Allow downloads" toggle under Media Display - single switch that hides the new lightbox Download button site-wide AND makes the `record_download` REST endpoint refuse with 403. Per-media `allow_download` meta still gates further when the global is on.
  • 6-reaction accessibility in the lightbox - Like / Love / Haha / Wow / Sad / Angry each carry sentence-form `aria-label` and `aria-pressed` toggles; the emoji span is `aria-hidden`; the wrapper carries `role="group" aria-label="Reactions"`. Toolbar buttons (Favorite / Share / Download / Open / Report) all gain `aria-label`. `:focus-visible` outline on `.mvs-lightbox-action / -close / -nav` so keyboard nav is visible.
  • Block render forms a11y - explore-feed search input, media-upload file input + privacy select + title/description/tags inputs all gain `aria-label` (placeholder ≠ label per WCAG).
  • Search-mode toggle a11y - Media / People toggle on `templates/explore.php` gets `role="tablist"` + `role="tab"` + `aria-selected` semantics; search input gets a screen-reader label.
  • BuddyPress notification dedup - restored `NotificationIntegration` (mirrors `mvs_notification_created` to BP's `bp_notifications_add_notification`) and added a `function_exists('buddypress')` guard around the dashboard's `.mvs-notification-bell` markup so BP-active sites render notifications in the BP nav bell only - never twice.
  • `Core\SettingsHelper` - canonical static accessor for paired-plugin settings reads. First slot covers the page-id family (`dashboard` / `explore` / `upload`) plus `mvs_thumbnail_size` and `mvs_openai_api_key`. Pro and themes must use this instead of direct `get_option('mvs_page_*')` reads (Free invariant A4).
  • Hook signatures now carry full type-annotated arg shapes in `audit/manifest.json` (`args_signature[]` on 14 of 22 hooks); enables Pro arch-check A11 to detect cross-plugin contract drift.
  • `SettingsContractTest` enforces register_setting whitelist alignment - settings registration drift is now caught at unit-test time rather than at customer save-time.
  • Block standard alignment (Phase 7) - Free's 9 registered Gutenberg blocks now share the same Spacing / Border / Shadow / Visibility inspector panels as Pro and wbcom-essential. `WPMediaVerse\Blocks\StandardAttributes` injects the 20 standard layout attrs via the `block_type_metadata` filter; `WPMediaVerse\Blocks\MVS_CSS` collects per-instance scoped CSS keyed off `mvs-block-{uniqueId}` and dumps it on `wp_footer`. Pro's `src/shared/` tree (17 files) ported with text-domain swaps.
  • `BaseBPTabIntegration` extracted (Phase 5 P2.4) from `ProfileTabIntegration` + `GroupTabIntegration` - a single bug fix on either BP tab now propagates to both. Net delta -109 lines.

Fix

  • Lightbox Share no longer falls back to a `window.prompt()` "Copy this link:" popup when neither `navigator.share` nor clipboard write is available - instead a toast error renders. `mvs_media_stats.shares` now also increments via the new `POST /mvs/v1/media/{id}/share` REST endpoint.
  • Lightbox toolbar fits 5 actions on one row - the previous layout used inline-flex + per-button padding 24 px + `margin-left: auto` on Report which overflowed the 380 px sidebar (~414 px content) and produced a horizontal scrollbar. Now `flex: 1` + `space-between` distributes evenly; the toolbar always fits at desktop AND on mobile. Below 768 px the lightbox stacks vertically (image on top, sidebar full-width below) and below 380 px labels collapse to icons-only.
  • Moderation webhooks now fire reliably. Two listeners (`WebhookService::on_media_moderated` + `CacheService::on_moderation_change`) were registered against `mvs_media_moderated`, but the firer in `ModerationService::set_status()` uses `mvs_moderation_changed` (the established hook name; `LoggerService` already used it). Result: customers using outbound webhooks for moderation approve/reject events were getting zero events delivered, and the moderation-status cache stayed stale. Both listeners renamed to the correct hook name. Affected since: 1.0.0.
  • `mvs_reaction_removed` action now fires when a user un-reacts. The action existed conceptually (cache invalidation listener was registered) but `ReactionService::remove()` never fired it, so the media-stat cache stayed warm with the old reaction count after an un-react. The reaction count itself was correct (re-read from DB), but cached aggregates lagged.
  • `mvs_share_recorded` action now fires from the new `record_share` REST endpoint so the cache invalidation listener clears the media-stat row. Without this, share counts in feed cards lagged behind reality until the cache TTL expired.
  • Search autocomplete on the Explore feed now aborts in-flight requests when a newer keystroke arrives. Previously, typing fast (e.g. "ne" then "new" within 250 ms) could leave the slower "ne" results visible if its response landed second - a classic race condition. Each keystroke now spawns an `AbortController`-equipped fetch and supersedes any in-flight request.
  • Title edit no longer changes the URL slug. Editing a media title and saving used to silently regenerate the slug - meaning the URL the user just had in their address bar 404'd on reload, and any inbound links / social shares / search-engine cache pointing at the old URL stopped working. Slug now stays stable; admins can opt into a slug change explicitly via the new "Update URL slug" checkbox in the Edit modal and on `/media/{slug}/`.
  • BuddyPress activity no longer renders the same image twice. A Phase 8 "linkage table" code path was appending its rendered grid even when the activity content already contained the inline grid markup - so every composer-posted activity rendered each image twice on the activity permalink page. The render filter now uses inline content as the authoritative copy and only falls back to the linkage path when content is empty.
  • Author profile URLs no longer leak BuddyPress mention HTML. Five sites (Instagram feed cards, leaderboard, dashboard "View Profile" button, follower notifications, and a sibling Instagram card template) built `/media/@user/` URLs inline. When BuddyPress's `bp_activity_at_name_filter` ran on the surrounding output, the `@user` substring inside the URL was rewritten into a full BP mention `<a class='bp-suggestions-mention' …>@user</a>` - corrupting the URL with literal HTML and producing dead links. All five now route through the canonical `TemplateHelpers::get_user_profile_url()` which resolves to the BuddyPress profile when BP is active and the plugin's `/media/@user/` route otherwise.
  • Lightbox `Favorite` button is no longer rendered twice in the action toolbar. Earlier 1.2.0 builds rendered a duplicate Favorite button on certain page contexts. Single button now, with the label flipping between "Favorite" and "Favorited" via the `aria-pressed` state.
  • Demo data importer now runs end-to-end on every install. The `seed-demo-data.php` script (and its sibling `populate-showcase.php` + `cleanup-demo-data.php`) called `MediaRepository::*` static-style; the repository is a container service with instance methods only, so every demo seed attempt fataled with `cannot be called statically`. All 14 call sites swept to the canonical container-resolved instance API. Running the demo seeder now produces 50 media items + 5 demo users + 5 albums + 159 reactions + 30 comments + 40 favorites + 20 follows + 3 reports cleanly.
  • `AlbumService::create()` added - the service had `add_items` / `get_items` / `set_cover` etc. but no top-level `create()` method, so any non-REST caller (seeder, future WP-CLI command, theme code) had to repeat the `wp_insert_post('mvs_album')` + privacy + group_id + categories meta writes inline. Centralised. The `AlbumController::create_item` REST endpoint now delegates to it.
  • `PUT /media/{id}` `allow_download` flag now accepts every body encoding. The flag was previously read only from the JSON body via `$request->get_json_params()` - fine for JS apiFetch (the dominant path), but form-encoded clients and internal `$request->set_param()` calls silently dropped the flag. Now read via `$request->get_param()` which covers all sources uniformly.
  • `mvs_should_render_chat_panel` filter passes the resolved visibility setting as a second argument, so callbacks can scope their override by the admin's chosen mode (`everywhere` / `mvs_pages` / `bp_pages`). Backward-compatible: existing 1-arg callbacks keep working; the new arg is just ignored if not declared.
  • Stats block fits on narrow phones. The `mvs/media-stats` block grid used a 180 px minimum track which pushed the block 11 px past its container on viewports below ~390 px. Switched to `minmax(min(180px, 100%), 1fr)` so the minimum collapses gracefully; below 480 px cards stack one per row.
  • DM access dropdown (Settings → Social → "Who can send me direct messages") no longer silently reverts "Nobody" or "Mutual followers only" to "Everyone" on save. Same root cause silently flipped the "Show online status" preference. The save path looked successful (admin notice "Settings saved." appeared) but the option stored a different value than the dropdown showed. After upgrading to 1.2.0, please reopen Settings → Social and confirm your preferred DM access and online-status visibility - the dropdown now reflects the saved value byte-for-byte. Affected since: 1.1.0. Commit: `d986525`.

v1.1.3

April 29, 2026
New 2 Improve 1 Fix 17 Security 1 Dev 3

New

  • Video uploads now get a real poster thumbnail extracted from the file's embedded cover atom via WP core's getID3 - no ffmpeg required. Works for phone-shot MP4/MOV; screen recordings without an embedded cover fall through to a native `<video preload="metadata">` preview in the grid so the browser paints the first frame - matching what the single media view already does
  • Thumbnail pipeline centralized in `UploadService::generate_thumbnails()` (now public). Pro CLI importers and MigrationPage delegate here via `Plugin::free_service('upload')`, so Free uploads and Pro imports share identical fallback, sizing, and logging. New `mvs_thumbnail_sizes` filter lets themes/add-ons tune sizes without patching

Improve

  • All close, dismiss, and navigation icons in the lightbox, upload modal, and toast notifications replaced with proper Lucide icons (rounded caps, correct paths). Lightbox CSS consolidated into frontend.css as a single source of truth

Fix

  • Lightbox now opens the original full-size image instead of the low-res grid thumbnail. New Display setting "Lightbox Image Size" lets admins pick Original / Large / Medium / Auto (defaults to Original)
  • Lightbox opens full-viewport in Facebook-style layout - image fills the left panel, social sidebar on the right; close button (X) correctly positioned and visible over the image panel
  • Hardcoded emoji characters (play triangle, music note) replaced with inline Lucide SVGs across grids, dashboard, BP activity audio cards, and BP upload preview. WordPress was auto-converting the Unicode chars to emoji images, which looked different across browsers and didn't match the plugin's Lucide-based design
  • Video, audio, and generic placeholders now share a unified frame (aspect-ratio + gradient background) so grids never collapse based on media type - any mix of image/video/audio uploads renders with consistent cell sizing
  • BuddyPress activity stream thumbnails render reliably - defensive `file_url` fallback in `MediaDisplayHelper` when custom `thumb_*` meta is missing, and a path-5 recovery in `ActivityContentIntegration` that rebuilds the grid from `_mvs_media_ids` meta when an activity's saved content lost its markup
  • Delete action no longer leaks onto public grids. The per-item trash icon now only renders on BuddyPress profile and group media tabs (where `show_actions` is explicitly opted in); Explore, Albums, and Collections never show it
  • Settings sidebar brand icon is now clearly visible - the eyebrow-text rule was cascading gray onto the logo SVG, making it blend into the red gradient
  • Dead meta-key reads cleaned up. `ActivityContentIntegration` and Pro's `TranscriptionService` were looking up `attachment_id` meta (dropped in migration v8) - both now use `wp_attachment_id` which importers actually write
  • Every upload path now guarantees all three thumbnail sizes (`thumb_large`, `thumb_medium`, `thumb_thumb`). WP's `multi_resize()` skips sizes that would upscale the source, so small images (under 1024px) used to leave `thumb_large` empty - now the pipeline backfills any missing size with `file_url` (the original IS the largest version)
  • Demo data importer (`seed-demo-data.php` / Overview admin button) now routes through `UploadService::handle()` instead of inserting rows directly, so demo content exercises the full real-upload pipeline - including thumbnail generation, video poster extraction, `mvs_media_uploaded` hook, and LoggerService
  • Silent failures in the thumbnail pipeline are now logged to `mvs_error_log` via `LoggerService` - missing source file, GD/Imagick unavailable, and `multi_resize()` returning empty each write a warning with the media ID for diagnostics
  • Missing "Upload Page" setting added to Settings → General → Pages. The option was read in 3 places but had no admin UI, so custom [mvs_upload] shortcode pages could not be assigned
  • Album cover selection now persists - picking a cover from the album edit page writes to the post meta instead of silently no-op'ing, and the album preview shows the chosen image
  • Albums without an explicitly pinned cover fall back to the first image in the album so they never render with a broken/placeholder cover
  • Lightbox "Favorite" label no longer ships with a duplicated heart emoji prefix - the Lucide icon renders alone as intended
  • 5 free bug cards carried over from 1.1.2 - grid columns=5 rendering, stats page filter date ranges, tag cloud count accuracy, lightbox Favorite visibility for signed-in users, lightbox Share double-icon
  • Thumbnails no longer return 403 errors for logged-in users; album cover thumbnails go through signed URL service for consistent access control

Security

  • `uninstall.php` now has an `ABSPATH` guard alongside the existing `WP_UNINSTALL_PLUGIN` check

Dev

  • Media thumbnail rendering consolidated into a single source of truth. New `TemplateHelpers::media_thumbnail()` (PHP) and `mvsCardBuilders.buildThumbnail()` (JS) helpers used by Explore, BP activity, album/collection viewer, My Media dashboard, BP profile and group tabs, Pro Pinterest/Dribbble/Flickr/Instagram layouts. One branching logic for image / video-with-poster / native video preview / audio card / generic placeholder - every surface now handles each media type identically
  • shared-ui Gutenberg blocks (view.js) now build as true ES modules via `npm run build` so the Interactivity API hydrates correctly - fixes `window.wp.interactivity is undefined` on block-rendered pages
  • Service method docblocks (@param / @return) restored across Album, Moderation, and Tag services

v1.1.2

April 17, 2026
New 13 Improve 1 Fix 18 Security 1

New

  • Add New Tag button on the Tags admin screen
  • Sortable columns on the Tags admin table
  • Back button on every detail page on mobile
  • Touch targets now meet Apple's 44×44 minimum everywhere on mobile
  • Floating upload button respects the iOS safe area (no more overlap with the home bar)
  • Bottom-sheet modals on mobile - slide up from the bottom with a drag handle, like native iOS apps
  • Sticky action bar on the single-media page on mobile - Like, Share, Edit, and Delete stay pinned to the bottom with a blurred backdrop
  • Skeleton loaders while content is loading (smoother than spinners)
  • Instant visual feedback when you tap Like, Favorite, or Follow - the button rolls back automatically if the action fails
  • Tab strips on mobile now scroll horizontally with an edge fade and snap to the active tab
  • Compact icon-with-tooltip buttons on dense action rows on mobile
  • Lucide icons now ship with the plugin - no longer dependent on the active theme to load them
  • Filters to let extensions register custom notification types (`mvs_notification_types`, `mvs_notification_message`)

Improve

  • Updated translation template (POT) with all new strings

Fix

  • Setting Grid Columns to 5 now actually renders 5 columns on the Explore page, single-album view, collections, and dashboard grids (was collapsing to a single column because the 5-column CSS rule was missing)
  • Stats page Today / This Week / This Month / All Time filters now change the Media count and Albums count - previously these cards ignored the date range and looked identical for every filter
  • New tags now show up in the Explore tag cloud immediately after upload (tag count used to stay at 0 because WordPress couldn't count media stored in our custom table - now counted correctly for both tags and categories, plus a one-time backfill for existing tags)
  • Favorite button in the lightbox is now visible to all signed-in users, including the media owner (matches the behaviour of the single-media page)
  • Lightbox Share button no longer shows two icons - now uses the same clean Lucide icon set as the single-media page (Favorite / Share / Open / Report all unified)
  • Bulk-deleting tags no longer produces an error
  • Tag admin pagination count now matches the actual number of tags
  • Sort order is preserved when using bulk actions on tags
  • Deleting a tag now redirects back to a valid page instead of an error page
  • Lightbox opens instantly from media grids - no extra loading delay
  • Moderation queue's AI Flagged tab now correctly lists flagged media (was showing empty)
  • Duplicate-upload "Warn" mode now actually shows a warning when a matching file already exists
  • Fresh installs now have the default Allowed File Types ticked on first visit
  • Album categories are now fully wired - create, update, filter by category, and see category links on single-album pages
  • Demo data cleanup now also removes the tags created by the demo seeder
  • "Allow per-upload privacy" admin setting is now honoured on every upload surface - block editor, BuddyPress activity form, and the backend upload handler
  • BuddyPress activity upload now shows a privacy selector once a file is selected, when per-upload privacy is enabled
  • User deletion and GDPR erasure now clean up all related data - access rules, access grants, view history, direct messages, and conversation participants - so no orphan records are left behind

Security

  • Tag management screens now verify user capability and nonce on every action

v1.1.1

April 10, 2026
New 3 Improve 2 Fix 23

New

  • CLI command `wp mvs generate-video-thumbnails` - batch generates video thumbnails via ffmpeg
  • Auto-generate video thumbnails from browser during upload
  • Improved audio placeholder in media grid (gradient background, larger icon)

Improve

  • Social settings docs updated to match actual implementation
  • 609 CLI test assertions across 30 suites (was 271 across 14)

Fix

  • Single media page - comments, reactions, favorites, follow, and report now work (Interactivity API store loading)
  • Signed URL serving for all media files - images and videos load correctly with .htaccess protection
  • Anonymous users can now view public media in lightbox without 401/403 errors
  • Notification titles show correct media name from mvs_media_index (not WordPress post title)
  • Notification owner lookup uses MediaRepository instead of get_post_field()
  • DM notifications now fire when messages are sent via REST API
  • Favorite notifications now fire on toggle
  • Reaction counts properly sync to mvs_media_index on add/remove
  • Delete cascade cleans up reactions, favorites, comments, mentions, album items, notifications, and activity
  • Privacy enforcement on REST API - anonymous users blocked from members/private media
  • Block bypass prevented - cannot follow a blocked user
  • Profile Message button respects recipient-level DM privacy setting
  • Messaging page dark mode uses theme data-theme attribute instead of OS prefers-color-scheme
  • Messages page auto-loads conversations on /messages/ (was blank)
  • Chat header avatar hidden when no conversation selected (no broken image)
  • Report modal spacing between dropdown and buttons
  • Allowed file types admin setting wired to frontend upload UIs
  • Album upload links files to album after creation
  • Album mode allows multiple file selection
  • Admin grid columns setting is now the source of truth for all media-grid blocks
  • Thumbnail style setting applied to explore and dashboard grids
  • ID column added to admin All Media table
  • Video thumbnail preview in upload modal (canvas frame capture)

v1.1.0

April 6, 2026
New 8 Improve 9 Fix 19 Security 2

New

  • Unified Load More across all layouts (event delegation, no page reloads)
  • Full-grid lightbox navigation (prev/next browses all loaded items)
  • Unified Moderation page - AI Flagged, Pending, User Reports (Pro), Resolved tabs
  • Unified Stats page - Overview + Video Analytics (Pro) tab
  • Activity logging for uploads, moderation, reports, and user actions
  • Settings page header bar with version badge and Setup Wizard link
  • Lightbox video and audio playback - native player controls for all media types
  • Upload capabilities granted to all roles on activation (including custom and BuddyPress roles)

Improve

  • Complete admin UX overhaul following wbcom-modern-admin rulebook
  • CSS design token system - 20 semantic tokens replace 90+ hardcoded hex values
  • Lightbox works for logged-out users (read-only reactions, comments visible)
  • REST API tag, category, search, scope, group_covers filters + stats in response
  • Cleaner admin menu - Migration, Reports, Analytics hidden from sidebar
  • FAB upload button only shows on MVS pages for focused UX
  • BuddyPress activity lightbox supports video and audio inline playback
  • Removed dead infinite scroll code
  • Removed unused setup wizard permissions step

Fix

  • Delete button not working (state binding mismatch in confirm dialog)
  • Media single URLs with underscores redirecting to wrong page
  • Setup wizard page mapping using wrong page IDs after site reset
  • Grid columns setting ignored due to block.json default override
  • Toast notification bindings across all templates
  • Notification items missing clickable links
  • Album cover image quality upgraded from medium to large
  • Share button link generation with proper error handling
  • Default privacy not applied to new uploads
  • BP Activity form script loading from wrong path
  • Stats REST endpoint returns zeros for new media (was 404)
  • Confirm dialog dynamic button labels (Report/Delete)
  • Report dialog with reason dropdown selector
  • Third-party notice suppression on all admin pages including CPTs
  • Interactivity API shared-ui loading from build path
  • moderation_status filter on explore page
  • Unified per_page to use mvs_items_per_page setting everywhere
  • Accessibility - visible focus rings, aria-current, aria-label, reduced-motion
  • Removed all inline styles from admin PHP templates (14 instances)

Security

  • Sanitized $_SERVER['REQUEST_URI'] in login redirect
  • Webhook SSL verify uses wp_is_local_environment for local dev

v1.0.0

April 2, 2026
New 1 Note 13

New

  • complete media platform for WordPress

Note

  • Custom database tables (mvs_media_index, mvs_media_meta, mvs_media_stats) - zero wp_posts pollution
  • 38 features across core platform, social layer, BuddyPress integration, and developer tools
  • 6-level privacy system with BuddyPress-aware fallback
  • reactions (6 types), threaded comments, favorites, follows, DMs, @mentions, sharing
  • flag, quarantine, or reject uploads automatically
  • 9 Gutenberg blocks powered by WordPress Interactivity API
  • 8 shortcodes for embedding media features anywhere
  • activity uploads (1-6 per post), profile/group media tabs, lightbox in activity feed
  • 80+ REST API endpoints across 23 controllers
  • 18 WP-CLI commands for bulk operations and maintenance
  • SHA256 signing via Action Scheduler
  • Template override system
  • GDPR data export and erasure