An open-source social media scheduler covering a dozen platforms, with a calendar, a team workflow and a self-hosted option.
Build me the social scheduler I actually need instead of a hosted Postiz: a calendar, several platforms, and posts that go out once. Read this first: Postiz is open source and self-hosting it is a real answer — the fee buys hosting and, more importantly, applications already approved for publishing. That approval is the wall this project hits, and it is administrative rather than technical. Read the next section before writing any code. THE APPLICATION PROBLEM - Every platform requires a developer application, and several require a review before it may post on a user's behalf. Some restrict posting to business accounts, some charge for the tier that allows it, and some have removed the capability entirely for small applications - Check, for each platform you actually need, whether an independent developer can still get publishing permission today. Do that first. If the answer is no for the platform that matters to you, this project cannot succeed however good the code is - Write what you find in the README, with dates, because it changes STACK - Node 20+ with Fastify, server-rendered HTML - SQLite through better-sqlite3, WAL mode - A worker for publishing, separate from the web process - Caddy in front THE DATA MODEL - channels: id, platform, handle, display_name, avatar_path, credentials_encrypted, token_expires_at, refreshed_at, is_active, limits_json - posts: id, body, media_ids_json, link, created_by, created_at, status, approval_state - targets: id, post_id, channel_id, scheduled_for, status, attempts, client_key, external_id, external_url, published_at, error, platform_body — one row per channel, because the same words are not the same post everywhere - media: id, path, sha256, kind, width, height, duration_ms, alt_text, bytes - slots: id, channel_id, weekday, time_local, position — the recurring queue - metrics: id, target_id, kind, value, collected_at — append-only, so a number is never overwritten - Every instant UTC, with each channel's own zone kept for display PUBLISHING WITHOUT DUPLICATES - The worker claims a target with a lease, publishes, and writes the external identifier in the same transaction as the status change - Idempotency: a platform that times out may still have published. Before retrying, look for the post — by a client-side key where the platform supports one, otherwise by searching the recent timeline for a match. A duplicate post is a public embarrassment and the failure this product must not have - Retries with backoff for transient errors only, never for a validation failure - Rate limits per channel, honouring the platform's own headers - A failed target alerts by email with the platform's message verbatim PER-PLATFORM LIMITS AS DATA - Character count and how it is counted — a link may cost a fixed number of characters regardless of length, and an emoji may count as two - Media count, accepted types, aspect ratios, file size, video length and codec - Whether threads are supported, whether a first comment is possible, whether alt text is accepted - All declared per platform in one table, and validated at scheduling time rather than at publish time. Finding out at 09:00 that a post is four characters too long is the thing to prevent COMPOSING - Write once, then per-platform overrides in tabs, each with a live preview at the size it will actually appear - Threads where supported, as an ordered list - Alt text on every image, with an option to refuse scheduling without it. It costs nothing and it is the difference between a considerate account and a careless one - A link shortened through your own domain, so clicks are yours even when a platform will not tell you THE CALENDAR AND THE QUEUE - Slots per channel per weekday; adding to the queue fills the next free slot - Drag to move, shuffle, pause a channel, and a holiday mode that pauses everything - A month calendar across channels, and a list of the next fortnight - Bulk import from a CSV for a campaign APPROVALS - Draft, needs approval, approved, scheduled, published, failed - A reviewer sees the preview per platform and approves or returns with a note - Nothing publishes from needs-approval by any path, ever METRICS - Collected on a schedule after publishing — an hour, a day, a week — and appended, never updated - Absent where a platform does not provide them, and shown as absent rather than as zero - Per post, per channel, per platform, computed at query time - Link clicks from your own short domain, which is the one number nobody can take away OPERATIONS - .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, ENCRYPTION_KEY, SESSION_SECRET, SMTP_URL, per-platform client ids and secrets - Migrations on boot, each once - Tokens refreshed under a lock so two workers cannot invalidate each other - Nightly backup off the machine, restore script - Health endpoint reporting the oldest due target and any channel with an expiring token WHAT MATTERS MOST The application review, then idempotent publishing. Confirm you can actually get permission to post before writing the scheduler, then build the lease and the duplicate check and pull the plug on the worker mid-publish to prove you get one post rather than none or two. Give me the repository, one platform adapter implemented fully, migrations, .env.example, and a README with deploy steps behind Caddy and the current application situation for each platform.
What you lose
- A dozen platform integrations somebody keeps working as each one changes
- Registered applications with publishing permission already approved
- A hosted instance with upgrades
If you would rather not build
- Buffer, if you would rather not deal with app review
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $29/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Postiz
$0The product itself, self-hostable with Docker Compose.
gitroomhq/postiz-appfree · open source
Mixpost
$0Self-hosted social scheduling with a calendar and team accounts.
inovector/mixpostfree · open source
Why this verdict
our own opinion · changed only by a person
82/100
Verdict yes at 82, with the honest caveat that the software is the easy half — platform app review is what takes the time.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Postiz
answered from the record above
Is Postiz free?
No — the plan we track is $29 a month. Standard from around $29/month billed monthly on the cloud; the software is free to self-host.
Can you replace Postiz by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 82 out of 100, build time one session. Read what you lose before you decide.
How much does Postiz cost?
$29 a month on Standard — $348 a year. Recorded 10 Aug 2026.
What do you lose by replacing Postiz?
A dozen platform integrations somebody keeps working as each one changes; Registered applications with publishing permission already approved; A hosted instance with upgrades. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Postiz?
Yes: Postiz, Mixpost. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

