OpenStory
OpenStory is an open-source AI film studio for making five-minute films with consistent characters. It has Upload-Post built in: once your team adds an Upload-Post API key, a Publish to social… option appears in the Download menu and sends your rendered cut to every connected platform in one step.
Supported platforms: TikTok, Instagram, YouTube, Facebook, LinkedIn, X, Threads and Bluesky.
Setup
- Create an Upload-Post account at app.upload-post.com. The free plan is enough to try it.
- Create a profile and connect your accounts on the Manage Users page. See Connecting accounts if a platform asks for extra steps.
- Copy your API key from the API Keys page.
- Add it to OpenStory under Settings → API Keys → Publishing. The key is stored for your team and validated when you save it.
Teams without a key see no publishing option at all, so nothing changes until you add one.
Publish a film
- Render your film. The publish option is enabled once the current cut has a finished render.
- Open the Download menu (toolbar or theatre view) and choose Publish to social….
- Pick the Upload-Post profile. Only the platforms connected to that profile are listed.
- Write a caption and, optionally, a description. The caption limit adapts to the strictest platform you selected (for example 280 characters when X is included).
- Choose visibility: YouTube defaults to private; TikTok uses your account default unless you pick Only me.
- Review exactly what will be posted, then click Publish.
The dialog then follows each platform and shows a link to the post, skipped for a platform with no connected account, or the platform's error message.
How it behaves
| Behavior | Details |
|---|---|
| No duplicates | Each publish has a deterministic request id sent as an idempotency key. Double clicks, retries and reopened dialogs resume the existing post instead of sending a new one. |
| Unconfirmed posts | If Upload-Post doesn't confirm a submission (timeout, dropped connection, 5xx), the dialog keeps checking the same request and never offers to publish again. |
| AI labels | OpenStory films are AI-generated, so posts are sent with is_ai_generated. See AI content labeling. |
| Async upload | OpenStory passes the render by URL with async_upload=true; Upload-Post fetches the MP4 itself. Track it in your upload history or with the status endpoint. |
Self-hosting OpenStory
Upload-Post downloads the render from its URL, so that URL must be reachable from the internet. On a self-hosted instance, serve renders from public storage or a CDN. A render that only exists on localhost is refused with a clear message before anything is sent.
Troubleshooting
- "Publish to social…" is missing: add the key under Settings → API Keys → Publishing, then reload.
- The option is disabled: the current cut has no finished render yet.
- A platform is not listed: connect it to the selected profile on Manage Users.
- A platform failed: the error comes from the platform. Common cases are covered in Error handling.