Release v01.05.00: Instagram, YouTube, Share Content, delete, templates, competitive roadmap #166

Merged
jmiller merged 21 commits from dev into main 2026-06-23 16:07:34 +00:00
Owner

Summary

Major feature release with 9 closed issues, 2 new platform plugins, and significant platform enhancements.

New Plugins

  • Instagram -- Meta Content Publishing API (2-step container flow)
  • YouTube -- YouTube Data API v3 channel bulletins

New Features

  • Share Content panel -- Per-article editor fields for platform-specific text ({social}, {short}, {chat}, {email_subject}, {email_body}) with share image picker
  • Delete from platforms -- MokoSuiteCrossDeleteInterface for 7 platforms (Twitter, Mastodon, Bluesky, Facebook, LinkedIn, Telegram, Discord) with auto-delete on unpublish/trash
  • Mailchimp templates -- Saved template injection or responsive email wrapper
  • UTM auto-tagging -- Configurable UTM params with {platform} token and {url_raw} placeholder
  • Caption rotation -- {random:opt1|opt2|opt3} placeholder for evergreen variety
  • Mastodon enhancements -- Visibility levels, content warnings, scheduled posts, polls, language tags
  • Bluesky threads -- Auto-split at sentence boundaries with reply chains + external link card embeds
  • Ntfy default server -- ntfy.mokoconsulting.tech with plugin config params

Bug Fixes (re-applied after rebase loss)

  • ConvertKit/Brevo/Constant Contact: duplicate curl_setopt_array removed
  • Mailchimp: campaign creation accepts 2xx range
  • Medium: getUserId() returns string on error
  • Bluesky: sha256 instead of md5 for cache key
  • ServiceController: generic error message instead of exception details
  • Mailchimp/Mastodon: fixed broken ${CLASS_NAME} namespace placeholders

Housekeeping

  • Makefile removed (CI handles builds)
  • Default templates updated to use platform-specific placeholders
  • README updated to 38 platforms
  • Competitive analysis wiki page added
  • 15 roadmap issues created (#151-#165)

Issues Closed

Closes #130, #131, #140, #141, #142, #152, #154, #155, #158

Test Plan

  • Instagram single image post via Meta API
  • YouTube bulletin post
  • Share Content panel fields save to article attribs
  • {social}, {short}, {chat} placeholders resolve in templates
  • {email_subject}/{email_body} used by Mailchimp/SendGrid/Brevo
  • Share image picker (intro/fulltext/custom/none)
  • Delete from platform on article unpublish (when config enabled)
  • Manual delete button in post queue
  • Mailchimp template injection when template_id set
  • Mailchimp responsive wrapper when template_id empty
  • UTM params appended to {url} when enabled
  • {url_raw} returns clean URL
  • {random:a|b|c} picks different options across posts
  • Mastodon visibility/poll/scheduled_at/spoiler_text
  • Bluesky auto-thread for messages >300 chars
  • Bluesky link card embed on single posts
  • Ntfy posts to ntfy.mokoconsulting.tech by default
  • PHP syntax clean on all modified files
## Summary Major feature release with 9 closed issues, 2 new platform plugins, and significant platform enhancements. ### New Plugins - **Instagram** -- Meta Content Publishing API (2-step container flow) - **YouTube** -- YouTube Data API v3 channel bulletins ### New Features - **Share Content panel** -- Per-article editor fields for platform-specific text ({social}, {short}, {chat}, {email_subject}, {email_body}) with share image picker - **Delete from platforms** -- MokoSuiteCrossDeleteInterface for 7 platforms (Twitter, Mastodon, Bluesky, Facebook, LinkedIn, Telegram, Discord) with auto-delete on unpublish/trash - **Mailchimp templates** -- Saved template injection or responsive email wrapper - **UTM auto-tagging** -- Configurable UTM params with {platform} token and {url_raw} placeholder - **Caption rotation** -- {random:opt1|opt2|opt3} placeholder for evergreen variety - **Mastodon enhancements** -- Visibility levels, content warnings, scheduled posts, polls, language tags - **Bluesky threads** -- Auto-split at sentence boundaries with reply chains + external link card embeds - **Ntfy default server** -- ntfy.mokoconsulting.tech with plugin config params ### Bug Fixes (re-applied after rebase loss) - ConvertKit/Brevo/Constant Contact: duplicate curl_setopt_array removed - Mailchimp: campaign creation accepts 2xx range - Medium: getUserId() returns string on error - Bluesky: sha256 instead of md5 for cache key - ServiceController: generic error message instead of exception details - Mailchimp/Mastodon: fixed broken ${CLASS_NAME} namespace placeholders ### Housekeeping - Makefile removed (CI handles builds) - Default templates updated to use platform-specific placeholders - README updated to 38 platforms - Competitive analysis wiki page added - 15 roadmap issues created (#151-#165) ## Issues Closed Closes #130, #131, #140, #141, #142, #152, #154, #155, #158 ## Test Plan - [ ] Instagram single image post via Meta API - [ ] YouTube bulletin post - [ ] Share Content panel fields save to article attribs - [ ] {social}, {short}, {chat} placeholders resolve in templates - [ ] {email_subject}/{email_body} used by Mailchimp/SendGrid/Brevo - [ ] Share image picker (intro/fulltext/custom/none) - [ ] Delete from platform on article unpublish (when config enabled) - [ ] Manual delete button in post queue - [ ] Mailchimp template injection when template_id set - [ ] Mailchimp responsive wrapper when template_id empty - [ ] UTM params appended to {url} when enabled - [ ] {url_raw} returns clean URL - [ ] {random:a|b|c} picks different options across posts - [ ] Mastodon visibility/poll/scheduled_at/spoiler_text - [ ] Bluesky auto-thread for messages >300 chars - [ ] Bluesky link card embed on single posts - [ ] Ntfy posts to ntfy.mokoconsulting.tech by default - [ ] PHP syntax clean on all modified files
jmiller self-assigned this 2026-06-23 15:58:10 +00:00
jmiller added 19 commits 2026-06-23 15:58:11 +00:00
chore(version): pre-release bump to 01.04.02-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 48s
dc5feaa9aa
feat: add Instagram + YouTube plugins, re-apply deep scan fixes (#140, #141)
Universal: Auto Version Bump / Version Bump (push) Successful in 12s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 11s
1cb5c77bec
New plugins:
- plg_mokosuitecross_instagram: Meta Content Publishing API (2-step flow)
- plg_mokosuitecross_youtube: YouTube Data API v3 channel bulletins

Bug fixes (re-applied after rebase loss):
- ConvertKit/Brevo/ConstantContact: duplicate curl_setopt_array removed
- Mailchimp: campaign creation accepts 2xx range (not just 200)
- Medium: getUserId() returns '' on error (not array)
- Bluesky: sha256 instead of md5 for cache key
- ServiceController: generic error message instead of exception details

Closes #140, closes #141
chore(version): pre-release bump to 01.04.03-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 26s
9017b06c7d
feat: add per-article Share Content panel with platform-specific placeholders
Universal: Auto Version Bump / Version Bump (push) Successful in 8s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 13s
3c1f3a2421
New article editor fieldset 'Share Content' with fields:
- Social Media Text ({social}) - Facebook, LinkedIn, Threads, Mastodon
- Short Text ({short}) - Twitter/X (280), Bluesky (300)
- Chat Text ({chat}) - Telegram, Discord, Slack, Teams
- Email Subject ({email_subject}) + Email Body ({email_body}) - Mailchimp, SendGrid, Brevo
- Share Image picker (intro/fulltext/custom/none)

All placeholders fall back gracefully to introtext/title if empty.
Default templates updated to use platform-specific placeholders.
chore(version): pre-release bump to 01.04.04-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 8s
bfe4432c78
feat: Mailchimp template support + responsive email wrapper (closes #142)
Universal: Auto Version Bump / Version Bump (push) Successful in 14s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 19s
5753c307c6
- Add template_id and template_section config fields
- When template_id set, inject content into Mailchimp template sections
- When empty, wrap HTML in responsive email skeleton (600px table layout)
- Fix broken ${CLASS_NAME} namespace placeholder in mailchimp.xml
- New language strings for template fieldset

Closes #142
chore(version): pre-release bump to 01.04.05-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 7s
add973771b
feat: delete/unpublish from remote platforms (closes #131)
Universal: Auto Version Bump / Version Bump (push) Successful in 8s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 18s
4918879eec
New MokoSuiteCrossDeleteInterface (separate from main interface to avoid
breaking all 38 plugins). Plugins that support deletion implement both.

deletePost() implemented for 7 platforms:
- Twitter: DELETE /2/tweets/{id} with OAuth 1.0a
- Mastodon: DELETE /api/v1/statuses/{id}
- Bluesky: com.atproto.repo.deleteRecord
- Facebook: DELETE /{post_id} via Graph API
- LinkedIn: DELETE /v2/ugcPosts/{urn}
- Telegram: POST /deleteMessage
- Discord: DELETE webhook /messages/{id}

Infrastructure:
- CrossPostDispatcher::deleteFromPlatforms() finds posted entries and
  calls deletePost() on plugins that implement the delete interface
- Content plugin hooks onContentChangeState for unpublish/trash
- New component config: 'Delete from Platforms on Unpublish'
- Post status 'deleted' added to schema

Closes #131
chore(version): pre-release bump to 01.04.06-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 37s
eb1b112a93
chore: remove Makefile -- builds handled by CI
Universal: Auto Version Bump / Version Bump (push) Successful in 14s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 21s
6ad536c0ef
chore(version): pre-release bump to 01.04.07-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 6s
42f7a09bb3
feat: UTM auto-tagging and caption rotation (closes #154, closes #155)
Universal: Auto Version Bump / Version Bump (push) Successful in 7s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 9s
7e5ff12d03
UTM tracking (#154):
- New config fieldset with utm_source, utm_medium, utm_campaign, utm_content
- {platform} token in UTM values auto-replaced with service type
- {url} gets UTM params appended when enabled
- {url_raw} placeholder for clean URLs without UTM

Caption rotation (#155):
- {random:option1|option2|option3} placeholder in templates
- Picks one option at random per post render
- Great for evergreen re-shares to vary messaging

Closes #154, closes #155
chore(version): pre-release bump to 01.04.08-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 3s
9bfbf36090
docs: update README with 38 platforms, new features, Instagram + YouTube
Universal: Auto Version Bump / Version Bump (push) Successful in 12s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 22s
09074e3c00
chore(version): pre-release bump to 01.04.09-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 7s
c13c2a372e
feat: Mastodon polls/visibility/scheduling + Bluesky threads (closes #152, #158)
Universal: Auto Version Bump / Version Bump (push) Successful in 12s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 12s
5fee5d7810
Mastodon (#152):
- Visibility levels (public/unlisted/private/direct) from params or config
- Content warnings via spoiler_text param
- Scheduled posts via scheduled_at param
- Poll creation (options, expires_in, multiple) mutually exclusive with media
- Language tag support
- Fixed broken ${CLASS_NAME} namespace in mastodon.xml

Bluesky (#158):
- Auto-thread: split long messages at sentence boundaries into reply chains
- External link card embed (app.bsky.embed.external) with article title/description
- Link card attached to last post in thread
- Dispatcher now passes article_title to service plugins

Closes #152, closes #158
chore(version): pre-release bump to 01.04.10-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 34s
03870dce33
feat: ntfy default server ntfy.mokoconsulting.tech with config params
Universal: Auto Version Bump / Version Bump (push) Successful in 10s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 12s
be58716391
- Default server URL changed from ntfy.sh to ntfy.mokoconsulting.tech
- Added plugin config fieldset with default_server_url and default_topic
- Server URL reads from plugin params, overridable per-service in credentials
- Updated language strings
chore(version): pre-release bump to 01.04.11-dev [skip ci]
Publish to Composer / Publish Package (release) Failing after 5s
4650f9ba46
jmiller added 1 commit 2026-06-23 16:06:38 +00:00
fix: resolve broken namespace placeholders in 7 plugin XML manifests
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Joomla: Extension CI / Build RC Pre-Release (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 7s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 4s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Secret Scan (pull_request) Successful in 7s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: Auto Version Bump / Version Bump (push) Successful in 12s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 24s
Universal: PR Check / Validate PR (pull_request) Failing after 48s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 49s
de0b588be0
jmiller added 1 commit 2026-06-23 16:07:14 +00:00
chore(version): pre-release bump to 01.04.12-dev [skip ci]
Branch Cleanup / Delete merged branch (pull_request) Has been skipped
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Failing after 3s
Publish to Composer / Publish Package (release) Failing after 35s
Universal: Build & Release / Build & Release Pipeline (pull_request) Successful in 32s
62a8e9bd99
jmiller merged commit 0fb95ced3f into main 2026-06-23 16:07:34 +00:00
Sign in to join this conversation.
No Reviewers
No labels
Priority -
Type -
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MokoConsulting/MokoSuiteCross#166