bug: systemic -- most plugins declare supportsMedia() true but ignore $media parameter #244

Open
opened 2026-06-29 14:26:04 +00:00 by jmiller · 1 comment
Owner

Description

28 of 38 service plugins declare supportsMedia(): true, but the vast majority never use the $media array in their publish() method. Only Instagram, Threads, and TikTok fully implement media uploads. Facebook partially implements it (Reels/Stories only, not feed posts).

Plugins that properly handle media:

  • Instagram -- carousel, Reels, Stories with container flow
  • Threads -- carousel with multi-container flow
  • TikTok -- video + photo carousel via content API

Plugins that partially handle media:

  • Facebook -- Reels/Stories use media, but publishFeed() ignores it (see #233)
  • DevTo, WordPress, Tumblr, Medium, Pinterest, Teams, Google Business -- reference $media but may only pass URL, not upload

Plugins that declare supportsMedia() = true but NEVER use $media:

  • Twitter (#232) -- text-only, never uploads media
  • Bluesky (#234) -- only link card embeds, never uploads blobs
  • LinkedIn -- hardcodes shareMediaCategory: 'NONE'
  • Mastodon -- never calls /api/v2/media endpoint
  • Telegram -- only uses /sendMessage, never /sendPhoto etc
  • Discord -- webhook only, no file upload
  • Slack -- webhook only, no file upload
  • YouTube -- text only, never uploads video
  • Reddit -- text only
  • Nostr -- text events only, no NIP-94 media
  • Mailchimp / SendGrid / Brevo / Constant Contact / ConvertKit -- email body only, no inline images
  • Matrix -- text only
  • Google Chat -- text only
  • Ghost / Hashnode / Blogger -- text only
  • Webhook / RSS / ActivityPub -- text/data only
  • WhatsApp -- text only
  • Ntfy -- notification only

Impact

  • Severity: Medium-High -- supportsMedia() returning true implies the plugin handles images, but media is silently dropped. This is misleading for users and for CrossPostDispatcher which checks this flag.
  • Suggestion: Either implement actual media upload for platforms that support it, or set supportsMedia(): false for those that don't. The interface contract should be honest.

Priority order for media implementation:

  1. Mastodon (API supports it via /api/v2/media)
  2. LinkedIn (API supports it via image/video upload assets)
  3. Telegram (API supports it via /sendPhoto, /sendVideo, /sendMediaGroup)
  4. Discord (webhooks support file_content multipart)
  5. Slack (Block Kit supports image blocks)
  6. Reddit (API supports image/link posts)

Related issues

## Description 28 of 38 service plugins declare `supportsMedia(): true`, but the vast majority never use the `$media` array in their `publish()` method. Only Instagram, Threads, and TikTok fully implement media uploads. Facebook partially implements it (Reels/Stories only, not feed posts). ### Plugins that properly handle media: - **Instagram** -- carousel, Reels, Stories with container flow - **Threads** -- carousel with multi-container flow - **TikTok** -- video + photo carousel via content API ### Plugins that partially handle media: - **Facebook** -- Reels/Stories use media, but `publishFeed()` ignores it (see #233) - **DevTo**, **WordPress**, **Tumblr**, **Medium**, **Pinterest**, **Teams**, **Google Business** -- reference `$media` but may only pass URL, not upload ### Plugins that declare supportsMedia() = true but NEVER use $media: - **Twitter** (#232) -- text-only, never uploads media - **Bluesky** (#234) -- only link card embeds, never uploads blobs - **LinkedIn** -- hardcodes `shareMediaCategory: 'NONE'` - **Mastodon** -- never calls `/api/v2/media` endpoint - **Telegram** -- only uses `/sendMessage`, never `/sendPhoto` etc - **Discord** -- webhook only, no file upload - **Slack** -- webhook only, no file upload - **YouTube** -- text only, never uploads video - **Reddit** -- text only - **Nostr** -- text events only, no NIP-94 media - **Mailchimp** / **SendGrid** / **Brevo** / **Constant Contact** / **ConvertKit** -- email body only, no inline images - **Matrix** -- text only - **Google Chat** -- text only - **Ghost** / **Hashnode** / **Blogger** -- text only - **Webhook** / **RSS** / **ActivityPub** -- text/data only - **WhatsApp** -- text only - **Ntfy** -- notification only ## Impact - **Severity**: Medium-High -- `supportsMedia()` returning true implies the plugin handles images, but media is silently dropped. This is misleading for users and for CrossPostDispatcher which checks this flag. - **Suggestion**: Either implement actual media upload for platforms that support it, or set `supportsMedia(): false` for those that don't. The interface contract should be honest. ## Priority order for media implementation: 1. Mastodon (API supports it via `/api/v2/media`) 2. LinkedIn (API supports it via image/video upload assets) 3. Telegram (API supports it via `/sendPhoto`, `/sendVideo`, `/sendMediaGroup`) 4. Discord (webhooks support file_content multipart) 5. Slack (Block Kit supports image blocks) 6. Reddit (API supports image/link posts) ## Related issues - #232 (Twitter) - #233 (Facebook feed) - #234 (Bluesky)
Author
Owner

Branch created: feature/244-bug-systemic-most-plugins-declare-suppor

git fetch origin
git checkout feature/244-bug-systemic-most-plugins-declare-suppor
Branch created: [`feature/244-bug-systemic-most-plugins-declare-suppor`](https://git.mokoconsulting.tech/MokoConsulting/MokoSuiteCross/src/branch/feature/244-bug-systemic-most-plugins-declare-suppor) ```bash git fetch origin git checkout feature/244-bug-systemic-most-plugins-declare-suppor ```
Sign in to join this conversation.
No labels
Priority Medium
Type Feature
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MokoConsulting/MokoSuiteCross#244