Data Machine Socials
Social media automation for WordPress, powered by Data Machine.
by Chris Huber, extrachill · github.com/extra-chill/data-machine-socials · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/extra-chill/data-machine-socials/releases/download/v0.20.2/data-machine-socials.zipReadme
Data Machine Socials
Social media publishing extension for Data Machine. Enables automated publishing to Twitter/X, Facebook Pages, Bluesky, Mastodon, Threads, Pinterest, Tumblr, and TikTok.
Requirements
- WordPress 6.9+
- PHP 8.2+
- Data Machine core plugin (required)
Installation
- Install and activate the Data Machine core plugin
- Install this plugin in your WordPress plugins directory
- Activate Data Machine Socials
- Configure authentication for each platform in Data Machine settings
Supported Platforms
| Platform | Auth Type | Character Limit | Media Support |
|---|---|---|---|
| Twitter/X | OAuth 1.0a | 280 chars | Images |
| Facebook Pages | OAuth 2.0 | No limit | Images |
| Bluesky | App Password | 300 chars | Images |
| Mastodon / Fediverse | OAuth 2.0 token | Instance-configurable | One image |
| Threads | OAuth 2.0 | 500 chars | Images |
| Bearer Token | N/A (pins) | Images required | |
| Tumblr | OAuth 2.0 | No documented text limit | Text posts; native media upload is not included |
Configuration
Each platform requires authentication setup:
- Go to Data Machine → Settings → Authentication
- Select the platform you want to configure
- Follow the OAuth flow or enter credentials
- Save and verify connection
Platform-Specific Setup
Twitter/X:
- Requires Twitter Developer account
- Create an app at developer.twitter.com
- Enter API Key and API Secret in settings
- Complete OAuth authorization
Facebook:
- Requires Facebook App with Pages permissions
- Needs
pages_manage_posts,pages_manage_engagementscopes - Authorize your Facebook account
- Select which Page to publish to
Bluesky:
- Generate an App Password in Bluesky settings
- Enter your handle and app password
- No OAuth flow required
Threads:
- Requires Meta app registration
- OAuth 2.0 authentication
threads_basicandthreads_content_publishscopes
Pinterest:
- Requires Pinterest Developer account
- Generate an access token
- Configure default board or use category mapping
Tumblr:
- Register an app at www.tumblr.com/oauth/apps
- Configure its OAuth Consumer Key and OAuth Consumer Secret
- Complete OAuth 2.0 with the
basic write offline_accessscopes - Set the target blog identifier in the Tumblr publish-handler settings
Usage in Pipelines
Once authenticated, social handlers appear in the Data Machine Pipeline Builder:
- Create or edit a Pipeline
- Add a "Publish" step
- Select the social platform handler
- Configure handler settings:
- Include Images: Enable/disable image uploads
- Link Handling: How to handle source URLs (append, reply, comment, none)
- Save and run your flow
AI Tool Integration
Social handlers register AI tools that can be used in Data Machine Chat:
twitter_publish- Post to Twitter with media supportfacebook_publish- Post to Facebook Pagesbluesky_publish- Post to Blueskythreads_publish- Post to Threadspinterest_publish- Create Pinterest pinstumblr_publish- Create Tumblr NPF text posts
Architecture
This plugin follows the Data Machine extension pattern:
- Namespace:
DataMachineSocials\Handlers\{Platform} - Registration: Handlers self-register via
HandlerRegistrationTrait - Discovery: Core
HandlerAbilitiesdiscovers handlers via WordPress filters - Auth: Core
AuthAbilitiesmanages OAuth flows and token storage
Handler API
Each handler registers itself via HandlerRegistrationTrait::registerHandler() with
a meta config array (the trailing array(...) argument). The shape exposed to
clients via GET /datamachine/v1/socials/platforms is:
array(
'charLimit' => 280, // optional int
'maxImages' => 4, // optional int
'aspectRatios' => array( 'any' ), // optional string[]
'defaultAspectRatio' => 'any', // optional string
'supportsCarousel' => false, // optional bool
'supportsVideo' => true, // optional bool
'composer' => array( // required publish composition contract
'crossPostCompatible' => true,
'mediaKinds' => array( 'image', 'carousel' ),
// Specialized composers also declare an `ability` name.
),
'capabilities' => array( // optional, canonicalised server-side
array( 'slug' => 'publish', 'label' => 'Publish' ),
),
'preview' => array( // optional — see "Preview shape" below
'aspectRatio' => '16:9',
'captionPosition' => 'above',
'previewSurface' => 'feed',
),
)
The platform endpoint normalizes composer into a transport-ready contract with
crossPostCompatible, mediaKinds, target, inputSchema, and
mediaRequirements. Generic targets point to datamachine/v1/socials/post.
Specialized targets point to their WordPress Ability and expose that ability's
input schema, so consumers can preserve requirements such as TikTok privacy
controls and YouTube title/video upload input without platform-name branches.
Preview shape
The preview field declares how clients should render a post preview for the
platform. It exists so consumers (e.g. the Studio publish pane) can render
platform-canonical previews without any per-platform branching — the client
renders whatever shape the server declares.
| Field | Values | Meaning |
|---|---|---|
aspectRatio |
1:1, 4:5, 16:9, native |
How images are framed in the preview |
captionPosition |
above, below, overlay |
Where the caption renders relative to media |
previewSurface |
card, feed, square |
Visual chrome around the preview |
Per-platform defaults declared in this plugin:
| Platform | aspectRatio |
captionPosition |
previewSurface |
|---|---|---|---|
| Twitter / X | 16:9 |
above |
feed |
| Bluesky | 16:9 |
above |
feed |
| Threads | native |
below |
feed |
1:1 |
below |
square |
|
native |
above |
card |
|
native |
above |
card |
|
4:5 |
below |
square |
|
native |
above |
card |
Backwards compatibility. preview is optional. Handlers that don't declare
it (or older DM-Socials installs running against newer clients) get a generic
feed-shaped default applied server-side:
array(
'aspectRatio' => 'native',
'captionPosition' => 'above',
'previewSurface' => 'feed',
)
The field is always present on the response — clients never have to default it.
File Structure
data-machine-socials/
├── data-machine-socials.php # Plugin entry point
├── composer.json # Dependencies (twitteroauth)
├── inc/
│ └── Handlers/
│ ├── Twitter/
│ │ ├── Twitter.php # Handler implementation
│ │ ├── TwitterAuth.php # OAuth 1.0a auth
│ │ └── TwitterSettings.php # Handler settings
│ ├── Facebook/
│ │ ├── Facebook.php
│ │ ├── FacebookAuth.php # OAuth 2.0 auth
│ │ └── FacebookSettings.php
│ ├── Bluesky/
│ │ ├── Bluesky.php
│ │ └── BlueskyAuth.php # App password auth
│ ├── Threads/
│ │ ├── Threads.php
│ │ ├── ThreadsAuth.php # OAuth 2.0 auth
│ │ └── ThreadsSettings.php
│ └── Pinterest/
│ ├── Pinterest.php
│ ├── PinterestAuth.php # Bearer token auth
│ └── PinterestSettings.php
└── docs/
└── handlers/
├── twitter.md
├── facebook.md
├── bluesky.md
├── threads.md
└── pinterest.md
Dependencies
abraham/twitteroauth- Twitter OAuth 1.0a client- Data Machine core plugin - Provides base classes and abilities
Development
Setup
cd data-machine-socials
composer install
Coding Standards
This plugin follows WordPress coding standards and the Data Machine style guide:
- PSR-4 autoloading
- WordPress 6.9+ compatibility
- PHP 8.2+ features
- Proper namespacing and abstraction
License
GPL v2 or later - See LICENSE
Support
- Issues: GitHub Issues
- Documentation: Data Machine Docs
- Author: Chris Huber (chubes.net)
Read the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v0.20.2 | Aug 25, 2026 | data-machine-socials.zip | 6 |
| v0.20.1 | Aug 23, 2026 | data-machine-socials.zip | 44 |
| v0.20.0 | Aug 23, 2026 | data-machine-socials.zip | 3 |
| v0.19.1 | Jul 27, 2026 | data-machine-socials.zip | 6 |
| v0.19.0 | Jul 27, 2026 | data-machine-socials.zip | 1 |
| v0.18.0 | Jul 27, 2026 | data-machine-socials.zip | 1 |
| v0.17.0 | Jul 26, 2026 | 01-data-machine-socials.zip | 1 |
| v0.17.0 | Jul 26, 2026 | data-machine-socials.zip | 0 |
| v0.16.0 | Jun 18, 2026 | data-machine-socials.zip | 2 |
| v0.15.0 | Jun 16, 2026 | data-machine-socials.zip | 1 |
| v0.14.1 | Jun 15, 2026 | data-machine-socials.zip | 2 |
| v0.14.0 | Jun 6, 2026 | data-machine-socials.zip | 1 |
| v0.13.2 | May 9, 2026 | — | — |
| v0.13.1 | Apr 26, 2026 | — | — |
| v0.13.0 | Apr 26, 2026 | — | — |
| v0.12.1 | Apr 26, 2026 | — | — |