1
Architecture
Jonathan Miller edited this page 2026-06-29 16:50:45 +00:00

Architecture

MokoSuiteCross follows Joomla 6 namespaced MVC architecture with a plugin-based service abstraction layer.


Package Structure

Extension Type Purpose
com_mokosuitecross Component Core admin/site MVC, queue engine, analytics
plg_content_mokosuitecross Plugin (Content) Auto cross-post on article save/publish
plg_system_mokosuitecross Plugin (System) Pageload queue processing, Share Content editor panel
plg_mokosuitecross_* (36) Plugin (MokoSuiteCross) One plugin per platform/service

Component Namespace

Joomla\Component\MokoSuiteCross
├── Administrator\
│   ├── Controller\        (15 controllers)
│   ├── Model\             (12 models)
│   ├── Table\             (3 table classes)
│   ├── View\              (11+ admin views)
│   ├── Helper\            (11 helpers)
│   └── Service\           (DI provider)
└── Site\
    ├── Controller\
    ├── Model\
    └── View\              (2 site views)

Admin Views

View Description
Dashboard Component overview with stats and quick actions
Posts Cross-post queue with status, filtering, and batch actions
Post Single post detail/edit form
Services List of connected platform accounts
Service Service connection edit form with credentials
Templates Message template list
Template Template edit with placeholder reference
Logs Activity and error log viewer
Calendar Monthly calendar grid of scheduled/completed posts
Analytics Best time to post heatmap and service breakdown
Migration Data migration interface

Site Views

View Description
Posts Public-facing cross-post list
Post Single cross-post detail

Service Plugin Architecture

Each platform is implemented as a separate Joomla plugin in the mokosuitecross plugin group. All service plugins implement MokoSuiteCrossInterface.

Plugin Interface

interface MokoSuiteCrossInterface
{
    public function crosspost(object $article, object $service, string $message, ?string $image): array;
}

Optional interface for platforms supporting remote deletion:

interface MokoSuiteCrossDeleteInterface
{
    public function deletePost(object $service, string $platformPostId): bool;
}

36 Service Plugins

Social Media (12): Facebook, Twitter/X, Instagram, YouTube, LinkedIn, Mastodon, Bluesky, Threads, Pinterest, Reddit, TikTok, Tumblr

Email Marketing (5): Mailchimp, SendGrid, Brevo, Constant Contact, ConvertKit

Chat / Messaging (8): Telegram, Discord, Slack, Microsoft Teams, WhatsApp, Google Chat, Matrix, Ntfy

Publishing Platforms (6): WordPress, Medium, Dev.to, Ghost, Hashnode, Blogger

Other (5): Webhook, RSS Feed, ActivityPub, Google Business, Nostr

Internal (2): MokoSuite Calendar, MokoSuite Gallery


Queue Processing

Cross-posts are processed through a queue system with three configurable modes:

Mode Trigger Description
Scheduler Joomla Task Scheduler (cron) Background processing via scheduled tasks
Pageload System plugin (onAfterRender) Processes queue on admin/site page loads with configurable interval
Both Scheduler + Pageload Dual processing for maximum throughput

Post Lifecycle

Article Published
  → Content Plugin (onContentAfterSave)
    → Queue posts for all enabled services (status: queued)
      → Queue processor dispatches to service plugins
        → Success: status → posted, platform_post_id stored
        → Failure: status → failed, retry_count incremented
          → Retry up to max_retries with configurable delay

Template Engine

Templates use a placeholder system for platform-optimized messaging:

Placeholder Source
{title} Article title
{url} Article SEF URL (with UTM if enabled)
{url_raw} Article URL without UTM parameters
{url_short} Shortened URL (Bitly/Rebrandly/YOURLS)
{introtext} Article intro text
{image} Article image URL
{category} Category name
{author} Author name
{social} Share Content "Social" field
{short} Share Content "Short" field
{chat} Share Content "Chat" field
{email_subject} Share Content "Email Subject" field
{email_body} Share Content "Email Body" field
{hashtags} Auto-generated hashtags
{field:xxx} Joomla custom field value
{random:a|b|c} Random option per post (for evergreen rotation)

AI Caption Generation

Generates platform-optimized captions from article content:

  1. Article content is sent to the configured AI provider (Claude or OpenAI)
  2. AI generates captions tailored for each platform type (social, short, chat, email)
  3. Captions are inserted into the Share Content panel fields
  4. One-click "AI Generate" button in the article editor

Social Image Generator

Generates branded 1200x630 Open Graph images using PHP GD:

  • Article title overlay with configurable font size
  • Configurable background and text colors
  • Optional site name branding
  • One-click generation from Share Content panel

URLs are shortened before template rendering via one of three providers:

Provider Authentication
Bitly API key
Rebrandly API key
YOURLS API endpoint URL + signature token

Shortened URLs are available via {url_short} placeholder.


ACL System

19 ACL actions (7 core + 12 component-specific) enforced across all controllers and views. See Configuration for the full permissions list.


Key Helpers

Helper Purpose
MokoSuiteCrossHelper ACL checks, toolbar setup, general utilities
TemplateHelper Placeholder resolution and template rendering
QueueHelper Queue dispatch, retry logic, status management
ImageHelper Social image generation with PHP GD
AiHelper AI caption generation (Claude/OpenAI)
LinkHelper URL shortening (Bitly/Rebrandly/YOURLS)
UtmHelper UTM parameter tagging
AnalyticsHelper Heatmap data aggregation
CalendarHelper Calendar view data preparation
PreviewHelper Social preview mockup generation
MigrationHelper Data migration utilities