A queue, a composer and a worker that posts at the right minute are a weekend of work for one person, and Bluesky, Mastodon, LinkedIn and X can all be reached with your own tokens. The cost is in the edges: every network needs its own developer app and keeps changing the rules, X charges per post (more with a link), and Instagram or TikTok publishing brings approval steps that a personal tool shouldn't plan on. You'd be trading $6 per channel for maintaining those connections yourself.
Before you buildBuffer Free already covers three channels with ten queued posts each. If that's enough, don't build anything.
Build me a personal social post scheduler to replace Buffer. Requirements: - Node.js 22 + TypeScript: a Fastify API and a React UI built with Vite. `npm start` serves http://localhost:4900 and runs a publish worker in the same process, checking every 30 seconds. - Storage: better-sqlite3 in ./data/social.db: accounts (network, handle, encrypted token), posts (text, media paths, scheduled_at in UTC, status draft / scheduled / sending / sent / failed, one result row per account) and weekly queue slots per account. Tokens are encrypted with AES-256-GCM using TOKEN_KEY from .env. Images go to ./data/media/. - One adapter interface, publish(post, account) returning the post URL, and four adapters: Bluesky (`@atproto/api`, app password), Mastodon (`masto`, instance URL and access token), LinkedIn personal profile (OAuth 2 with the w_member_social scope) and X (API v2 POST /2/tweets). X bills per post ($0.015, or $0.20 with a link), so show the cost in the UI. - Composer: one text box with a live counter per selected network (X 280, Bluesky 300, LinkedIn 3,000, Mastodon read from the instance), up to 4 images with alt text, per-network text overrides. - Scheduling: pick a date and time in TIMEZONE from .env, or "add to queue" to take the next free weekly slot. A week calendar view; drag a queued post to another slot. - Reliability: set status to sending before the API call so nothing is posted twice; retry failures three times (1, 5 and 30 minutes); a post stuck in sending after a crash waits for manual confirmation. - Single user. No accounts, no telemetry, local-first. The only outbound calls are to the four networks. - Out of scope: Instagram, TikTok, Facebook, YouTube, analytics, team approvals, AI writing. - README: how to get each token or developer app, the redirect URIs, and where the data lives.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Buffer.
Add evergreen recycling to the post scheduler in this folder. Requirements: - A "recycle" flag on any sent post, with a minimum gap in days (default 60). - When an account's queue has fewer than three posts waiting, copy the oldest eligible recycled post into the next free slot, never the same post twice within its gap. - A page listing recycled posts with when each last went out, and a pause switch. - Update the README.
Add a CSV importer to the post scheduler in this folder. Requirements: - `social import posts.csv` reads columns text, network and scheduled_at (ISO 8601); extra columns are ignored. - Rows with a future date become scheduled posts on the matching account; past dates become sent history marked as imported and are never re-published. - Print a preview of counts and rows that couldn't be mapped; require --yes to write. - Update the README with how to prepare the CSV by hand from Buffer's Ideas and queue.
Add post statistics to the scheduler in this folder. Requirements: - A nightly job that, for posts sent in the last 30 days, fetches likes, replies and reposts from Bluesky and Mastodon; skip LinkedIn and X and say why in the README. - Store one row per post per day and show a sortable table with a small SVG trend line. - Respect each API's rate limits and stop on the first 429. - Update the README.
The price buys relief from the plumbing. Each network's API, token expiry and review process is Buffer's problem, and a missed post is visible to the whole audience. A handful of channels at $5 or $6 each is cheaper than an afternoon lost to a broken token.
Estimate · The scheduler runs on a machine you have, or a $5 VPS. The only usage cost is X: 30 posts with links come to about $6 a month, and plain posts are $0.015 each. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | Up to 3 channels, 10 scheduled posts per channel, 100 ideas, 1 user, 30 days of Insights, 1 API key with 3,000 requests a month. |
| Essentials | $6 | $5 | Unlimited scheduled posts per channel (fair-use cap of 5,000), unlimited ideas, 1 user, unlimited Insights history, first-comment scheduling, channel groups, 3 API keys with 7,500 requests a month. |
| Team | $12 | $10 | Everything in Essentials plus unlimited users, per-channel access permissions, 5 API keys and 15,000 API requests a month. |
Free covers 3 channels with up to 10 scheduled posts per channel, 100 ideas and one user.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Direct publishing and reminders for Instagram, TikTok, YouTube and Facebook, where Buffer holds the integrations, Analytics (Insights) and the community inbox for replying to comments.
About $6 a month on the Essentials (per channel) plan, $72 a year (checked 2026-10-14).
Direct publishing and reminders for Instagram, TikTok, YouTube and Facebook, where Buffer holds the integrations; Analytics (Insights) and the community inbox for replying to comments; A phone app, browser extension and Start Page; Approval flows and per-channel permissions for teammates; Someone else repairing the connection when a network changes its API. If any of those matter to you, keep paying.
Yes: Postiz (open source), Mixpost Lite (open source), BrightBean Studio (open source).