DEV Community

Jamie Barton
Jamie Barton

Posted on Edited on

A Buffer clone is a cron job and a pile of OAuth apps

When we started building Orbitwrite, I thought a Buffer clone was a cron job and a handful of OAuth apps. You keep a posts table with a scheduled_at column, run a job every minute and call each network's API when a row comes due! 🤣

The cron job was the easy bit for the PoC. Everything else arrived one network at a time.

Most networks want their own OAuth app, their own review process and their own idea of how a refresh token behaves. Each one is a small project, and none of them finish when the first post goes out, because tokens expire, scopes change and someone always needs to reconnect.

Media came next.... TikTok refuses video under 23 frames per second, so a 15 FPS screen recording looks fine when you schedule it and fails when the job runs, hours after you've stopped thinking about it. Every network has a handful of rules like that, and I want a post to tell me about them while I'm still writing it.

Then the quotas!! LinkedIn gives one app a small daily allowance that every connected account shares, and X bills reads by the call, so checking for replies has a price you plan around. A thread that fails on its third post has already published the first two, and a publish that timed out may have gone through before the connection dropped, so retrying it posts the same thing twice.

That's most of what Orbitwrite is today. It publishes to X, LinkedIn, Bluesky, Mastodon, Threads, Instagram, Facebook, TikTok, YouTube, Discord, Slack and Telegram, and the web app is one client of a public API. The CLI, the SDK and an MCP server are the others. They all run through the same permission checks, platform limits and approvals, so a post from a script behaves like one from the app.

The CLI is the shortest path: npx @orbitwrite/cli post "Shipped it." --all --next sends a post to every channel at the next free slot in your schedule.

The MCP server is the one I'd point most people at. Add https://mcp.orbitwrite.com/mcp to Claude or ChatGPT as a custom connector, sign in, and ask for the work in plain words: draft a post about the new docs for each channel, score it, and suggest the next free time. The agent has over a hundred tools and sees your channels by name and handle, with the tokens behind them kept on our servers. It follows the same approvals your team does, so a member who needs sign-off to publish can only schedule behind a review.

If you're halfway through your own scheduler, keep the cron job. Point it at the API and let us look after the OAuth apps.

Top comments (0)