Create a post
Compose one post, publish everywhere
The composer is where every post starts. It’s opinionated in one direction only: you write once, pick channels, and OpenPost handles the platform-specific differences for you. When a channel needs something different — a shorter caption for X, a first-comment hashtag on Instagram — you can override per-channel with one tap.
Open the composer
Click Create in the left nav
The full-screen composer opens. If you prefer a smaller modal, press C from anywhere in OpenPost.
Pick your channels
At the top, toggle the destinations. Each connected integration appears with its avatar. You can pick just one or all of them.
Write the content
The editor supports plain text, emoji, hashtags, and @mentions. As you type, the preview column on the right renders the post exactly as it will appear on each selected channel — character counts update live, media re-crops, links unfurl.
Attach media
Drag a file into the composer or click + Media. OpenPost accepts images up to 30 MB and videos up to 1 GB. We auto-transcode to each platform’s spec, so you don’t need to pre-export in multiple aspects.
Choose when to publish
Three options:
- Publish now— ships within seconds.
- Schedule— pick a date and time.
- Next slot— we drop it into the next open queue slot for every selected channel.
Per-channel overrides
Below the main editor, each selected channel has its own tab. By default it shows “Uses main content.” Tap Edit for channelto override — text, media, hashtags, any field. The main editor stays unchanged. Useful when:
- Your main content is too long for X but fits LinkedIn.
- You want hashtags in Instagram’s first comment but in LinkedIn’s body.
- A YouTube description should include a full chapter list that’s overkill on other channels.
API equivalent
Everything the composer does maps to a single POST /v1/posts call. The minimum viable request:
{
"content": "Ship day — v2 is live.",
"integrations": ["int_x_abc", "int_ig_def"]
}
Add schedule, media, and overrides as you need:
{
"content": "Ship day — v2 is live.",
"integrations": ["int_x_abc", "int_ig_def"],
"schedule_at": "2026-04-20T14:00:00Z",
"media": ["med_hero"],
"overrides": {
"int_x_abc": {
"content": "Ship day. v2 is live. Thread 🧵",
"post_type": "thread"
},
"int_ig_def": {
"first_comment": "#launch #saas #productivity"
}
}
}
Fields reference
| Field | Type | Description |
|---|---|---|
| content* | string | The main post text. Used as default for all channels. |
| integrations* | string[] | Array of integration IDs to publish to. |
| schedule_at | ISO 8601 timestamp | Omit to publish immediately. |
| media | string[] | Media asset IDs. Attached to all channels unless overridden. |
| post_type | enum | For channels that support variants: thread, carousel, reel, etc. |
| overrides | Record<integrationId, PostOverride> | Per-channel content/media/settings. |
| reply_to | string (URL) | For X, Threads, Bluesky — roots the post as a reply. |
| first_comment | string | For Instagram — hashtags in first comment. |