Publishing
Postiz
Postiz is an open-source social media scheduler we run on our own server: one calendar for every channel, plus a public API that automations publish through.
Postiz is an open-source social media scheduler: it keeps every connected account in one place and puts posts on a calendar. The software runs on your own server under Docker, and the project states there is no feature difference between a self-hosted install and the hosted version. The source is available under AGPL-3.0.
The application ties three things together: the channel list, the composer and the calendar. A post is written once and can then be adjusted per channel, and the preview column renders it as each platform will show it. In our stack Postiz runs on our own server with its own PostgreSQL database, and scheduled posts go out through it.
Channels and platforms
A channel is one connected account: one X profile, one Discord server, one LinkedIn page. The documentation lists 34 platforms, and they do not behave the same way.
- Four connection flows exist: an OAuth redirect, credentials you paste into Postiz, an in-app dialog, and a browser extension reusing an existing session.
- Extra parts of a post become a thread, a comment on your own post, or nothing at all, depending on the platform.
- Media rules differ per platform, and the composer blocks a post that breaks them.
- Only ten platforms report account-level analytics back to Postiz.
Running it with Docker Compose
The official self-hosting path is Docker Compose, kept in a separate repository: pull the file from there rather than copying it, because services and variables change between releases.
The stack runs the main application plus PostgreSQL, Redis and Temporal for background workflows. Temporal is mandatory from v2.12.0, and that upgrade has its own migration guide.
- Everything is configured through environment variables, and a change requires a restart.
- The required core variables include the database and Redis connection strings, the JWT secret, and the browser and internal URLs.
- Durable state lives in volumes: database files, Redis state, configuration and uploaded media.
- Backups are taken from the database with pg_dump, and the restore path needs testing.
API and automation
The public API authenticates with an API key or an OAuth2 token, and it calls a channel an integration, which is the same connected account.
- An hourly limit applies to the create post endpoint only. It defaults to 90 and is a single instance-wide value rather than a per-plan tier; the shipped Compose file sets it to 30, and API_LIMIT raises it.
- Several posts can be scheduled in one request, which is the documented way around that limit.
- A community n8n node exists, and a Node.js SDK is available next to the plain HTTP API.
Our automation side links here: n8n places posts on the Postiz calendar through its API, while the Docker stack runs as its own Compose file.
What to watch
- When self-hosting, most platforms require the operator to register a developer app and set the keys; on the hosted version that is already done.
- Approval on the major networks can take a long time, and it repeats whenever a platform changes its permission model.
- Access tokens expire. The interface marks a channel that needs reconnecting, and a failed post is flagged with its error message.
- AGPL-3.0 carries a network copyleft: if a modified version is offered to others as a service, that modified source has to be made available. Running it unmodified for your own use creates no such obligation.
- Operating it means more than the Postiz container: a database, Redis and Temporal are part of the stack.
Further reading
At CyberElectro Postiz is the scheduler on our own server: our scheduled posts go out through it, and our n8n automations feed it.