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.
Single-tenant: one admin account, on your own Cloudflare account, with your own provider credentials.
Install · Updating · Features · Documentation · Stack · Deploy guide · API · Contributing · Security
cogsend-trailer.mp4
- Thread editor: one card per post, images with alt text, a Global tab plus a tab per platform
- Pasting a long draft splits it into a thread that fits the tightest platform you selected, counted each platform's own way (graphemes, Mastodon's URL weighting)
- Link preview cards for URLs in a post
- Publish now with per-destination results, or schedule; cancel, reschedule and retry from Posts
- Retryable failures back off on their own — five attempts, then they park in Failed
- Insights: published against failed over 7, 30 or 90 days, per-account stats and why posts failed
- Disconnecting an account removes its scheduled posts, returns drafts that were still waiting, and keeps published history
- Credentials encrypted at rest (AES-256-GCM), with 2FA on the single admin account
- Personal API key for scripts and Shortcuts (
Settings → API access)
Needs Node 22.12+ and a Cloudflare account with Workers, D1 and R2 available. R2 asks for a payment method on file even on the free tier.
git clone --depth 1 https://github.com/deepakness/cogsend.git cogsend
cd cogsend && npm install && npm run setupsetup is the whole install: wrangler login, the D1 database and the R2 bucket,
the secrets, your admin account, the migrations, the deploy, then one sign-in
against the live Worker to prove it works. Open the URL it prints, sign in, and
scan the QR with an authenticator app — and save the backup codes.
It is safe to re-run: resources, secrets and the account are reused, not replaced.
npm run setup -- --dry-run prints the plan without changing anything, and
docs/deploy.md lists what it does and every flag. Lost the password or the authenticator later?
npm run admin:reset -- --all from your checkout
(Configuration → The login).
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.
| Page | What is in it |
|---|---|
| Deploying | the install and its flags, checking it worked, updating and rolling back, deploying by hand |
| Configuration | secrets, the instance name, APP_URL, keeping your deployment separate from upstream, the login and recovery |
| OAuth apps | LinkedIn, Threads and X app setup, and what each platform allows |
| Cloudflare Access | putting an extra gate in front of an instance |
| Domains and URLs | the workers.dev URL, a custom domain, and what to update when the hostname changes |
| Writing and publishing | the composer: threads, overrides, images and alt text, publishing and scheduling |
| Posts and Insights | the queue and what each post can do, and the delivery stats |
| Connecting accounts | connecting, reconnecting and disconnecting accounts |
| Scheduling | the cron trigger, the free-plan trigger limit, external pingers, failure emails |
| API | personal API keys and worked examples (the full reference is in-app at /api) |
| 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 + Svelte 5 on Cloudflare Workers with Static Assets, D1 (SQLite) via
Drizzle, R2 for media, and a per-minute cron trigger — or any external cron
calling /api/internal/tick.
docs/development.md has local setup and the checks that must pass; CONTRIBUTING.md has the pull-request rules. Security issues: SECURITY.md — report them privately.
MIT — see LICENSE. Third-party notices are in THIRD-PARTY-NOTICES.md.
