# Social Publisher — Full Changelog

= 2.0.1 =

- Renamed the public plugin listing to **Social Publisher by Calliope – Auto Post to 10+ Networks** while preserving the existing slug, text domain, settings, storage, and upgrade path.
- Improved the WordPress.org summary and tags to emphasize 10-network Free publishing, social automation, AI-assisted copy, and sanitized logs.
- Consolidated the three public-host/SSRF validation implementations into one shared validator used by Mastodon, Gemini URL context, and reusable host-validation flows.
- Hardened host validation consistently against private/reserved and special-use addresses, IPv4-mapped IPv6, numeric IP spellings, localhost-style names, and common localhost tunnel domains.
- Preserves existing connections, credentials, History, templates, settings, database tables, slugs, and Pro extension compatibility.

= 2.0.0 =
* Finalized the production-ready Free 2.x baseline after end-to-end Free/Pro compatibility, connection, publishing, history, analytics, and updater QA.
* Keeps the ten Free destinations: Bluesky, Mastodon, Tumblr, Pinterest, Threads, Instagram, LinkedIn personal profiles, Blogger, Telegram, and Facebook Pages.
* Keeps Gemini optional and user-supplied, preserves the built-in image workflow, permanent destination-level History, Free Analytics, Social Templates, Smart Tags, retry tooling, and sanitized Logs.
* Preserves the extension boundaries used by Social Publisher Pro 1.0 for Pro destinations, account workflows, scheduling, automation, richer media, templates, and analytics.
* Points connection help to the maintained CalliopeWP web documentation and video tutorial library.
* No destructive data reset is performed when upgrading from the 1.5.x line; saved connections, settings, history, templates, and publication data remain in place.

= 1.5.64 =
* Added safe Smart Tag catalog, group, and value extension points so licensed add-ons can contribute provider-specific tags without changing the Free tag set.
* Keeps add-on values inside the existing sanitization and unresolved-placeholder protection used by Social Templates and Platform Preview.

= 1.5.63 =
* Added the safe extension boundary used by Pro to select a specific reusable template per destination without changing the one-template Free limit.
* Keeps selected Pro templates in manual drafts and refreshes Platform Preview when a template selection changes.
* Lets a licensed Pro extension replace the Social Templates roadmap teaser with its live template library inside the existing Settings form.

= 1.5.62 =
* Raised the Free/Pro compatibility boundary used by normalized real network statistics.

= 1.5.61 =
* Added a safe Analytics view boundary so an active Pro license can replace the complete basic report instead of appending duplicate statistics below it.
* Kept the complete Free Analytics summary as the fallback whenever Pro is absent, inactive, or unable to load.

= 1.5.60 =
* Kept the Publisher columns flush on desktop by stretching Content to the combined Publication type and Media height.
* Preserved natural card heights when the Publisher switches to its stacked responsive layout.

= 1.5.59 =
* Refined the Publisher right rail so Publication type is presented as a cohesive card aligned with Content and Media.
* Improved option spacing, heading hierarchy, and visual separation without changing Standard post or Pro Video post behavior.

= 1.5.58 =
* Completed Step 12 cleanup and migration hardening for the new Free base without changing publishing behavior or adding new user-facing strings.
* Upgraded persistent History storage to schema v4 with a concurrency-safe migration lock, request-level table-existence caching, and indexes for status/date and network/date Dashboard/Analytics queries.
* Kept a single publication-history table and made schema activation/upgrade safer on multisite, including batched network activation and automatic storage initialization for sites created after network activation.
* Reworked uninstall cleanup for multisite so each site keeps or removes its own data according to its cleanup preference; options, transients, post meta, generated uploads, and the site-specific History table are cleaned only when requested.
* Added one-time data hygiene for legacy Facebook caches/options, sanitized stored Logs, Social Templates and Tracking settings, and stale Telegram discovery data from the removed experiment.
* Removed duplicate Blogger setting registration and tightened request normalization/output escaping in affected admin paths.
* Limited maintenance, migrations, History schema checks, heavy media/Preview assets, Templates/Tracking scripts, Facebook connection JavaScript, and queue scans to the Social Publisher screens/tabs where they are actually needed.
* Removed obsolete Dashboard CSS and unused legacy image assets while keeping the active logo/menu assets.
* Reviewed write permissions/nonces and OAuth state guards, responsive breakpoints, database ownership, uninstall behavior, and frontend loading; no duplicate plugin tables were introduced.
* Updated translation metadata and rebuilt all PO/MO catalogs; rebuilt the Gutenberg JavaScript translation catalogs to remove old encoding corruption in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese.

= 1.5.57 =
* Refined the Publisher into a cleaner two-column composer: Content stays in the main column while publication type and Media are grouped in the right-hand rail.
* Removed the full-width publication-type strip from the visual flow without changing Standard post or Pro Video post behavior.
* Standard post, Video post PRO, and media-mode controls now stack vertically for faster scanning and a more compact composer.
* Content spans the height of the publication controls and Media card, while AI generation and Platform preview remain full-width below the composer.
* Added responsive fallbacks so publication type, Content, and Media stack naturally on narrower screens.
* No publishing, media, AI, destination, Preview, History, Analytics, Tracking, Alerts, Dashboard, scheduling, or Pro behavior was changed.

= 1.5.56 =
* Reworked the main screen into a dedicated operational Dashboard and moved manual publishing to its own Publisher tab.
* Dashboard shows only high-value status: needs attention, 7-day activity, recent runs, connected networks, alerts, and UTM state.
* Pro installations replace the single Free teaser with live scheduling and advanced-destination dashboard context.
* Added and rebuilt all included translations for the Dashboard labels.

= 1.5.55 =
* Added a compact Today summary to the main Publisher dashboard with completed publications, successful/failed outcomes, the most active network, and a direct View Analytics link.
* Today uses the WordPress site timezone and reuses persistent History data without duplicating the full Analytics page.
* Added and rebuilt all included translations for the new dashboard labels.

= 1.5.54 =
* Removed Telegram automatic channel discovery and the Find my channels UI.
* Telegram channel/group destinations are entered explicitly again using @username, a t.me link, or the numeric chat ID.
* Kept the Bot ID protection so the bot itself cannot be mistaken for a destination.
* Preserved Telegram publishing, channel/group validation, topics, media, Blogger, alerts, Tracking, History, Preview, Templates, and Analytics.

= 1.5.53 =
* Improved the Failure alerts Settings card with a cleaner switch, compact email panel, balanced footer, and responsive layout.
* Preserved all existing failure-only email behavior and translations.

= 1.5.52 =
* Added Telegram private-channel discovery so administrators no longer need to obtain a -100... channel ID manually.
* A new Find my channels action inspects recent Telegram channel membership/post updates without consuming them, then verifies the bot is an administrator with channel posting permission.
* When exactly one eligible channel is found, Social Publisher saves it automatically and validates the connection; when several are found, Settings offers a detected-channel selector.
* Save and test can now recover automatically from the common mistake of pasting the Bot ID when exactly one eligible channel is discoverable.
* Added explicit handling for bots that use outgoing webhooks, because Telegram does not allow getUpdates while a webhook is active.
* Preserved group/supergroup behavior, forum topics, photo/video publishing, Blogger hardening, failure alerts, UTM tracking, History, Retry, Templates, Preview, and Analytics.

= 1.5.51 =
* Hardened Telegram destination validation so the bot's own user ID cannot be used as a Group / Channel destination.
* Save and test rejects Bot ID destinations before publishing and detects equivalent @bot targets after Telegram resolves them.
* Added a publish-time safety guard and actionable handling for Telegram's "bot can't send messages to the bot/bots" response.
* Added clearer Telegram destination guidance and a warning when a saved destination matches the Bot ID.
* Added and rebuilt all included translations for the new Telegram strings.

= 1.5.50 =
* Reworked Blogger OAuth blog discovery around the documented Blogger API v3 endpoints, trying the plain users/self/blogs request first and using AUTHOR/ADMIN compatibility fallbacks only when needed.
* Added a direct BlogUserInfos permission check for a manually selected Blogger Blog ID, so a valid destination can be verified even when automatic blog discovery fails.
* Added a Manual Blog ID fallback that accepts either the numeric Blog ID or a Blogger dashboard URL such as blogger.com/blog/posts/1234567890.
* OAuth now preserves a valid Google session when blog discovery alone fails, allowing the administrator to enter a manual destination instead of losing the connection.
* When Google returns exactly one Blogger blog, Social Publisher selects and verifies it automatically after OAuth.
* Added sanitized Blogger API diagnostics to Logs, including phase, endpoint, HTTP status and Google provider status/reason/message without tokens or secrets.
* Replaced the generic Blogger unexpected-response path with actionable messages for disabled Blogger API, missing scopes, permissions, and discovery failures.
* Preserved publishing, refresh-token handling, History, Retry, Templates, Tracking and Step 10 alerts while hardening only the Blogger connection flow.
* Added and rebuilt Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese translations for every new Blogger connection string.

= 1.5.49 =
* Added Free Step 10 failure-only email alerts with an opt-in "Notify me when a publication fails" setting.
* Alerts are disabled by default and never send email for fully successful publications.
* Partial publications and multi-network failures send one summary email per publication job, listing only the failed destinations and linking directly to Publication History.
* Added a configurable notification email address with the WordPress administration email as the safe default.
* Added per-job deduplication so a completed job cannot generate duplicate alert emails if its completion response is processed twice.
* History Retry and scheduled/automatic jobs use the same failure-alert pipeline; every retry is treated as its own publication attempt.
* Added alert options to uninstall cleanup and translated all Step 10 Settings/email strings in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese.

= 1.5.48 =
* Added the localized Scheduling, Scheduling views, and List labels used by Social Publisher Pro 0.2.9 to present Scheduled and Calendar as one cleaner workflow.
* Added and rebuilt Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese PO/MO translations for those shared scheduling labels.
* No Free publishing, Analytics, History, Preview, Templates, or UTM behavior changed in this compatibility release.
* Clarification: Free UTM tracking prepares per-network campaign URLs; traffic/click/conversion attribution remains an Advanced Analytics Pro roadmap feature and is not presented as a new Free metric.

= 1.5.47 =
* Added Free Step 9 automatic UTM tracking with one global tracking configuration for all Free destinations.
* Added Settings > Tracking controls for utm_source, utm_medium, and utm_campaign, with {network} resolved independently for each destination.
* Tracking is disabled by default on upgrade so existing publication links do not change until the administrator explicitly enables it.
* Added a live tracked-URL example with destination selector and click-to-insert {network} controls to make UTM configuration easier to verify.
* Applied tracking immediately before Social Templates and provider formatting so {post_link}, provider link fields, Platform Preview, History snapshots, Scheduler, Gutenberg auto-post, and Retry all use the same tracked URL.
* Existing query parameters and URL fragments are preserved; matching UTM parameters are replaced instead of duplicated.
* Added a UTM tracking indicator inside Platform Preview when a tracked link is actually part of that destination payload.
* Added a locked Advanced UTM rules PRO teaser for future per-network, per-campaign, and per-template tracking rules.
* Added Tracking options to uninstall cleanup and translated the complete Step 9 interface in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese.

= 1.5.46 =
* Hid Platform Preview while the Publisher draft is completely empty, preventing selected destinations from appearing as invalid before the user starts composing.
* Platform Preview now appears automatically as soon as the user enters a title, text, link, hashtags, alt text, selects a source post, or adds actual media.
* Clearing all draft content hides and resets the preview again, including validation summaries and destination tabs.
* Empty drafts are no longer intercepted by the preview validation layer; normal Publisher validation remains responsible for attempted empty submissions.
* No new visible strings were introduced, so the existing translations remain valid.

= 1.5.45 =
* Moved the final Publish now controls inside the Platform Preview card so preview, validation, scheduling, and publishing live in one compact workflow.
* Removed the separate empty publish card below Platform Preview and added a subtle integrated footer divider.
* Preserved pre-publish validation, scheduling controls, and responsive behavior without adding new visible strings.

= 1.5.44 =
* Added Free Step 8 provider-aware Platform Preview inside Publisher, with one live tab for each selected Free destination.
* Preview shows destination-specific final text, link, hashtags, selected media, character count, and whether a Social Template is applied before publication is queued.
* Added local Ready, Warning, and Invalid checks, including required-image validation for Instagram and Pinterest, invalid-URL detection, and warnings when provider text limits will shorten a post.
* Added an automatic pre-publish validation gate: invalid destination previews block submission and open the affected network so the problem can be corrected before sending.
* Preview updates automatically while content, destinations, Smart Tag source content, hashtags, links, image format, or media selection changes, with a manual Refresh preview action as a fallback.
* Added a lightweight provider-aware preview engine; preview generation makes no social API calls and stores no preview data.
* Added and verified all Step 8 preview strings in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese, and rebuilt every MO catalog.

= 1.5.43 =
* Removed the remaining Settings height gap by stretching the two top Settings cards to the same desktop row height.
* Anchored the AI action buttons toward the bottom of the AI card so the equal-height layout looks intentional instead of leaving a visible grey gap below it.
* Kept the mobile Settings layout stacked and unchanged, with no new visible strings introduced.

= 1.5.42 =
* Rebalanced the Settings desktop layout so AI Assistant and History/Retry + uninstall controls sit side by side in the top row.
* Moved Social Templates to a full-width row below the two settings columns, eliminating the large empty gap created by the previous tall template editor column.
* Expanded the Social Templates network selector across the full-width card while preserving the dynamic Smart Tags editor introduced in Step 7.
* Audited all 66 visible Settings strings in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese; PO/MO catalogs have no missing Settings translations.
* Localized the Smart Tags section label in every bundled non-English language and rebuilt the MO catalogs.

= 1.5.41 =
* Added Free Step 7 WordPress Smart Tags for {post_title}, {post_excerpt}, {post_content}, {post_link}, {post_author}, {post_date}, {post_categories}, {post_tags}, and {site_name}, while keeping {ai_hashtags} for backward compatibility with Step 6 templates.
* Smart Tags now resolve from the selected WordPress source post, including author, permalink, publication date, categories and tags, with safe Publisher fallbacks when no source post is attached.
* Added automatic excerpt generation from post content when a WordPress post has no manual excerpt.
* Rebuilt the Social Templates editor into a controlled one-network-at-a-time workspace with a network picker, a single large editor, live character count, default/custom state, restore-default action, and copy-to-all-networks action.
* Added grouped clickable Smart Tag controls that insert the selected tag at the current cursor position, so users do not need to type placeholder syntax manually.
* Added server-side protection that removes mistyped unresolved Smart Tag placeholders before a social post is sent.
* Added a dedicated lightweight template-editor JavaScript file with no external dependencies.
* Added and verified all new Smart Tag/editor strings in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese, and rebuilt every MO catalog.

= 1.5.40 =
* Rebalanced Settings after Social Templates: History & retry and Uninstall/data cleanup now sit directly below AI assistant in the left column, while Social Templates stays in the right column.
* Removed the large empty gap created by the previous grid flow without changing any Settings behavior.
* Completed the entire visible Settings translation audit across Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese, including AI controls and Uninstall/data cleanup, and regenerated all MO files.
* No publishing, retry, cleanup, or template logic changed in this layout/i18n release.

= 1.5.39 =
* Added Free Step 6 Social Templates with one reusable template for each bundled Free network.
* Added a Social Templates section inside the existing two-block Settings layout, using compact per-network accordions so ten templates do not overwhelm the screen.
* Added an opt-in master switch; Social Templates are disabled by default on upgrade so existing publishing output does not change until the administrator enables them.
* Added the initial template variables {post_title}, {post_excerpt}, {post_link}, and {ai_hashtags}; these use the current Publisher fields and form the base for the Smart Tags roadmap step.
* Applied templates at the per-network worker stage so each selected destination can receive different text from the same publication while preserving the existing queue, duplicate protection, scheduling, and media flows.
* Stored the rendered template inside the History/Retry snapshot before publishing so a failed destination retries the exact original templated content even if template settings change later.
* Kept Pinterest title/destination-link semantics and Blogger title semantics intact while applying the saved template to their descriptive content.
* Added a compact grey PRO roadmap teaser for multiple reusable templates per network without limiting the single-template Free feature.
* Added template settings to uninstall cleanup and translated all 20 new Social Templates strings in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese, with rebuilt MO files.

= 1.5.38 =
* Fixed History thumbnails so new manual publications use the exact Media Library image selected for that publication instead of guessing from the WordPress featured image.
* Added persistent media_attachment_id storage to Publication History and upgraded the History schema to version 3.
* Stopped showing potentially incorrect featured images for legacy manual History rows whose selected media was never stored; those rows now use the neutral placeholder instead.
* Kept a safe featured-image fallback for legacy automatic, Gutenberg, and scheduled records where the featured image is the publication source.
* Preserved the selected media attachment through per-destination Retry snapshots so retried History rows keep the correct image association.
* Added no new visible strings in this release.

= 1.5.37 =
* Added Free Step 5 Activity over time to Analytics with a responsive daily SVG chart for successful and failed destination results.
* Added an All networks / per-network chart filter while keeping the summary KPI cards global for the selected 7, 30, or 90 day period.
* Kept the selected network when switching Analytics periods and aligned the KPI/query window with the chart's calendar-day range so totals stay consistent.
* Added grey PRO controls beside the chart for previous-period comparison and custom date ranges, keeping premium reporting visible without limiting the Free chart.
* Added translated chart titles, descriptions, empty states, accessibility label, and comparison control in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese, and recompiled all MO catalogs.
* Implemented the chart without external JavaScript/charting libraries to keep the WordPress admin lightweight.

= 1.5.36 =
* Made every locked Pro network teaser card clickable and linked it to the Social Publisher product page on Calliope.
* Added a violet border, subtle background, and keyboard-focus treatment when hovering or focusing Pro network cards.
* Added missing translations for the Pro networks heading and the Get Social Publisher Pro tooltip in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese, and recompiled all MO files.
* Kept the single-row desktop layout and leveled card alignment from the previous UI fixes.

= 1.5.35 =
* Fixed the malformed History section opening tag that exposed a raw aria-label string in the interface.
* Leveled the Pro networks teaser cards so icons, wrapped labels, and PRO badges align more cleanly across the single desktop row.
* Kept the one-row desktop layout while improving internal alignment for cards with longer titles.

= 1.5.34 =
* Fixed the Pro networks teaser grid so all locked Pro network cards stay on a single desktop row when enough admin width is available.
* Reduced card padding and title/icon sizing slightly so the full row fits more cleanly.
* Kept the grid responsive so it wraps naturally on smaller screens.

= 1.5.33 =
* Removed the oversized History overview cards so the History tab no longer wastes space with large summary panels.
* Moved History status, permanent-storage information, last activity, and the Pro upsell into a compact toolbar inside the History records header.
* Kept History focused on filters, results, details, and retry actions.

= 1.5.32 =
* Compacted the Free Analytics summary cards so all five KPI cards remain on one row across normal desktop WordPress admin widths before switching to responsive layouts.
* Redesigned the grey Advanced analytics PRO preview into a compact three-column upgrade panel with contained text and the upgrade CTA aligned in the header.
* Tightened the review banner so its title, five-star message, and review action stay on one line on desktop and stack cleanly on smaller screens.
* Fixed corrupted review-banner translations and the malformed five-star source string in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese.
* Recompiled every bundled MO catalog after correcting the review strings.
* No publishing, History, Retry, or Analytics calculations changed in this visual and localization release.

= 1.5.31 =
* Removed the redundant summary metric cards from the History header so History focuses on storage status, last activity, filters, table rows, and retry actions.
* Kept publication performance metrics exclusively inside Analytics to avoid repeating the same information in two tabs.
* Tightened the History overview card layout after removing the metrics, with a cleaner footer separator for permanent storage status and last activity.
* No new visible strings were introduced in this cleanup; existing translations remain valid across bundled languages.

= 1.5.30 =
* Completed Free Step 4 with a new dedicated Analytics tab backed by permanent Publication History data.
* Added rolling 7-day, 30-day, and 90-day Analytics periods.
* Added Free summary metrics for unique publication runs, successful destinations, failed destinations, success rate, and active networks.
* Added a network performance table with publication runs, published, failed, pending, and per-network success rate.
* Success rate excludes pending destinations so in-progress work is not counted as a failure.
* Added a grey PRO analytics preview for period comparison, advanced filters, and social performance metrics to make the upgrade path visible without limiting core Free analytics.
* Merged Uninstall and data cleanup into the History & retry Settings card so Settings now has two primary blocks: AI assistant and History/data controls.
* Removed the compact Settings overview row introduced in the previous refresh to keep the page focused on actionable controls.
* Added and compiled all new Analytics translations for Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese.
* No social-network publishing behavior or History schema changes are required for this release.

= 1.5.29 =
* Removed the Settings Configuration map panel so the screen focuses on real plugin options instead of filler navigation.
* Added a compact Settings overview row for AI assistant, History & retry, and uninstall/data cleanup status.
* Added a direct History button to the Settings header actions alongside Connections and Logs.
* Rebalanced the Settings layout so AI assistant and History & retry sit side by side on desktop, with uninstall/data cleanup remaining a full-width safety section.
* No new translatable strings were introduced in this refresh; it reused labels already translated in the bundled plugin languages.

= 1.5.28 =
* Added a Settings control to enable or disable manual Retry from Publication History; Retry remains enabled by default.
* When Retry is disabled, History keeps publication results and retry counters but hides manual Retry actions and rejects direct Retry requests server-side.
* Disabled Retry no longer stores new retry snapshots, and switching Retry off removes previously stored retry snapshots without deleting History rows.
* Re-enabling Retry applies to new publication attempts; older failed rows whose retry snapshots were removed remain non-retryable for safety.
* Added translated History & retry settings, status labels, help text, save action, and disabled-state notice in all plugin languages.
* Added the new Retry preference to uninstall cleanup so plugin-owned settings remain consistent with the existing cleanup policy.

= 1.5.27 =
* Added Free Step 3 per-destination Retry directly in History for failed publications.
* Retry queues only the failed network and never republishes destinations that already succeeded.
* Added a retry-safe publication snapshot to persistent History while a destination is pending or failed; the snapshot is removed after a confirmed success to avoid unnecessary long-term duplication.
* Retry updates the same History row through Failed → Pending → Published/Failed and increments the persistent retry counter.
* Added duplicate-safety checks so Retry is not offered when a provider result suggests a post may already exist.
* Added automatic History refresh after a retry finishes.
* Retry snapshots exclude access tokens, API keys, passwords, cookies, and other credentials.
* Completed and compiled the new Retry translations in every bundled plugin language.

= 1.5.26 =
* Removed the separate YouTube Shorts destination card from Publisher because Shorts uses the same YouTube connection.
* Kept a single YouTube destination in Publisher so the network list is cleaner and less confusing.
* Reduced the History Date column width and tightened the desktop column layout so the table fits more cleanly without the unnecessary horizontal scrollbar in common admin widths.
* Kept the Step 2 History responsive layout improvements for tablet and mobile.
* No publishing logic or history storage behavior changed in this release.

= 1.5.25 =
* Fixed the Step 2 History desktop layout so Publication, Destination, Type & AI, Source, Date, Status, and Result keep dedicated column widths and no longer overlap.
* Added a fixed, predictable desktop table layout with safe wrapping for long post titles, account labels, provider messages, and translated status text.
* Added responsive History record cards below 920px, preserving every field with translated per-field labels instead of forcing a cramped horizontal table.
* Kept result actions and expandable technical details contained inside their own area so long provider IDs or messages cannot push adjacent columns out of place.
* Revalidated History/navigation translations in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese.
* No publishing, History storage, filter, or Pro/Free behavior changed; this release completed the Step 2 layout.

= 1.5.24 =
* Completed Free Step 2 by turning History into a full publication browser backed by the permanent history table introduced in 1.5.21.
* Added a paginated destination-by-destination history table with WordPress source post, thumbnail, network, public account identity, content type, AI-use indicator, manual/automatic source, local date/time, publication status, provider post URL/ID, retry count, safe error details, and publication UUID.
* Added Free History search plus network and status filters, with an empty-state flow and clear-filter action.
* Added direct View source and View social post actions when safe public URLs are available.
* Added compact record details for provider post ID, retry count, error code, publication UUID, created time, and updated time without exposing tokens, API keys, or raw provider payloads.
* Added grey locked PRO controls for account, content type, custom date range, and CSV export, plus the existing Advanced History & Analytics upgrade card to make the Free/Pro path visible without disabling core Free history.
* Removed the redundant Documentation tab from the internal navigation. The header Documentation button now opens the external Social Publisher documentation directly in a new tab.
* Removed the redundant Documentation shortcut from Settings so documentation has one clear entry point in the header.
* Added reusable History query APIs for paginated records and available networks so later Free/Pro steps can extend reporting without duplicating database logic.
* Audited 109 visible History/header navigation strings in Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese, corrected missing or garbled visible labels, updated the POT/PO catalogs, and regenerated every MO file.
* No retry action is exposed yet; per-destination retry remains the next Free roadmap step so Step 2 stays focused on browsing and auditing publication history.

= 1.5.23 =
* Moved Publication History out of Publisher and into its own top-level History tab so composing and reporting stay clearly separated.
* Keeps History immediately after Publisher even when the Pro add-on adds Scheduled, Calendar, or License tabs, preserving a predictable navigation order.
* Kept the Step 1 Free summary in History with publication runs, successful, failed, pending, stored destinations, database status, and last activity.
* Kept the Advanced History & Analytics PRO preview visibly locked in grey inside History to communicate the upgrade path without mixing Pro promotion into the Publisher composer.
* Added the missing Pending counter to the visible Step 1 history summary.
* Audited every History string in all bundled locales (Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese), regenerated MO catalogs, and corrected partially untranslated History copy.
* Persistent history storage and publishing behavior remain unchanged from 1.5.21; this release completes the Step 1 information architecture and localization.

= 1.5.22 =
* Completed Step 1 with a visible Publication History status panel on the Publisher dashboard.
* Shows whether persistent history storage is active plus live totals for publication runs, successful destinations, failed destinations, stored destinations, and last activity.
* Added an honest grey Pro roadmap teaser for advanced history and analytics so Free users can see the upgrade path without presenting unreleased Pro analytics as already available.
* Persistent history storage introduced in 1.5.21 remains unchanged and continues to power the upcoming Activity and Analytics screens.

= 1.5.21 =
* Added a permanent publication-history database table, separate from the 200-event diagnostic log.
* Records one history row per destination with WordPress post, UTC date/time, network, public account identity, manual/automatic origin, AI usage, content type, pending/success/failed state, provider post ID/URL, retry count, and safe error summary.
* Creates pending history rows when a publication is queued and updates the same rows as each network completes, including asynchronous provider steps.
* Preserves public provider post identifiers returned by supported networks, and the public post URL when the provider response includes one, so future Activity actions can link to the published result.
* Tracks the selected WordPress post and successful Gemini use from the manual Publisher composer, with same-site URL fallback when no post was explicitly selected.
* Added extension hooks so Social Publisher Pro can attach authoritative account/source metadata and later collect advanced performance insights without storing credentials in history.
* Full uninstall cleanup now removes the history table only when the existing plugin data-cleanup option is enabled.

= 1.5.20 =

= 1.5.19 =
* Pinterest multiple-image selections now create at most two separate Pins, using only the first two images and never attempting a third Pin.
* Pinterest reports omitted images as a successful warning instead of a partial failure when the configured two-Pin cap is reached.
* Publication progress now lets an authoritative successful result clear a stale client-side failure state, preventing networks such as Telegram from remaining marked as failed after a confirmed successful send.


= 1.5.18 =
* Publishes only one post per selected destination when a gallery exceeds that destination's per-post limit.
* Uses Bluesky's four-image maximum and reads each Mastodon server's advertised `max_media_attachments` value, with a safe four-image fallback.
* Omits extra images with a visible warning instead of creating additional posts; Pinterest uses the first image because an organic Pin accepts one image.

= 1.5.17 =
* Added complete Pro multiple-image delivery for Bluesky, Mastodon, Tumblr, Pinterest, LinkedIn personal profiles, Blogger, Telegram, and Facebook Pages.
* Added native galleries and photosets for compatible destinations.
* Added explicit media-result details for multi-image publications.

= 1.5.15 =
* Makes manual URL generation resilient when Gemini URL Context cannot retrieve an otherwise public page.
* Safely retrieves public page text through WordPress first using the safe HTTP API, then uses Gemini URL Context only as a secondary path.
* Continues from the supplied AI brief or existing fields when URL retrieval fails instead of aborting the whole generation.
* Treats retrieved webpage instructions as untrusted data to reduce prompt-injection risk.

= 1.5.14 =
* Migrated the retired Gemini 3.1 Flash-Lite Preview model to stable Gemini 3.1 Flash-Lite.
* Added automatic retry/fallback for empty Gemini responses and more tolerant structured JSON parsing.
* Reduced unnecessary AI thinking for social copy and added a field-by-field recovery path for complete-post generation.

= 1.5.13 =
* Fixed false-positive Gemini context warnings for valid short AI briefs.
* Removed model self-rejection gates that could discard usable generated posts.
* Accepts selected WordPress/WooCommerce content as AI context even without a visible link.
* Makes hashtag validation more tolerant while preserving normalization and output limits.

= 1.5.12 =
* Added the full Gemini model selector used by SEO Mágico: Gemini 3.1 Flash-Lite Preview, Gemini 3 Flash Preview, Gemini 2.5 Flash, Gemini 2.5 Flash-Lite, Gemini 2.5 Pro, and Gemini 3.1 Pro Preview.
* Restored Gemini 3.1 Flash-Lite Preview as the recommended default and migrated the previous non-preview model ID automatically.
* Preserved valid saved model selections instead of forcing every choice back to a single model.

= 1.5.11 =
* Saving LinkedIn application credentials before OAuth no longer shows a missing access-token error.
* The LinkedIn cleanup control now removes the Client ID, Client Secret, tokens, profile target, validation data, OAuth state, and backup copies.
* Renamed the LinkedIn cleanup action and clarified the pre-OAuth save step.

= 1.5.10 =
* Bumped the plugin version so WordPress recognizes the updated package.

= 1.5.9 =
* Added Facebook Page multi-image publishing support when Social Publisher Pro supplies a valid Multiple images / Carousel media payload.
* Added Bluesky multi-image publishing support, using image embeds up to four items and gallery embeds for larger Pro media sets.
* Allows Pro multiple-image publications to fall back to the first selected image on single-image networks instead of failing before publish.
* Improved the Free admin experience with a more complete Documentation hub and a clearer Settings screen.
* Added practical documentation for Free networks, optional Pro destinations, AI setup, publishing, Logs, Settings, tutorial links, and recommended setup order.
* Added a Settings hub with AI connection status, model/language summary, configuration map, and cleanup state.
* Added a visible Connect AI link from the AI generation area to Settings.
* Positioned the Pro video call-to-action beside the Publication type selector, outside both publication cards.
* Simplified locked Pro connection cards so they show only a gray icon, network name, and PRO badge.
* Kept YouTube Shorts out of the Connections tab because Shorts uses the same YouTube connection.
* Preserved gray styling for disconnected network tabs so provider colors indicate configured connections only.

= 1.5.8 =
* Preserved provider/API error details for video publishing instead of replacing them with generic success messages.
* Improved publication type layout so it aligns with the main composer column.

= 1.5.7 =
* Improved asynchronous video provider handling so pending uploads continue in the browser worker instead of failing too early.

= 1.5.6 =
* Improved publication type layout and connected/disconnected destination states.
* Kept disconnected connection tabs gray, including active and hover states.

= 1.5.3 =
* Keeps Blogger selected and publishable when the short-lived Google access token expires but a valid refresh token remains available.
* Prevents duplicate Facebook article URLs when the generated caption already includes the destination link.

= 1.5.0 =
* Finalized the Free release for WordPress runtime testing and public packaging.
* Verified the ten supported Free networks through WordPress HTTP mocks.
* Hardened Facebook OAuth/Page discovery transport and diagnostics.
* Improved automatic connection backup and restoration behavior.
* Confirmed Gemini remains optional and uses request headers for API authentication.
* Documented Free limits, privacy, external services, disconnect behavior, cleanup, and uninstall behavior.

For the complete release history, see `changelog.txt`.

== Upgrade Notice ==
= 2.0.0 =
Production-ready 2.x baseline. Preserves existing 1.5.x data and provides the compatibility boundary required by Social Publisher Pro 1.0.

= 1.5.64 =
Adds the compatibility boundary used by Pro WooCommerce, SEO, and AI Smart Tags while preserving the existing Free tags.

= 1.5.63 =
Adds the compatibility layer for multiple Pro templates per network while Free continues to provide one template per destination.

= 1.5.61 =
Prepares Analytics for a single non-duplicated advanced view when Social Publisher Pro is active.

= 1.5.60 =
Keeps both Publisher columns aligned on desktop while preserving the natural stacked layout on smaller screens.

= 1.5.59 =
Refines the Publisher right rail so Publication type, Content, and Media share one clear card-based visual hierarchy.

= 1.5.58 =
Final Free-base cleanup: safer History schema upgrades and multisite lifecycle, per-site uninstall cleanup, one-time data hygiene, tighter asset loading, security/sanitization review, responsive verification, and translation catalog cleanup.

= 1.5.57 =
Publisher layout refinement: Content on the left, publication type and Media grouped on the right, with no behavior changes.


= 1.5.56 =
Adds a dedicated operational Dashboard, separates Publisher, and enables live Pro dashboard extensions without duplicating Analytics.

= 1.5.55 =
Adds a compact Today publishing summary and direct Analytics access to the main Publisher dashboard.

= 1.5.54 =
Removes Telegram automatic channel discovery and returns to explicit channel/group destination entry while keeping Bot ID safety validation.

= 1.5.53 =
Cleaner Failure alerts Settings layout with no behavior changes.

= 1.5.52 =
Adds automatic Telegram private-channel discovery and channel-target recovery.
= 1.5.51 =
Fixes Telegram destination validation so a Bot ID can no longer be mistaken for a channel/group destination and produces an actionable error instead of a 403 at publish time.

= 1.5.50 =
Blogger OAuth and blog discovery are more resilient, with manual Blog ID fallback, direct account/blog permission verification, automatic single-blog selection, and actionable diagnostics.

= 1.5.49 =
Adds optional failure-only email alerts. Successful publications remain silent; failed or partial jobs send one concise summary when alerts are enabled.

= 1.5.48 =
Adds shared Scheduling labels/compatibility for the unified Pro Scheduling workspace without changing Free publishing or Analytics behavior.

= 1.5.47 =
Adds optional automatic UTM tracking with per-network {network} resolution, live URL preview, Social Template integration, and Platform Preview confirmation. Tracking stays disabled until you enable it.

= 1.5.46 =
Keeps Platform Preview hidden until the user starts composing, so empty drafts no longer show every destination as invalid.


= 1.5.45 =
Integrates the final Publish now controls into Platform Preview so preview, validation, scheduling, and publishing live in one compact workflow.

= 1.5.44 =
Adds provider-aware live previews for each selected network and blocks publishing when a destination preview is invalid.

= 1.5.43 =
Removes the final desktop height gap between the two top Settings cards without changing Settings functionality.

= 1.5.42 =
Rebalances Settings into two equal top columns with Social Templates full-width below them.


= 1.5.41 =
Adds WordPress Smart Tags and replaces the cramped template accordions with a dynamic one-network-at-a-time editor with clickable tag insertion and template controls.

= 1.5.40 =
Rebalances Settings so History/retry and uninstall controls sit below AI, and completes uninstall/data-cleanup translations across all bundled languages.

= 1.5.39 =
Adds one opt-in Social Template per Free network, four initial template variables, exact Retry snapshot preservation, and a compact Pro roadmap preview for multiple templates.

= 1.5.38 =
Fixes History thumbnails by storing the exact selected Media Library attachment for new publications and avoiding incorrect featured-image guesses for legacy manual records.

= 1.5.37 =
Adds the Free Activity over time chart to Analytics with 7/30/90-day periods, per-network filtering, and visible Pro comparison controls.

= 1.5.36 =
Makes every Pro network teaser card clickable, adds a violet hover/focus state, links to the Calliope Social Publisher page, and completes the missing Pro-network translations.

= 1.5.27 =
Adds safe per-destination Retry in History. Only the failed network is queued again, retry counts stay on the same History row, and successful sibling destinations are never republished.

= 1.5.24 =
Adds the complete Free History browser with search, filters, detailed destination results and pagination, removes the redundant Documentation tab, and exposes advanced Pro reporting controls as locked previews.

= 1.5.23 =
Moves persistent Publication History into a dedicated History tab, adds the pending counter, and completes the History translation audit across every bundled locale.


= 1.5.22 =
Makes Step 1 visible in the Publisher with live permanent-history counters and a clearly separated grey Pro analytics roadmap preview.

= 1.5.21 =
Adds the persistent publication-history foundation required for the upcoming Activity and Analytics screens. Existing short diagnostic Logs remain unchanged.

= 1.5.15 =
Prevents public-link retrieval failures from unnecessarily blocking AI generation and adds a safe WordPress-side URL fallback.

= 1.5.14 =
Fixes intermittent Gemini empty-response failures, migrates the retired default model, and adds automatic retry/fallback recovery.

= 1.5.13 =
Fixes repeated false-positive AI context warnings so short valid briefs generate normally without inventing unsupported details.

= 1.5.12 =
Adds all Gemini model choices from SEO Mágico and restores the recommended preview model ID so AI generation can work with a valid selectable model.

= 1.5.11 =
Fixes the LinkedIn pre-OAuth notice and makes LinkedIn cleanup remove all saved connection data.

= 1.5.10 =

= 1.5.9 =
Improves the Free admin experience with a stronger Documentation hub, clearer Settings, better AI setup guidance, and cleaner Pro upgrade placement.

= 1.5.8 =
Preserves provider error details for video publishing and improves the publication type layout.

= 1.5.3 =
Improves Blogger token renewal and prevents duplicate Facebook links in captions.

= 1.5.0 =
Final Free release with runtime verification, safer Facebook diagnostics/OAuth transport, cleaned backup behavior, and complete public packaging.
