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:
- Article content is sent to the configured AI provider (Claude or OpenAI)
- AI generates captions tailored for each platform type (social, short, chat, email)
- Captions are inserted into the Share Content panel fields
- 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
Link Shortening
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 |