Schedules posts across the main social networks from one calendar. You write once, pick which accounts it goes to, and it publishes at the times you set — with a queue, draft approvals and per-post analytics afterwards.
Build me a social scheduler that replaces Buffer: one queue, several networks, posts that go out on time and a record of what each one did. STACK - Node 20+ with Fastify, server-rendered HTML - SQLite through better-sqlite3, WAL mode - A worker process for publishing, separate from the web process - Caddy in front THE DATA MODEL - accounts: id, network, handle, display_name, avatar_path, credentials_encrypted, token_expires_at, refreshed_at, is_active, limits_json - posts: id, body, media_ids_json, link, first_comment, created_by, created_at, status - targets: id, post_id, account_id, scheduled_for, status, attempts, external_id, external_url, published_at, error, network_body — one row per network per post, because the same words are not the same post everywhere - media: id, path, sha256, kind, width, height, duration_ms, alt_text, bytes - queues: id, account_id, weekday, time_local, position — the slot schedule - metrics: id, target_id, kind, value, collected_at — append-only, so a number is never overwritten - Every instant in UTC, with the account's own zone kept for display CONNECTING NETWORKS, WHICH IS THE HARD PART AND THE HONEST WARNING - OAuth per network, tokens encrypted at rest, refresh handled with a lock so two workers never refresh at once and invalidate each other - Each network needs a developer application, and several need a review before they will let you post on a user's behalf. Some restrict posting to business accounts. Say this at the top of the README, because it is the wall this project actually hits — not the code - Every network adapter implements the same small interface: validate a draft, publish, fetch metrics, and describe its limits. Networks change; keep the adapter thin and the shared code ignorant of them - Per-network limits declared as data: character count, how it is counted, media count, aspect ratios, file size, video length, whether a link is separate, whether alt text is supported COMPOSING - Write once, then per-network overrides in tabs, with a live preview of each at the size it will appear - Validation before scheduling, not at publish time: too long, too many images, an unsupported ratio, a missing alt text if you have made that required - Threads where the network supports them, as an ordered list of parts - A first comment, scheduled with the post, where that is how links are handled - Alt text on every image, with the interface refusing to schedule without it if you turn that on — it costs nothing and it is the difference between a considerate account and a careless one THE QUEUE - Slots per account per weekday; adding a post to the queue puts it in the next free slot - Drag to reorder, shuffle, pause an account, and a holiday mode that pauses everything - A calendar view across accounts, and a list view for the next fortnight - Best-time suggestions computed from your own past engagement, and labelled as what they are — a weak signal from a small sample, not a science PUBLISHING RELIABLY - The worker claims a target with a lease, publishes, and records the external identifier in the same transaction as the status change - Idempotency: a network that returns a timeout may still have published. Before retrying, check for the post by a client-side identifier or by searching the recent timeline. Duplicate posts are the failure that embarrasses an account publicly - Retries with backoff for transient errors, never for a validation error - A failed target alerts by email with the network's own message - Rate limits respected per account, with the network's headers honoured APPROVALS - Draft, needs approval, approved, scheduled, published, failed - A reviewer sees a preview per network and approves or returns with a note - Nothing publishes from the needs-approval state, ever, by any path METRICS - Collected on a schedule after publishing — an hour, a day, a week — and appended, never updated - Impressions, engagements, clicks where the network gives them; absent where it does not, and shown as absent rather than as zero - Per post, per account, per network, over time, computed at query time - Link clicks through your own short domain, so clicks are yours even when a network will not tell you OPERATIONS - .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, ENCRYPTION_KEY, SESSION_SECRET, SMTP_URL, per-network client ids and secrets - Migrations on boot, each once - Nightly backup off the machine, restore script - Health endpoint reporting the oldest due target and any account with an expiring token WHAT MATTERS MOST Idempotent publishing and per-network validation. Build the lease, the duplicate check and the limits table before the calendar looks nice, then pull the plug on the worker mid-publish and confirm you get one post rather than none or two. Give me the repository, one network adapter implemented fully, migrations, .env.example, and a README with deploy steps behind Caddy and the application-review situation for each network stated plainly.
What you lose
- Someone else keeping up with each network's API changes, which break constantly
- Approved API access and the higher rate limits that come with an established app
- Mobile apps for posting and approving from a phone
- Cross-network analytics normalised into comparable numbers
- Preview rendering that shows how a post will actually look on each network
If you would rather not build
- Ayrshare — API-first posting service, if you would rather integrate than host
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $5/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
$0Schedules and publishes to the main social networks, with a calendar and team approval.
gitroomhq/postiz-appfree · open source
Mixpost
$0Social scheduling for the main networks, with drafts and a posting calendar.
inovector/mixpostfree · open source
Why this verdict
our own opinion · changed only by a person
80/100
Verdict yes at 80: the scheduler, queue and retry logic are straightforward, and self-hosting removes per-channel pricing entirely. The score reflects that the code is easy but the API integrations need ongoing maintenance you are taking on yourself.
History
tracked since 6 Aug 2026 · nothing is ever overwritten
Questions about Buffer
answered from the record above
Is Buffer free?
No — the plan we track is $5 a month. Essentials, $5 per channel per month billed yearly ($60/yr per channel). Monthly billing costs more, and the bill scales with the number of connected channels rather than with usage.
Can you replace Buffer by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 80 out of 100, build time one session. Read what you lose before you decide.
How much does Buffer cost?
$5 a month on Essentials — $60 a year. Recorded 6 Aug 2026.
What do you lose by replacing Buffer?
Someone else keeping up with each network's API changes, which break constantly; Approved API access and the higher rate limits that come with an established app; Mobile apps for posting and approving from a phone; Cross-network analytics normalised into comparable numbers; Preview rendering that shows how a post will actually look on each network. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Buffer?
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

