70 lines
5.0 KiB
Markdown
70 lines
5.0 KiB
Markdown
# Changelog
|
|
## [Unreleased]
|
|
|
|
## [01.13.00] --- 2026-06-29
|
|
|
|
## [01.13.00] --- 2026-06-29
|
|
|
|
## [01.12.00] --- 2026-06-28
|
|
|
|
## [01.12.00] --- 2026-06-28
|
|
|
|
### Added
|
|
- **Visual post calendar**: Monthly calendar grid view showing scheduled, queued, and posted cross-posts with status badges (#160)
|
|
- **Calendar navigation**: Month-by-month navigation with today highlighting (#160)
|
|
- **Posting analytics**: Best time to post heatmap with day-of-week and hour-of-day breakdown (#165)
|
|
- **Analytics service filter**: Filter heatmap and stats by service type with configurable date range
|
|
- **Analytics service breakdown**: Per-service success rate, failure count, and average posts per day
|
|
- **Analytics AJAX endpoint**: JSON heatmap data for dynamic filtering without page reload
|
|
- **Social image generator**: Generate branded 1200x630 OG images with article title overlay using PHP GD (#157)
|
|
- **Social image config**: Background color, text color, font size, and site name branding options (#157)
|
|
- **Generate Social Image button**: One-click image generation in the Share Content panel (#157)
|
|
- **AI caption generation**: Generate platform-optimized cross-post captions from article content using Claude or OpenAI (#161)
|
|
- **AI provider config**: New "AI Caption Generation" fieldset in component options with provider, API key, model, and tone settings
|
|
- **AI Generate button**: One-click AI generation button in the Share Content panel that fills all caption fields
|
|
- **X/Twitter threads**: Auto-split messages exceeding 280 chars into reply chains at sentence boundaries
|
|
- **X/Twitter cost-optimized posting**: Optional mode to post text-only tweet first ($0.015) with URL as separate reply ($0.20)
|
|
- **X/Twitter cost warning**: Language string documenting X API pricing for text vs URL posts
|
|
- **Instagram carousel**: Multi-image/video posts via Meta carousel container flow (up to 10 items)
|
|
- **Instagram Reels**: Short-form video publishing via REELS media type
|
|
- **Instagram Stories**: Image and video story publishing via STORIES media type
|
|
- **Instagram alt text**: Alt text support for image containers
|
|
- **Nostr plugin**: Full NIP-01 WebSocket relay publishing with BIP-340 Schnorr signatures (pure PHP, requires ext-gmp)
|
|
- **Nostr**: Publishes kind-1 text note events to multiple relays with automatic failover
|
|
- **Nostr**: Raw WebSocket client using stream_socket_client (no external dependencies)
|
|
- **Nostr**: Public key derivation and event signing via secp256k1 elliptic curve math
|
|
- **Threads carousel**: Support up to 20-item carousel posts via Threads API multi-container flow
|
|
- **Threads polls**: Poll creation support via poll_options parameter (2-4 options)
|
|
- **Threads spoiler tags**: Content warning / spoiler flag support for Threads posts
|
|
- **Threads text-only optimization**: Simplified single-step flow for text-only posts without media
|
|
- **Facebook Reels**: Publish video Reels via Graph API video_reels endpoint (#162)
|
|
- **Facebook Stories**: Publish image and video Stories via photo_stories/video_stories endpoints (#162)
|
|
- **Facebook scheduled posts**: Schedule feed posts with scheduled_publish_time parameter (#162)
|
|
- **Facebook draft posts**: Save feed posts as unpublished drafts (#162)
|
|
- **TikTok video upload**: PULL_FROM_URL video publishing via video/init endpoint with status polling (#164)
|
|
- **TikTok photo carousel**: Up to 35 image carousel posts via content/init endpoint (#164)
|
|
- **TikTok posting mode**: Configurable DIRECT_POST or MEDIA_UPLOAD (sends to TikTok inbox for in-app editing) (#164)
|
|
- **TikTok audit warning**: Language string explaining that unverified apps can only create private posts (#164)
|
|
- **Link shortening**: Shorten URLs via Bitly, Rebrandly, or YOURLS with {url_short} placeholder (#159)
|
|
- **Site frontend**: Public-facing cross-post list and detail views for site visitors (#133)
|
|
- **Social preview**: AJAX platform mockups (Twitter, Facebook, LinkedIn, Instagram, Mastodon, Bluesky) in article editor (#156)
|
|
- **PHPUnit test suite**: Unit tests for models, helpers, and service plugins (#132)
|
|
|
|
### Fixed
|
|
- **Content plugin**: Remove Joomla 5 typed event hints -- Joomla 6 dispatches `Model\AfterSaveEvent` instead of `Content\AfterSaveEvent`, causing fatal TypeError on article save
|
|
- **PreviewController**: Add ACL check and parameterized query to prevent unauthorized article access (IDOR)
|
|
- Webservices plugin Joomla 6 compatibility -- `onBeforeApiRoute` receives `BeforeApiRouteEvent` object, extract router via `$event->getRouter()`
|
|
|
|
## [01.07.00] --- 2026-06-23
|
|
|
|
## [01.07.00] --- 2026-06-23
|
|
|
|
### Added
|
|
- **Full ACL system**: 12 granular permissions in access.xml with permissions fieldset in config.xml
|
|
- **ACL enforcement**: All controllers and views check permissions before allowing actions
|
|
- **MokoSuiteCrossHelper::getActions()**: Centralized ACL helper for toolbar and view logic
|
|
|
|
### Fixed
|
|
- **License warning**: Removed duplicate from system plugin (install script already shows it)
|
|
- **Content plugin**: Fixed func_get_arg crash when non-article content is saved (e.g. update sites, installer)
|