Self-hosted social scheduler for Mastodon, Bluesky, LinkedIn, Threads and X.
Write a draft, customize it per platform, then publish it now or schedule it.
Install · Documentation · API · Contributing
cogsend-trailer.mp4
Hosted schedulers usually charge per channel and keep your posts and tokens on their servers. CogSend runs on your own Cloudflare account instead: your data stays in your own D1 database and R2 bucket, posts go out through your own API credentials, and there is no subscription to keep paying.
- Thread editor: one card per post, images with alt text, and a tab per platform for tailored versions
- Auto-split: paste a long draft and it becomes a thread that fits every platform you picked
- Publish or schedule: see results per account, then cancel, reschedule or retry from Posts
- Automatic retries: temporary failures retry on their own, up to five attempts
- Insights: published against failed over 7, 30 or 90 days, and why posts failed
- Link previews: cards for URLs in a post
- Secure by default: encrypted credentials and 2FA on the admin account
- API access: a personal key for scripts and Shortcuts
A single-admin instance normally stays within Cloudflare's free plans, though R2 needs a payment method on file. The Workers free plan allows five cron triggers per account, shared with every Worker you run; if none are left, an external pinger drives the schedule instead (Scheduling). On the free plan a backlog of due posts drains a post or two a minute, and a paid Workers plan publishes everything due at once.
Needs Node 22.12+ and a Cloudflare account with Workers, D1 and R2 available.
git clone --depth 1 https://github.com/deepakness/cogsend.git cogsend
cd cogsend && npm install && npm run setupsetup creates the Cloudflare resources, your admin account and the secrets, deploys, and prints your URL. Sign in there, scan the QR with an authenticator app and save the backup codes. It is safe to re-run; docs/deploy.md lists every step and flag.
Next, connect your accounts. Mastodon and Bluesky work straight away; LinkedIn, Threads and X need an OAuth app first.
git pull && npm ci && npm run deploy:releasedeploy:release runs the tests, applies migrations, builds and deploys. Your data is in D1 and R2, not in the checkout, so a pull cannot touch it. Settings → Instance and npm run doctor both report the running version and say when a newer release is out; docs/deploy.md → Updating covers release tags and rolling back.
Also published, with search, at cogsend.com/docs.
Get started
- Deploying: the install and its flags, checking it worked, updating and rolling back
- OAuth apps: LinkedIn, Threads and X app setup, and what each platform allows
- Connecting accounts: connecting, reconnecting and disconnecting accounts
Use it
- Writing and publishing: threads, per-platform overrides, images and alt text, scheduling
- Posts and Insights: the queue, what each post can do, and the delivery stats
- API: personal API keys and worked examples (the full reference is in-app at
/api)
Run it
- Configuration: secrets, the instance name,
APP_URL, the login and recovery - Scheduling: the cron trigger, the free-plan trigger limit, external pingers, failure emails
- Domains and URLs: the workers.dev URL, a custom domain, changing the hostname
- Cloudflare Access: putting an extra gate in front of an instance
- Backups: D1 Time Travel, exporting the database, copying the bucket
- Troubleshooting: the errors people actually hit, and what fixes each
- Development: local setup, the checks that must pass, code expectations
SvelteKit 2 and Svelte 5 on Cloudflare Workers with Static Assets, D1 (SQLite) via Drizzle, and R2 for media.
docs/development.md has local setup and the checks that must pass; CONTRIBUTING.md has the pull-request rules. Report security issues privately, as SECURITY.md describes.
If CogSend is useful to you, sponsoring supports my time maintaining it.
MIT, see LICENSE. Third-party notices are in THIRD-PARTY-NOTICES.md.
